讀書筆記《Building Embeded Linux System》第九章建立Bootloader

來源:互聯網
上載者:User

不同類型的Bootlader


  基於x86的PC機器,通常使用LILO或者GRUB。這些系統含有韌體(常說的BIOS),是對於各主要系統元件的程式,例如初始化RAM控制器,取保CPU在某個特定的狀態,提供很多資訊給OS,例如傳統的BIOS calls,ACPI table等等,這些linux的bootloader只需要從儲存介質中載入kernel image(也可能包括initrd/initramfs的image),開始執行既可。在嵌入式作業系統,通常沒有這些韌體,需要由bootloader來完成。

  LILO很早就出現,記憶中讀書時候Linux使用的就是lilo,現在仍有些x86的系統在使用,可以在http://lilo.go.dyndns.org

中擷取最新版本和文檔,它只能在帶有PC BIOS的x86系統上使用。

  GRUB由GUN維護,可以在http://www.gun.org/software/grub

中擷取資源。對於x86板塊上的系統,GRUB是朋友,而不是U-boot。這也是為什麼moblin在netbook上採用GRUB的原因,GRUB在是目前x86上最流行的bootloader。

  loadlin允許在非NT系列的老式的windows系統中啟用linux,現在基本上不使用了。Coreboot(原來的LinuxBIOS),支援x866和PowerPC,從ROM中啟動Linux,Linux具備系統初始化,interrupt-routing分配,裝置初始化,所以也成為LinuxBIOS。他的特點就是快速啟動。RedBoot是基於eCos(Embedded Configurable Operating System),在很多小型系統(小到無法跑整個Linux核心),當它可以跑其他的OS,例如Linux,後來Redhat使用了他。但是O’Reilly建議我們使用U-boot。

  U-Boot:是目前用的最為廣泛的linux bootloader,可用於x86、PowerPC、ARM、MIPS等幾乎所有的常見的Linux嵌入系統,O’Reilly在這一章將詳細描述U-Boot的建立。

建立從Network啟動的Server


  對於Linux嵌入式OS的開發,使用network boot是很方便的,因為不需要為一點改動就重新寫flash。可以通過BOOTP/DHCP,TFTP和NFS來實現網路啟動。DHCP已經取代BOOTP,但它不提供kernel img的傳遞,需要TFTP。NFS可以在NFS伺服器和用戶端之間共用整個分類樹,他需要啟動linux kernel來支援,通過mount方式,將網路目錄(host上的目錄)mount到target上,可用於調測我們的應用。

  我們需要在建立dhcp server。作者提醒建立dhcp server需要非常注意,不要影響到其他正常服務的dhcp server,有必要的話,應先和IT部門聯絡一下。我計劃在host上建立dhcp server,IT部門不管事,但是為了安全的,我將限制在實驗網段中。DHCP不依賴與其他intel的服務(例如inetd),都是由他自己提供。具體操作的結合實踐另外給出,我想先讀為這個章節,結合前面,以及moblin的一些情況,希望能在MID上跑一個系統,先run起來。

  我們需要建立TFTP server和NFS server。NFS通常rpm已經安裝。我們需要提醒的是安裝問題,尤其target是通過intenet來訪問的。建議通過host.deny和host.allow中進行許可權的控制。

Uboot的使用


  U-boot是目前嵌入式作業系統中最常見的bootloader。『對於MID,使用的是x86的主板,在重新刷BIOS後,可以安裝GRUB的linux,沒考慮好使用哪個,可以都試一試』在http://www.denx.de/wiki/U-Boot/WebHome

上的文檔正得很多很強大。書以OpenMoko(GTA01)的板子為例子。

1. 選定板塊類型:make gta01_config,建議看一下uboot的REAMDE的介紹。(比較長)

2. make ARCH=xxx CROSS_COMPILE=xxxx u-boot.udfu。前面兩個自明其意。最後一個參數udfu表示USB Device Frimware Update,可以用來升級裝置上的版本(指升級uboot)。還可以是u-boot.map(symbol map) , u-boot (ELF 二進位格式), u-boot.bin(raw 二進位img,可以寫入boot 存放裝置)。

  我覺得如果沒有實踐,很難理解得深刻,書中還介紹了通過uboot啟動等方面,我將在實踐篇中描述,這裡只做少許的記錄。我們需要將uboot放入裝置的相應快閃記憶體的相應的物理地址中,需要靠它來啟動。我們可以通過串口來查看uboot的輸出和輸入。如果我們按任何一個鍵,進入uboot的命令列操作,uboot提供了包括cp在內的很多命令,這些命令和arch,平台,開發板相關,uboot提供了每一個命令的help,例如:#help cp。如果我們沒有按任何一鍵,將在等等x秒之後,uboot根據預設的配置啟動。啟動後,進入命令列,可以通過printenv、setenv、saveenv來查看,修改,儲存環境變數參數。uboot環境變數可以用來產生boot指令碼,指令碼就是這些環境變數加一些uboot命令(run和“;”)組成的。如果快閃記憶體是ikongb的,沒有被組織為檔案系統,沒有包括任何的檔案headers,那麼下載到target的二進位img必須帶有Uboot可以可以理解的headers並知道如何去load他們。mkimage可以提供這個功能。雖然image的headers不一個bootloader所必須要求的,但這些頭在開發和啟動的時候提供很多方便,所以uboot使用他們。可以通過mkimage製作img映像和RAM disk(initrd)。

  Uboot有一個命令bootp,使用DHCP,從DHCP伺服器中擷取地址、TFTP地址以及上面檔案名稱。target從tftp中擷取img,並防止在配置的RAM地址(例如地址為0x30100000)中。我們可以通過iminfo命令來擷取img頭資訊(imi 30100000)。可以啟動img(bootm 30100000)。這樣在啟動的過程吃那個出現panic,原因是沒有根檔案系統。我們需要利用uboot的環境變數來產生一個指令碼,將一些boot的選項傳遞給kernel。我們增加bootnfs,使得系統可以通過NFS了mount根檔案系統。

  開發的過程中,我們使用tftp、nfs,但是最終的產品是需要載入到裝置的flash中去。可以利用uboot的命令,包括擦除和寫,也可以通過tftpboot或者loadb下載img到RAM,然後用cp.b將其寫入flash。在下載完之後,可以用imi命令,含有CRC校正來檢查完整性。

  對於uboot本身的升級,使用crc32命令,因為uboot沒有經過mkimage命令,沒有img header。下載後,NOR和NAND的處理是一樣的。先將flash去保護,erase,cp.b,重設環境變數,例如檔案大小,儲存配置(因為曾擦除,即使沒有任何修改,需要重新保留配置)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.