顯示具有 qemu 標籤的文章。 顯示所有文章
顯示具有 qemu 標籤的文章。 顯示所有文章

2007年6月29日 星期五

OLPC Hacking Meet-up心得

經過十天的等待,於於完成了這次「OLPC Hack Meet-Up Day」的活動。活動期間,感謝jollen、jserv、PingYeh、 Andrew、...等人提供不少對活動的經驗和建議。這段期間也感謝BV1AL、KC、olv、 FourDollars、linanne、aguai、wesley、thinker、yungyuc、gaso、yuren...等人的幫忙,才能順利將活動完成。

活動開始,先是由Mat簡單介紹一下如何用QEMU模擬OLPC和測試程式。之後則是共同開發和交流討論。21:10-22:00 則是展示時間,首先是jserv展示了QEMU用於模擬系統開發的各個應用,也現場展示了他最新的成果「親手打造Tablet / WebPad」。接著,FourDollars也跟著和大家分享影音串流程式最新的發展,分析未來的驅勢。並同時展示了一個他參考pcman的程式而改出來的影音外掛程式。可以非常方便的點選網路廣播並收聽,並發想也能整合進OLPC,提高OLPC的娛樂性。

而在PCMan on OLPC這個主題上,由國內開發LiveCD(USB)系列的BV1AL將gcinOLPC上的成果作成LiveCD的映像檔,並設定好網路等相關部分。而PCMan X開發團隊的字型好手olv ,則是解決OLPCPCMan X中文字型顯示的問題。在經過一段時間修改,順利將兩方的成果結合起來,如下:

雖然還是有許多小缺點,但這張快照也象徵了我們用行動來實踐我們的信念,也呼應了活動發起的訴求。

在活動期間,wesley、aguai、annelin... 也嘗試利用QEMU建立多個OLPC來模擬mesh network的測試環境。而Andrew、PingYeh、BV1AL、...在Tick偶然拿到OLPC實機的root console後,也著手研究了OLPC的系統更新、開機流程,相信不久之後也能見到相關的經驗分享。

最後希望能持續將這些成果整理出來,以開放的方式回饋給upstream和社群。

2007年6月27日 星期三

在Ubuntu / Debian上啟動kqemu加速OLPC的執行

Mat 已經寫了一篇簡單的文件「Hello World for OLPC」,只要照著做就可以很容易的把 OLPC 利用 qemu 模擬跑起來了。不過如果可以先把kqemu的kernel module裝起來的話,那麼執行OLPC的模擬會更加的快速順暢。以下簡單介紹Debian/Ubuntu上啟動kqemu的方法:

1. 首先把相關的套件裝好

# sudo aptitude install module-assistant
2. 然後利用module-assistant編譯出kqemu的kernel module並且安裝到系統中
# sudo module-assistant auto-install kqemu-source
3. 最後載入模組並建立裝置節點
# sudo modprobe kqemu major=250
# sudo mknod /dev/kqemu c 250 0
# sudo chmod 666 /dev/kqemu
然後就可以照著Mat寫的文件跟著做即可。

另外~ 目前OLPC底層的作業系統是Fedora Core 6 (zod),所以啦,知道FC6怎麼玩的,基本上OLPC也是一樣地玩。

2007年6月25日 星期一

模擬Linux on Palm 5

Palm產品家族自第五代開始,部份採用Intel Xscale處理器,日前qemu的CVS tree也正式納入支援,於是熱血的hackers又開始鑽研是否可模擬Palm 5的硬體,並在其上運作Linux。在一番嘗試後,Alex很高興跟大家宣佈這個訊息,請見「Testing Linux4Palm on qemu」一文。他在 Hack&Dev計畫 (目標即是將Linux移植到原本運作PalmOS的硬體環境) 的程式碼加入以qemu為基礎的Palm 5的硬體模擬器,目前支援的硬體列表如下:

  • palmtc - Palm Tungsten|C (PXA255)
  • palmz72 - Palm Zire72 (PXA270)
  • palmtx - Palm TX (PXA270)
  • palmld - Palm LifeDrive (PXA270)
取得與編譯方式如下:
# svn co https://hackndev.svn.sourceforge.net/svnroot/hackndev/qemu/trunk qemu-hnd
# cd qemu-hnd
# ./configure --target-list=arm-softmmu --cc=gcc-3.4
# make -j2
預先取得必要的核心與檔案系統影像檔,假設解開壓縮檔後位於./palm/0.0.3-fnw目錄,則可透過以下方式執行: (其中一個hardware model)
$ cat RUN.sh
#!/bin/sh
BASE_DIR=`pwd`/palm/0.0.3-fnw
./arm-softmmu/qemu-system-arm \
-M palmld \
-kernel $BASE_DIR/zImage \
-sd $BASE_DIR/Angstrom-opie-image-palmld-0.0.3-alpha.rootfs.ext2 \
-append "root=/dev/mmcblk0 psplash=false"
啟動畫面如下:
過程中可透過qemu作LCD panel與終端機顯示 (serial) 的切換,也就是 Ctrl-Alt-[13]。以下是終端機操作畫面:
系統模擬越來越多元了。

2007年6月21日 星期四

Hello World for OLPC

許多朋友好奇前天的螢幕快照怎麼來的,其實過程並沒有想像中的那麼難。小弟就以作一個Hello World的程式作範例。

在開始之前,先假設你手邊已俱備下列幾個主要的工具:

  • QEMU i386 ( OLPC的平台是x86 )

操作步驟如下:

1. 首先取得OLPC的映像檔:按這裡下載

2. 啟動qemu
qemu -redir tcp:2222::22 olpc-redhat-stream-development-devel_ext3.img
其中 "-redir tcp:2222::22"的意思是將 QEMU中的OLPC的:22 Port和本機端的:2222 Port接在一起。

3. 取得終端機

進入到OLPC視窗環境後,在OLPC的模擬環境按 “
Ctrl-Alt-3”,就會進到console模式(要回到視窗模式請按 “Ctrl-Alt-1” )。接著用root登入(預設沒有密碼),就可以順利取得root console。記得順便設定一下root的密碼

4. 下一步?

根據官網上的說明,下一步應該就可以直接連線進去,但是實際上卻不行,為什麼呢?因為這時候的OLPC還沒有將網路啟動,需要先設定網路才行。

5. 設定網路

在root console下執行
ifup eth0
或是
echo ifup eth0 >> /etc/rc.local
設成下次自動啟動

6. 確定啟動sshd
/etc/init.d/sshd start
執行到這裡,我們已經有能力可以連線到QEMU中的OLPC了。

7. 連線到OLPC
ssh -X -o NoHostAuthenticationForLocalhost=yes -p 2222 root@localhost
其中 "-X" 是設定視窗轉送的參數。(可以執行xterm看看,所產生的視窗會將送到本機端來)。進行到這裡,我們已經有操控整個OLPC系統的能力,可以像使用一般Linux的方式去使用。

8. 如何作一個最簡單的Hello World?

目前OLPC並沒有內建gcc等開發工具。不過uname一下,可以發現OLPC的平台是i686。也就是說,我們可以先在本機端開發好程式,編譯好了再上傳執行即可。

而在OLPC裡的視窗程式執行環境為gtk、pygtk。我們不妨利用現在的pygtk來作為試驗。在這裡我們就直接引用pygtk給的官方範例

9. 如何上傳?

最直接的方式就是透過scp的方式上傳。
scp -o NoHostAuthenticationForLocalhost=yes -P 2222 ./helloworld.py \ root@localhost:/home/olpc/hello_world.py
10. 如何執行:

由於OLPC的XWindow是用olpc這個使用者的身份執行。所以在執行前記得切換成olpc這個使用者
su - olpc
之後用視窗轉送的方式來執行
DISPLAY=:0.0 ./helloworld.py
就可以看到簡單的Hello World的畫面了

2007年6月16日 星期六

kboot初探與模擬驗證

kboot本質上是個小型Linux作業系統,但功能卻是個boot loader,何解?kboot本身提供簡單的系統工具,支援檔案與網路操作,可自外界取得kernel image或其他檔案,進而kboot利用了kexec的機制,讓Linux kernel可快速重新啟動,於是具備boot loader的功能。

kexec是一組新的系統呼叫,包含在2.6 kernel中 (視支援架構而定),搭配其user-space的工具kexec-tools,則可在既有的Linux kernel (支援kexec系統呼叫) 中載入其他的kernel (不需要有kexec支援),並給予必要之參數或檔案,如kernel command line與initrd等,這方面的資訊可參考以下文章:

目前,kexec的硬體支援不限定x86,包含ARM與PPC都已有patch現身。那麼,如此的機制到底有什麼價值呢?以往的boot程序是很單純,清一色就是boot loader載入kernel,然後跳到user-mode或者是特定的工作,但現在的系統設計往往不是單一硬體、單一架構就可勝任的,諸如RAID或高負載的備援系統設計,都需要相當繁複的規劃,很顯然就非普通的boot loader可以應付,也很難修改Etherboot去圓滿符合需求,這時候,我們聯想到Linux,搭配到上述的kexec,不就是最美妙的boot loader嗎?在載入新的kernel之前,我們可作任何Linux能做的事情,像是載入firmware並進行設定、掛載NFS、掛載NTFS (透過Linux-NTFS)、... 等等,只要能提供新kernel給kexec-tools工具作載入,最後再透過kexec系統呼叫,就可完成這個「功能強大的boot loader」的終極任務。

kboot就是這樣的概念驗證實做品,使用的情境相當多元。舉例來說,kboot想進行遠端開機 (Diskless),但只有Wireless LAN或3G network可用,這時候就掛載對應的kernel module (包附在kboot中),然後透過user-space的應用程式進行設定,等待連線建立並確保檔案擷取成功,接著就在裝置上執行自遠端取得核心。另一種情境也很有趣,以往Linux distribution都得作通用性與最佳化的妥協,前者往往得將系統劃分諸多核心模組與大量的設定程式,後者往往得針對硬體作多次嘗試,那麼,透過kboot可先啟動generic kernel,然後進行硬體偵測,參考所需的硬體與最佳化組態,重新編譯核心,最後將該核心載入,而這個過程可透過一些設計得當的效能評估工具,一次又一次的重複自動微調,有別於以往的boot loader。關於kboot的應用,可參考以下簡報:後者給予我們極大的想像空間,當我們在新的硬體進行核心與週邊移植時,的確可先把能運作的最低限度核心置入kboot,然後再從不同的開發分支取得新核心並啟動,而這些過程都是透明的,而且不需要燒錄到傳統儲存裝置中,只要資源允許,可在RAM中做到繁瑣的事情。

昨天做了一個小hack,將原本的kboot (Version 11) 進行調整,更動紀錄如下:
Enhancements:
. Provided qemu specific configurations for verifying kboot
. Enable Visibility for gcc-3.4 (symbol hidden)
. Perform size optimizations against user-space packages.
Upgraded:
. kernel - 2.6.21
. binutils - 2.17.50.0.16
. uClibc - 0.9.29
我們甚至不需要單獨的x86機器,就能測試kexec與kboot,只要有能夠運作Qemu的環境即可。首先,取得OrzLab修改的版本:kboot-11-orzlab.tar.bz2,解開後直接打 "make" 就會建構整個系統,包含下載必要的套件、工具,以及編譯與安裝等。搭載於kboot的Linux kernel是精簡的版本,只提供TCP/IP stack、procfs、initrd/initramfs、ne2k NIC driver、VESA VGA framebuffer console等,但足以讓我們作許多應用。

Qemu提供DHCP與TFTP server的模擬,完全省下我們佈署的難度,所以在模擬環境中,所需的操作甚至大幅少於實體。筆者提供了簡單的script名為 "qemu-launcher.sh",直接執行即可,kboot啟動後的畫面如下:
依據Qemu的操作文件,預設透過模擬的DHCP server取得的IP是10.0.2.15,而server自己則是10.0.2.2,上面的畫面展示kboot已經載入一個小型的Linux kernel並出現提示訊息,等待命令操作,我們可打一些指令如下:
看到kernel version 2.6.21與ping連線的狀況,除此之外,還有ssh/sshd可用,所以大可連線到某台server,重新編譯核心程式碼,然後放到某個網路伺服器上。接著我們就要來驗證kexec/kboot的功能。Qemu內建的TFTP server相當好用,直接對應於host上的目錄架構,而就Debian/Ubuntu來說,host的核心會在根目錄建立symbolic link,而vmlinuz與initrd.img就指向目前運作的核心與initrd。

於是,我們在模擬的環境只要下簡單的一行指令即可載入並重新啟動: (鍵入粗體字部份)
kboot: tftp://10.0.2.2/vmlinuz
然後我們會看到 "Start Kernel" 的字樣跳過,然後我們就在Qemu的模擬環境看到啟動目前host上的核心:
因為在之前提供的qemu啟動script中省略root file system的指派,所以會停在kernel panic的畫面,不過這也達到我們的目的,驗證kexec/kboot,有了這個便利的模擬測試環境,未來也可作不同的變化。

2007年5月23日 星期三

ARM模擬的狀態保存

前文「透過USB連線與OpenMoko模擬裝置互動」指出現在透過qemu來模擬openmoko已有相當便利的互動機制,我們也隨時可在Qemu Monitor中監看與控制虛擬機器的狀態,Andrzej Zaborowski最近實做了ARM模擬的狀態保存,所以現在可快速load/save vm,如此一來,應用程式的開發與驗證更加便利。目前也整合到openmoko-emulator中,取得最新的發展版本:

$ svn co https://OpenSVN.csie.org/openmoko_addons/openmoko-emulator
現在openmoko/run.sh這個script已處理qemu-img的操作,所以我們只要如往常一般編譯與執行即可。舉例來說,我們希望保存開機完成、見到整個OpenMoko UI的狀態,那麼只要按下Ctrl-Alt-2以切換到Qemu Monitor畫面,在提示符號下先暫停虛擬機器的系統模擬動作:
(qemu) stop
接著就可以保存狀態:
(qemu) savevm mainwindow
參數 "mainwindow" 只是一個識別名稱,事實上我們可以在不同的狀態給予特定的識別,這時候我們可以結束虛擬機器的執行:
(qemu) quit
然後我們重新啟動openmoko-emulator (run.sh),立刻切換到Qemu Monitor,隨後在命令提示打入指令以查看保存的狀態:
(qemu) info snapshots
應該會得到類似以下的輸出:
Snapshot devices: mtd
Snapshot list (from mtd):
ID TAG VM SIZE DATE
1 mainwindow 22M 2006-05-23 11:11:35
要還原已保存的狀態相當直覺,只要打下指令:
(qemu) loadvm mainwindow
再按鍵Ctrl-Alt-1切回執行畫面,這時候就可以看到上次我們保存的狀態與畫面了,當然,配合前次提到的Linux gadgetfs,我們還可存取USB (emulated) network,這樣進行應用程式開發的彈性也提昇許多,若再引入自動化的機制,未來要實做「時光機器」也是相當可行的。

2007年5月19日 星期六

透過USB連線與OpenMoko模擬裝置互動

前幾篇文章介紹如何透過qemu來模擬openmokoPoky,這部份的開發逐漸穩定,而qemu現在對於硬體的模擬也頗完整,很多時候我們可直接指定Ethernet模擬來作PXE/BOOTP/TFTP開機或DHCP,於是Host與(Emulated) Target互動就相當簡單。但,如果是openmoko Neo1973/GTA01這類沒有Ethernet (頂多只有Wifi或Bluetooth)的硬體裝置,該如何互動呢?最近加入USB gadget模擬的支援,可將USB slave轉包到Linux 2.6的gadgetfs,如此一來,我們就可建立USB (emulated) network,兩端也可用NFS或sshfs來作檔案分享存取。

在Ubuntu 7.04上操作的方式如下,注意,建議使用一般權限進行,並善用sudo的機制。

取得Linux Kernel原始程式碼:

$ apt-get install linux-source-2.6.20
解開檔案並給予目前的組態:
$ cd /usr/src
$ tar jxf linux-source-2.6.20.tar.bz2 && cd linux-source-2.6.20
$ cp /boot/config-`uname -r` .config
因為Ubuntu預設的USB Gadget/Peripheral controller是實體裝置,但我們需要dummy_hcd (Dummy/Loopback USB host and device emulator driver),所以我們得調整設定:
$ patch -p0 < dotconfig_dummy_hcd.patch
然後建構我們需要的核心模組:
$ make MODVERDIR=drivers/usb/gadget \
drivers/usb/gadget/dummy_hcd.ko \
drivers/usb/gadget/gadgetfs.ko
順利的話就會有兩個 .ko檔,接著就安裝:
$ sudo insmod drivers/usb/gadget/dummy_hcd.ko
$ sudo insmod drivers/usb/gadget/gadgetfs.ko default_uid=`id -u`
Host端需要一個名為/dev/gadget的目錄,以掛載gadgetfs:
$ sudo mkdir -p /dev/gadget
$ sudo mount -t gadgetfs gadget /dev/gadget -o noauto,user,group
核心的部份告一段落,接著我們要來建構qemu,取得最新的openmoko-emulator:
$ svn co https://OpenSVN.csie.org/openmoko_addons/openmoko-emulator
編譯時期需指定kernel header (Ubuntu預設沒有打包全部USB gadget的header):
$ cd openmoko-emulator
$./configure --cc="gcc-3.4 -I/usr/src/linux-source-2.6.20/include"

在最後一行輸出應該要有以下字樣:
USB Gadgetfs support yes
接著就打 "make",順利的話會在arm-softmmu目錄產生名為qemu-system-arm的執行檔。我們可透過script自動下載u-boot、kernel,與rootfs等images並「燒」入我們的模擬硬體中,操作如下:
$ ./openmoko/download.sh
$ ./openmoko/flash.sh
正確的話,畫面會提示run.sh的script檔案被生成,咱們就來跑看看:
$ ./openmoko/run.sh
操作方式在前文「OpenMoko/Neo1973硬體模擬」已提及,不贅述。等X Window的畫面都出現後,就是運用gadgetfs的時機。按下Ctrl-Alt-2組合鍵切入Qemu Monitor,我們可監控與管理Qemu的狀態,當我們打入"info usbslave"指令時,應該有如下的輸出:
USB2.2 device 1457:5122:
Manufacturer: Linux 2.6.20.7-moko8/s3c2410_udc
Product: RNDIS/Ethernet Gadget
Configuration 0: RNDIS
Configuration 1: CDC Ethernet
因為openmoko在啟動X的時候會順便將USB network帶起,這時候我們就可透過gadgetfs去讓Host與(emulated) target互動。同樣在Qemu Monitor畫面,打入 "usb_add gadget:1" 指令,若無錯誤訊息,表示已成功。在Host上的終端機檢查USB gadgetfs的狀態:
$ lsusb -v | grep -A10 -B12 s3c2410
應該會有以下輸出:
Bus 004 Device 003: ID 1457:5122
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 2.00
bDeviceClass 2 Communications
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 64
idVendor 0x1457
idProduct 0x5122
bcdDevice 2.12
iManufacturer 1 Linux 2.6.21.1-moko8/s3c2410_udc
iProduct 2 RNDIS/Ethernet Gadget
iSerial 0
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 80
bNumInterfaces 2
bConfigurationValue 1
iConfiguration 7 CDC Ethernet
這時候就可透過CDC Ethernet操作USB network,openmoko在啟動該裝置時就設定IP與route,所以我們只要在Host設定必要的網路組態,即可連線到模擬的裝置:
$ ifconfig usb0 inet 192.168.0.200 netmask 255.255.255.0
$ ssh root@192.168.0.202
順利的話就會看到命令提示畫面:
root@fic-gta01:~$
當然,拿到shell後,什麼事情都可以作。

注意,在關閉openmoko-emulator前,請切換到Qemu Monitor,並打入"usb_del gadget"的指令,要求將gadgetfs的存取關閉,否則很可能會kernel panic。這時候Host的dmesg輸出應該類似以下:
[ 4751.700000] dummy_udc dummy_udc: unregister gadget driver 'gadgetfs'
[ 4751.700000] gadgetfs: disconnected
[ 4751.700000] dummy_hcd dummy_hcd: port status 0x00010100 has changes
[ 4751.700000] dummy_hcd dummy_hcd: port status 0x00010100 has changes
[ 4751.700000] usb 4-1: USB disconnect, address 3
[ 4751.700000] usb0: unregister 'cdc_ether' usb-dummy_hcd-1, CDC Ethernet Device
[ 4753.856000] usb usb4: dummy_bus_suspend
另外,Win32的USB redirection實做我也開始進行,希望不久後也可在Win32進行openmoko的模擬與開發工作。本文內容僅供參考與進度展示,後續的更新會發佈於openmoko官方的wiki: OpenMoko_under_QEMU

2007年5月7日 星期一

DIET-PC的ARM移植

注意DIET-PC專案有一段時間了,當我還在老東家作Linux thin-client時就耳聞此專案,不過因為某種原因,一直沒有嘗試。以下是DIET-PC 網頁上提供的簡介:

DIET-PC (DIskless Embedded Technology Personal Computer) is a Do-It-Yourself open source thin client software kitset, allowing IT professionals to construct generic- or special-purpose thin clients, or other network appliances, using commodity x86 PC or PowerPC Mac hardware. Experimental support is also available for ARM hardware.
雖然是單人計畫,但規模也日益增加,現在也提供ARM與PowerPC的移植。與其他Thin client或嵌入式計畫不同之處是,儘管「小而美」是重要訴求,但DIET-PC並沒有因此改用uClibcdietlibc,而是採用GNU C Library與Xorg,保持PC上的相容性。DIET-PCARM移植版本所採用的參考硬體是Hot-e HL200,這是ARMv4t/ARM920T的架構,也可以透過qemu去模擬執行。取得相關的檔案後,透過以下方式去啟動系統:
qemu-system-arm \
-M integratorcp926 \
-kernel zImage.integrator \
-initrd initrd.img \
-append "ramdisk_size=20480 root=/dev/ram0 rw ip=dhcp" \
-redir tcp:2222::22 -redir tcp:5910::5910
以qemu提供的user mode network stack轉向功能,將模擬環境的port 22 (SSH)對應到host的port 2222、port 5910則是VNC port。root帳號與VNC密碼都是"foobar",系統啟動後,會執行Xvnc,於是可透過VNC client去操作DIET-PC,以下是執行畫面:

視窗管理程式與桌面是我熟悉的Qvwm,執行中的應用程式是RDP (Windows Terminal Service)程式rdesktop,整體來說,這是個很精巧的系統。

2007年4月16日 星期一

OpenMoko/Neo1973硬體模擬::Win32平台

紀錄「OpenMoko/Neo1973硬體模擬」後,收到許多迴響,cclien兄還因此徹夜未眠、提交patch,Jollen兄也寫了一篇「qemu-neo1973 / openmoko-emulator / jk2410-emulator」,分享Jollen-Pro Kit! (based on S3C2410)的硬體模擬,而前幾天則在通信論壇看到更紗的post「openmoko on winxp」,讓我也對Win32的移植感興趣。趁OSDC.tw結束的空檔,也來改看看,似乎沒遇到什麼問題,於是打包一個執行檔: openmoko-emulator-win32-bin-20070416.zip
已將昨天建構的u-boot、Linux kernel,以及rootfs等image置入,以下是執行畫面:
基本上解開Zip壓縮檔案後,直接跑qemu-system-arm.exe即可,模擬器外觀的支援還沒整合進去,但仍可從附帶的command window看到LCD Panel與GSM的資訊,同樣是按Enter鍵切換選單項目,Space鍵選擇。

附帶一提,OpenMoko/Neo1973的模擬器UI與GNU gdb整合的程式碼我已經作一段落,但現在遇到個非技術議題,因為該裝置是狹長型,而LCD Panel (VGA解析度)下上方都有頗大的空間,所以一旦模擬器的外觀載入後,就會超過螢幕解析度,勢必得作些裝置外觀的調整,所以可能需要美工專長的朋友協助。

2007年4月5日 星期四

OpenMoko/Neo1973硬體模擬

上個月底有幸能與OpenMoko團隊互動,做了簡要的紀錄「遇上OpenMoko」,雖然語焉不詳,但心中的感動實在是很難一語道盡的。週二去竹科替某單位進行教育訓練後,技術交流的過程讓我有種感觸,為數眾多的開發工具往往給予我們頗大的挫折感,就如以前聽過的一句話:「現代人的問題不在於沒有工具、缺乏資源,相反地,資源五花八門、工具也多到令人無所適從」,我想,針對嵌入式系統開發與整合的OrzLab,應該提出一些解決方案,就如之前提過的「視覺化系統模擬與偵錯」一般,我們可善用既有的工具,進一步延伸為更直覺且多元的開發模式。

之前主要在PXA27x的硬體平台進行開發,最近則因為Jollen兄提供其最新的「Jollen-Kit! 開發板」與OpenMoko/FIC提供「Neo1973 Hardware」,讓我對這兩款同是S3C2410為基礎的平台有高度興趣。除了「Intel/Marvell PXA27x的系統模擬」外,Neo1973 (目前硬體為GTA01) 的硬體模擬也進行中,openmoko採用的bootloader是U-Boot,wiki的 "Bootloader" 做了很詳盡的解說,系統模擬器的畫面如下:

U-Boot允許自訂選單,在我們這個以qemu為基礎的模擬器中,選單項目可按下Enter鍵作切換,當按下Space鍵時就執行指令,當然,還等什麼,咱們就boot系統,模擬器的畫面如下:
熟悉的小企鵝就現身,當Linux走出PC,進入移動裝置如手機時,給予我們相當大的揮灑空間。OpenMoko的軟體架構採用X Window System,並使用OpenedHand維護的應用程式套件,以下是進行觸碰螢幕校正的模擬器畫面:
為了要符合觸碰螢幕的運作行為,這個以qemu為基礎的模擬器做了些許的修改,避免被grab,最後我們終於看到openmoko的軟體環境:
透過OpenEmbedded,我們可以快速建構整個system image,OpenMoko官方也有個build host,提供最新的image與ipkg feed。這個模擬環境暫時命名為 "openmoko-emulator",原始程式碼與相關資源可在此取得:http://mdk.linux.org.tw/~jserv/openmoko/。以下是 "openmoko-emulator" 的README內容:

== Introduction ==

The package includes the modified qemu for emulating Neo1973 phone aka FIC GTA01 aka OpenMoko based on S3C2410A.

== Requirements ==

Software:
1. Linux distribution. Tested in Debian Sarge and Ubuntu 6.06/7.04
2. Packages: gcc-3.4, lynx, libsdl1.2-dev, python, perl


== Usage ==

After extracting the snapshot of this emulator, change to source directory. Then, perfom the following instructions:

(1) Build from source
# ./configure
# make
(2) Download OpenMoko images from nightly build
# ./openmoko/download.sh
(3) Install OpenMoko to NAND Flash
# ./openmoko/flash.sh
(4) Run the emulator
# ./openmoko/run.sh
週邊的部份,GSM modem與AGPS會紀錄其enable/disable狀態,其餘則算是堪用,這當然只是個起點。未來或許會比照「深入淺出Hello World」系列演講的模式,對這類在Embedded Linux開發過程中,引入硬體模擬器的突破,探討如何更深入掌握系統與加速開發流程,同時這也彰顯整合開發工具的需求,所以最近會繼續尋求合作的機會。

2007年3月15日 星期四

視覺化系統模擬與偵錯

稍早撰寫短文「透過 User-Mode-Linux 來學習核心設計」(Part I / Part II),隨後在「Intel/Marvell PXA27x的系統模擬」提出OrzLab所實做系統層面的模擬環境 (以qemu計畫的qemu-system-arm為基礎),暫定名稱為PXAemu,這些基礎建設對於嵌入式系統開發都有其價值,諸如system prototype、進階分析,以及快速軟體開發,未來我們會增加多種硬體平台的模擬。除了系統模擬器外,視覺化的呈現與偵錯能力也相當重要,在今年一月份,已經成功整合User-Mode LinuxInsight/GDB,大略的呈現如下圖:
當時開發的平台是IA32,引入User-Mode Linux的優點是可快速分析與平台無關的Linux kernel機制,諸如記憶體管理、排程,以及網路堆疊部份。另外,上週於台中一中舉辦的「深入淺出 Hello World 」系列演講第三場,已經公開展示PXAemu與gdb整合的操作,可相當便利的進行分析與偵錯,其運作畫面如下:
以上展示透過Remote GDB連線,設定中斷點於sys_execve函式,這將會觸發於首次由kernel-mode切入user-mode的時機,也就是/sbin/init程序執行之時,當然,gdb強大的命令與功能可以輔助來對kernel作更深入的追蹤,必要時也可改變其執行時期的行為,稍後我將會試著整合PXAemu與Insight/GDB。因為Insight/GDB內建的Tcl/Tk版本老舊,在Linux下對於字型處理不雅觀且不當的XIM處理也容易讓系統崩潰,所以我動手補強並加入Xft的支援,可自行取得patch

除了以上透過既有軟體組合的視覺化環境外,我正在進行一個全新的項目,以Qt4作為GUI library (盡可能減少Win32與Linux平台移植的技術議題),為PXAemu開發frontend,也著手開發相容於GDB Machine Interface的GUI Debugger,如此一來,就可以輕易更換GNU Toolchain,即使是商業版本的MontaVista Consumer Electronics Edition (mvlcee) 也得以使用。

2007年3月9日 星期五

Intel/Marvell PXA27x的系統模擬

上一篇blog「PXA27x Linux計畫」提及在SourceForge.net建立名為PXA27x Linux的新專案,包含系統層面的模擬環境,現行實做以qemu計畫的qemu-system-arm為基礎,暫定此分支命名為PXAemu,主要的參考標的是市面上的PDA或者SmartPhone,當然也不排除開發中的硬體裝置,畢竟模擬環境的彈性較高,要作前期驗證或者針對特定需求的模擬分析 (如:能源變化、網路通訊的異常),都是可行的。剛剛已經將kernel patches置入SVN (/kernel/linux-2.6.20),以PXAemu作系統模擬的畫面如下:
很令人振奮的畫面,稍後會補上一個PXAemu專屬的frontend,並改善LCD controller的處理。對了,RT nanokernel for Embedded Linux也可用PXAemu來進行多項實驗,這也是近期進行的項目。