W poprzednim wpisie przedstawiłem Wam projekt OpenMoko oraz oparty na nim telefon - Neo FreeRunner opisując jego wygląd zewnętrzny. Tym razem czas na opis tego, co znajduje się w środku. Ten wpis będzie typowo techniczny i bez obrazków, więc jeśli nie interesują Cię takie sprawy, możesz go pominąć. :-)
Szybki rzut oka na specyfikację: na pokładzie FreeRunnera znajduje się procesor Samsung SC32442B (architektura ARMv4) taktowany zegarem 400 MHz. Do dyspozycji mamy 128 MB pamięci RAM. Karta graficzna to Smedia Glamo 3362, pozwalająca na odtwarzanie MPEG-4 w rozdzielczości 352×288 z prędkością 30 fps, przy 640×480 osiąga 12 fps. Pamięć masową zapewnia 256 MB dysk NAND flash, wbudowany w telefon, oraz możliwość włożenia dysku MicroSD o pojemności jak dotąd do 4 GB (SDHC). Dzwięk wydobywa się z karty dzwiękowej Wolfson Microelectronics WM8753. Z ciekawszych urządzeń - w telefon wbudowane są dwa akceleromety, w dolnej oraz górnej części obudowy, pozwalające na orientację w przestrzeni; mamy też wbudowany odbiornik AGPS. Na liście życzeń projektu OpenMoko pojawił się pomysł wstawienia do telefonu magnetometru (inaczej cyfrowego kompasu), co pozwoliłoby na możliwość szybkiego ustalania położenia i kierunku poruszania się, przynajmniej na powierzchni planety Ziemia. ;-)
Ale na razie dość suchych opisów, wszystko i tak jest dostępne na wiki projektu OpenMoko. Pokażę Wam zamiast tego zrzut kilku interesujących komend. Wszystkie informacje zebrałem na dystrybucji Debian GNU/Linux uruchomionej na FreeRunnerze (o czym później). Na początek klasyk, czyli cat /proc/cpuinfo:
Processor : ARM920T rev 0 (v4l)
BogoMIPS : 199.47
Features : swp half thumb
CPU implementer : 0x41
CPU architecture: 4T
CPU variant : 0x1
CPU part : 0x920
CPU revision : 0
Cache type : write-back
Cache clean : cp15 c7 ops
Cache lockdown : format A
Cache format : Harvard
I size : 16384
I assoc : 64
I line length : 32
I sets : 8
D size : 16384
D assoc : 64
D line length : 32
D sets : 8
Hardware : GTA02
Revision : 0360
Serial : 0000000000000000
Jak widać, opisywany telefon ma po zaokrągleniu ~200 BogoMIPSów. Zgodnie z BogoMIPS Mini-HOWTO daje nam to prędkość na poziomie mniej-więcej Intel Pentium 100. Niestety, rzeczywistość nie jest aż tak różowa - w FreeRunnerze zastosowano procesor o architekturze ARM, poza tym brak mu FPU, co bardzo zmienia szybkość obliczeń w różnych sytuacjach.
Jedną z ciekawszych sytuacji tego typu jest czas szukania wszystkich liczb pierwszych przez które dzieli się dana liczba. Szukając informacji o FreeRunnerze w sieci trafiłem na łatwy do przeprowadzenia test wykorzystujący do tego celu komendę factor, obecną chyba w każdej implementacji Linuksa. FreeRunner w takim teście wypada dosyć blado:
freerunner:~# time factor $[65863223*65863159]
4337959928701457: 65863159 65863223
real 0m24.997s
user 0m24.965s
sys 0m0.015s
Brak FPU niestety daje się we znaki - FreeRunner nie przyda się tam, gdzie trzeba przeprowadzić dużo operacji na liczbach zmiennoprzecinkowych, jak łamanie szyfrów lub dużo grafiki 3D - chociaż, gdyby wykorzystać jakoś GPU karty graficznej… Cóż, zobaczymy w przyszłości, kiedy uda się uzyskać do niego pełen dostęp.
Czas na kolejną komendę, lshw, służącą do skanowania komputera i wyciągania informacji o jego poszczególnych składnikach (nadal na Debianie):
freerunner
description: Computer
width: 32 bits
*-core
description: Motherboard
physical id: 0
*-memory
description: System memory
physical id: 0
size: 123MiB
*-cpu
physical id: 1
bus info: cpu@0
*-network:0
description: Ethernet interface
physical id: 1
logical name: usb0
serial: xx:xx:xx:xx:xx:xx
capabilities: ethernet physical
configuration: broadcast=yes driver=ether driverversion=May Day 2005 firmware=s3c2410_udc ip=192.168.0.202 link=yes multicast=yes
*-network:1 DISABLED
description: Wireless interface
physical id: 2
logical name: eth0
serial: xx:xx:xx:xx:xx:xx
capabilities: ethernet physical wireless
configuration: broadcast=yes multicast=yes wireless=AR6000 802.11g
Daje to trochę informacji, ale coś jakby mało… Przynajmniej u mnie na laptopie jest tego dużo więcej. No to spróbujmy czegoś innego - hwinfo. Tym razem wyjście ma wielkość ~55 KB, dlatego nie wkleję go tu całego, tylko wystawię do ściągnięcia - zainteresowani znajdą tam całą informację o sprzęcie.
No to jedziemy dalej - postanowiłem sprawdzić jak system obciąża pamięć operacyjną i ile zostaje dla użytkownika. Na początek zedrzemy (prawie) wszystkie szaty i zobaczymy, ile minimalnie może zająć Linux. Poniżej wynik zatrzymania prawie wszystkich usług pod Debianem - drzewo prcesów uzyskane przy pomocy pstree:
init-+-dropbear---dropbear---bash---pstree
`-getty
dropbear to mały i lekki serwer/klient SSH2. Bez niego musiałbym zdać się na uruchomienie skryptu samodzielnie przez system - a na razie nie wiem jak to zrobić na czystym FreeRunnerze z wyłączonym atd oraz cron. :-) Więc zostawiłem go w pamięci, dzięki czemu mogę używać telefon przez SSH i połączenie sieciowe po USB. Oto, jak w takiej sytuacji wygląda wyjście komendy free:
total used free shared buffers cached
Mem: 126204 66060 60144 0 2308 55884
-/+ buffers/cache: 7868 118336
Swap: 0 0 0
7 MB zajętej pamięci, w tym około 5 MB przez same wątki jądra. Ale nie ma się z czego cieszyć - w takim stanie telefon jest nieużywalny: nie działa ekran dotykowy (jesteśmy w konsoli tekstowej), nigdzie nie zadzwonimy a potencjalni rozmówcy usłyszą tylko informację o niedostępności telefonu (demony obsługi sieci GSM są wyłączone). A więc czy właśnie zamieniłem swój telefon w “cegłę”? Wcale nie - nadal mogę połączyć się przez SSH i uruchomić usługi ponownie. Jednak w ramach testu wykonam reboot i zobaczę, ile zajmuje Debian gotów do pracy.
Po uruchomieniu Debiana z uruchomionym frameworkiem FSO zajętość pamięci nie wygląda już tak pięknie. Na początek wyjście pstree:
init-+-apmd
|-dbus-daemon
|-dropbear---dropbear---bash---pstree
|-frameworkd
|-fso-gpsd
|-getty
|-gsm0710muxd
|-hcid
|-udevd
`-xinit-+-Xorg
`-matchbox-window-+-matchbox-keyboa
|-ssh-agent
`-zhone
Mamy Xy, mamy dzwięk, mamy sterowanie zasilaniem (jak na razie częściowe), można dzwonić i odbierać rozmowy, a nawet śledzić swoją pozycję przy pomocy GPS, słowem - telefon w pełnej krasie. A to wyjście komendy free:
total used free shared buffers cached
Mem: 126204 91052 35152 0 1992 48968
-/+ buffers/cache: 40092 86112
Swap: 0 0 0
40 MB przeznaczone na podstawowe usługi telefonu, to chyba całkiem niezły wynik, zwłaszcza że aż dwa razy tyle (86 MB) przeznaczone jest dla kolejnych aplikacji. Oczywiście trzeba wziąć pod uwagę bufory dyskowe - ale Linux potrafi zarządzać nimi dynamicznie, więc można wziąć dość duży margines na swoje własne programy, powiedzmy… 70 MB. W podlinkowanym pliku przedstawiam wynik ps aux, dla zainteresowanych zajętością pamięci przez poszczególne procesy.
Dla porównania pokażę jeszcze zajętość pamięci z najstarszej dystrybucji którą mam zainstalowaną, czyli Om 2007.2. Na początek, zwyczajowo, pstree:
-sh: pstree: not found
Nie ma. :-) w tej dystrybucji (i innych korzystających z systemu pakietów opkg nie ma dość dużo narzędzi - albo nie zostały spakowane, albo nie mam odpowiednich repozytoriów… Posłużę się zatem ps auxwf i małą obróbką w vim:
init [5]
udevd –daemon
/sbin/portmap
/usr/sbin/dropbear
\_ -sh
\_ ps auxwf
\_ vim -
/usr/sbin/apmd
/usr/bin/dbus-daemon –system
/usr/sbin/hald
\_ hald-runner
\_ hald-addon-keyboard: listening on /dev/input/event0 [4]
/sbin/syslogd
/sbin/klogd
avahi-daemon
/sbin/hcid
/usr/sbin/gsmd
/usr/bin/pulseaudio
xinit /etc/X11/Xsession
\_ /usr/bin/Xglamo
\_ /bin/sh /etc/X11/Xsession
\_ run-parts /etc/X11/Xsession.d
\_ neod
\_ openmoko-today
\_ phone-kit
\_ matchbox-window-manager
\_ matchbox-panel-2
/sbin/getty 115200 ttySAC2
/sbin/getty 38400 tty1
/usr/bin/dbus-daemon
/usr/libexec/gconfd-2
/usr/bin/settings-daemon
matchbox-keyboard -d
/usr/libexec/e-calendar-factory
/usr/libexec/e-addressbook-factory
/usr/libexec/notification-daemon
Jest tutaj trochę więcej procesów, poza tym Om 2007.2 jest oparte na GTK2 i jest wyraźnie wolniejsze w obsłudze od nowszych dystrybucji na tą platformę. A jak wygląda zajętość pamięci? Oto wyjście free:
total used free shared buffers cached
Mem: 126292 94120 32172 0 400 57868
-/+ buffers/cache: 35852 90440
Swap: 0 0 0
5 MB mniej niż Debian z FSO (trochę gorszy wynik, jeśli liczyć większy cache dysku) - starsza wersja oprogramowania zajmuje mniejszą ilość pamięci, ale w zamian za to ma gorszy czas reakcji na działania użytkownika (oczywiście GTK2 także robi swoje). Moim zdaniem szybsza reakcja aplikacji w zamian za większe użycie pamięci jest tego warta. Dla zainteresowanych, do podejrzenia wynik ps aux z zajętością pamięci poszczególnych procesów.
Jaki polski test odbyłby się bez słynnej fujarki? :-) Kod, który wykorzystałem pochodzi z prawdopodobnie pierwotnej wersji skryptu:
#!/bin/sh
export LC_ALL=C
echo `uptime|grep days|sed 's/.*up \([0-9]*\) day.*/\1\/10+/’; cat /proc/cpuinfo|grep MHz|awk ‘{print $4″/30 +”;}’; \
free|grep ‘^Mem’ |awk ‘{print $3″/1024/3+”}’; df -P -k -x nfs | grep -v 1k | awk ‘{if ($1 ~ “/dev/(scsi|sd)”){ s+= $2} s+= $2;} \
END {print s/1024/50″/15+70″;}’`|bc|sed ’s/\(.$\)/.\1cm/’
Jako że telefon jest dosyć często wyłączany i ma niski uptime, długość “fujarki” szybko rośnie - zwykle zaraz po starcie mam ok. 10,2 cm przy dysku Flash 2 GB.
To na razie tyle zabawy z FreeRunnerem, robi się już późno. W następnym odcinku opowiem Wam o oprogramowaniu dostępnym na ten telefon, różnych jego dystrybucjach i o społeczności.