2012年2月27日 星期一

[好書推薦]建構嵌入式Linux系統(ch9)

很難讀懂得一章,無法完全理解U-boot是如何運作的,看了許久跟著在網路上爬文許久,突然領悟到了

u-boot的工作主要就是載入kernel,然後讓kernel去載入init這個process,這兩個元件主要都是放到記憶體。先說幾種主要的載入kernel的方式

  1. 由flash載入,最是單純,最好控制
  2. 由網路載入,蠻複雜的
  3. 由serial port載入,很龜速,主要依賴loadb/loadx/loady由serial port載入

以上幾個方式可以從底下網址找到(還有很多開機指令,需要看過一下,心裡有個底)
http://www.flatws.cn/article/program/shell/2011-02-23/14038.html

仔細觀察uboot提供的指令就可以理解到需要哪些環境變數,這些環境變數主要是記載了載入kernel的實體位置以及rootfs所在的地方

第一種載入的方式
必須先把kernel轉成為適當地格式,kernel一般會被壓縮成為zImage格式,然後在被變成uImage放置到flash的適當位址,這個位址被需傳給uboot讓他找到,跟著就是kernel的entry point位址,很不幸的書中沒說,直接跳到實際例子,我網路爬文許久終於找到

http://tech.ddvip.com/2008-09/122095341662350.html
http://sakbk.pixnet.net/blog/post/30892645-zimage-component

其中一段提到,在arch/arm/Makefile文件中的textaddr-y:= 0xC0008000这个是内核启动的虚拟地址,由編譯的核心裡面可以挖出來。我想這點也是之前網路教材沒寫出來,遇到的麻煩處(chapter 4)。在知道這個位址之後就剩下rootfs的位置需要被理解,比如是/dev/mtdblock4,這點在前兩三章有提到過

第二種由網路載入的方式
這個就頭大了,因為牽涉的東西往往很多,搞得我頭昏眼花,例如書中提到了如何建立NFS、DHCP 跟TFTP server就寫了一大段,這裡先跳過。接下來先看看開機指令
基本上就是經由TFTP Server載入kernel,然後在透過NFS server來掛載rootfs
用兩個指令達到這件事情
bootp:如何知道kernel image的位置是藉由DHCP server告知的,跟著uboot再去DNS server通知的地點利用tftp指令取回image
bootm:必須知道kernel第一條程式位址(entry address),如第一種方式提到
跟著就是設定一堆NFS相關的資料,讓uboot通知kernel如何去掛載rootfs,也就是書中看到的setenv bootnfs ... 那一堆龐雜的dscript

bootp還有變形的方式,也就是直接使用tftpboot 01000000 /data/kernel/virtex4-vmlinux-2.6.x.img表示直接透過tftp server將image抓回來放入ram 0100000的位址,這裡省略的DHCP的告知,但是就必須要事先設定好IP address,可以參考底下範例
http://blog.chinaunix.net/uid-20340721-id-1964603.html

第三種我就不介紹了,我也不打算使用:P不過如果有心的人應該看一下,哪天嵌入式系統被放到沒有網路的地方,剛好板子上面的flash又掛點,這時候只剩下你的NB跟serial port,這招看來就是最後一招了(還是可以用ICE解救??)

書中往往還教導使用如何將kernel寫到flash,還有如何編制uImage,如何架設server,讓整章看起來亂無章法,又一下子跳到實例應用,往往讓人十分迷惑

最後還有提到如何更新uboot跟image,還是不失本書一貫的風格相當精彩

最後附上其他參考資料
http://www.flatws.cn/article/program/shell/2011-02-23/14038.html
http://blog.xuite.net/chipinwu/blog/28718850-U+Boot%E7%9A%84%E9%85%8D%E7%BD%AE%E5%8F%8A%E7%B7%A8%E8%AD%AF
http://blog.udn.com/Howl0730/2663521
http://flykof.pixnet.net/blog/post/22975136-u-boot%E6%8C%87%E4%BB%A4

沒有留言:

張貼留言