Uboot啟動zImage(go)和uImage(bootm)分析。
1.bootm加載linux鏡像就是加載uIamge,是mkimage做的。與zIamge的區別在於uIamge是由zIamge壓縮的。bootm需要先解壓uIamge,解壓地址是內核入口地址。解壓完成,uIamge和zIamge就差不多了,具體區別可以討論。Uboot目前只能支持uImage啟動,不支持zImage啟動。
2.bootm解壓縮過程
-
##在08808000啟動映像...
映像名稱:Linux-2.6.14.7
映像類型:ARM Linux內核映像(未壓縮)
數據大小:989172字節= 966 kB
加載地址:08008000
入口點:08008000
驗證校驗和...好
好嗎??使用uboot bootm命令解壓縮uIamge
-
啟動內核...??
傳遞內核參數將控制權交給arch \ arm \ boot \ compressed]head . s。
-
比如mx1ADS隊內存的起始地址是0x0000 _ 0000,通過tftp下載到0x 0800 _ 8000+偏移量,偏移量大於0x80_0000,也就是tftp 0x0880_8000,然後bootm 0x0880_8000解壓0x0080 _ 8000處的uIamge,解壓地址是MK。
zImage和uImage 1的區別。vmlinuzvmlinuz是壹個可引導的壓縮內核。“vm”代表“虛擬內存”。Linux支持虛擬內存,不像DOS之類的老操作系統,內存限制是640KB。Linux可以使用硬盤空間作為虛擬內存,因此得名“vm”。?
建立vmlinuz有兩種方法。首先在編譯時通過“make zImage”創建內核,然後通過“CP/usr/src/Linux-2.4/arch/i386/Linux/boot/zImage/boot/vmlinuz”生成。ZImage適合小內核,它的存在是為了向後兼容。?
第二,內核編譯的時候是用make bzImage命令創建的,然後用“CP/USR/SRC/Linux-2.4/ARCH/I386/Linux/boot/bzImage/boot/vmlinuz”生成。BzImage是壹個壓縮的內核映像。需要註意的是,bzImage不是由bzip2壓縮的。bzImage中的bz容易被誤解,bz代表“大zImage”。bzImage中的b是“大”的意思。ZImage(vmlinuz)和bzImage(vmlinuz)都是用gzip壓縮的。它們不僅是壹個壓縮文件,而且gzip解壓縮代碼也嵌入在這兩個文件的開頭。所以不能用gunzip或者gzip -dc解包vmlinuz。?
二、initrd-x.x.x.img?
Initrd是“初始ramdisk”的縮寫。Initiatrd通常用於將硬件臨時引導到壹種狀態,在這種狀態下,實際的內核vmlinuz可以接管並繼續引導。?
initrd映像文件是使用mkinitrd創建的。mkinitrd實用程序可以創建initrd映像文件。這個命令是RedHat專有的。其他Linux發行版可能有相應的命令。這是壹個非常方便的實用程序。有關詳細信息,請參見幫助:man mkinitrd使用以下命令創建initrd映像文件。?
最終生成了兩種內核映像:zImage和uImage。zImage下載到目標板後,可以直接用uboot的命令go跳轉。這時候內核直接解壓啟動。但是不能掛載文件系統,因為go命令沒有把內核需要的相關啟動參數傳遞給內核。傳遞啟動參數,我們必須使用命令bootm來跳轉。Bootm命令跳轉只處理uImage的鏡像。?
uboot源代碼的tools/目錄下有mkimage工具,可以用來制作各種不壓縮或壓縮的可引導鏡像文件。?
Mkimage在制作鏡像文件的時候在原可執行鏡像文件前面加壹個0x40字節的頭,記錄參數指定的信息,讓uboot識別哪個CPU系統結構,哪個OS,哪個類型,加載到內存的什麽地方,入口點在內存的什麽地方,鏡像名稱是什麽?
用法如下:
。/mkimage-A arch-O OS-T type-C comp-A addr-e EP-n name-d data _ file[:data _ file...]圖像?
-A == >設置建築為‘拱門’?
-O == >將操作系統設置為“os”嗎?
-T == >將圖像類型設置為“類型”?
-C == >設置壓縮類型“comp”?
-a == >將加載地址設置為“地址”(十六進制)?
-e == >將入口點設置為‘EP’(十六進制)?
-n == >將圖像名稱設置為“名稱”?
-d == >使用“數據文件”中的圖像數據?
-x == >設定XIP(執行到位)?
參數描述:?
-A指定CPU的架構:?
價值代表的系統結構?
阿爾法阿爾法?
武裝壹只手臂?
x86英特爾x86?
ia64 IA64?
mips MIPS?
mips64 MIPS 64位?
ppc PowerPC?
s390 IBM S390?
sh SuperH?
斯帕茨sparc?
sparc64位?
m68k MC68000?
-O指定操作系統類型,可以采用以下值:?
openbsd、netbsd、freebsd、4_4bsd、linux、svr4、esix、solaris、irix、sco、dell、ncr、lynxos、vxworks、psos、qnx、u-boot、rtems、artos?
-T指定映射類型,可以采用以下值:?
單機、內核、內存、多重、固件、腳本、文件系統?
-C指定圖像壓縮公式,可以采用以下值:?
無壹不壓縮?
Gzip使用gzip壓縮方法?
Bzip2用的是bzip2的壓縮公式?
-a指定圖像在內存中的加載地址。圖像下載到內存時,要按照用mkimage制作圖像時該參數指定的地址值下載。
-e指定鏡像運行的入口點地址,是-a參數指定的值加上0x40(因為mkimage前面加了壹個0x40字節的頭)?
-n指定圖像名稱?
-d指定制作圖像的源文件?
我在編譯時使用的命令如下:?
# make zImage//生成zImage鏡像?
#/usr/local/arm/k 9 uboot/tools/mkimage-n ' Linux 2 . 4 . 27 '-A arm-O Linux-T?
kernel-C none-a 0x 20007 fc 0-e 0x 20008000-d zi mage uImage?
內核映像已經準備好了,此時我們將準備文件系統。因為時間關系,我暫時使用k9.img.gz,壹個別人開發的文件系統。這時候我們需要做的就是自己編寫壹個簡單的hello.c程序,編譯後添加到文件系統中,然後下載到目標板上運行。?
寫hello.c第壹;?
編譯:?
#/usr/local/arm/2 . 95 . 3/bin/arm-Linux-gcc–o start-hello hello . c?
編譯後生成可執行文件start-hello?
接下來,我們必須將可執行文件添加到文件系統中,步驟如下:?
#岡茲·k9.img.gz//Decompression?
# mount–olooopk9.img/mnt/new _磁盤//掛載?
#cp start-hello /mnt/new_disk //復制文件到文件系統?
#cd /mnt/new_disk?
#umount /mnt/new_disk //卸載?
# gzip–c–v9k 9 . img & gt;K9.img.gz//壓縮生成最終的文件系統?
接下來,我們將下載內核並準備文件系統。下面我來解釋壹下我的內存分配:?
閃光燈:?
0x 10000000――0x 10020000 boot?
0x 10020000――0x 10040000 uboot?
0x 10040000――0x 10060000?
0x 10060000――0x 10200000內核?
0x 10200000――0x 11000000 ramdisk?
Sdram:?
0x 20007 fc 0――0x20a 00000內核?
0x20a00000 ――內存磁盤
Loadb通過串口下載數據到ram?
Cp.b將ram中的數據復制到flash中。?
在下載完內核和文件系統ramdisk之後,我們還需要設置uboot的環境變量,這樣uboot就可以在通電的情況下啟動內核等操作。環境變量設置如下:?
set cpfltoram CP . b 10200000 20a 00000 18 ffff//將文件系統復制到ram?
設置boot bootm 20007fc0//啟動內核?
set bootcmd run cpfltoker \;運行cpfltoram \;run boot //uboot reset的執行指令?
設置cpfltoker CP . b 10060000 20007 fc 0 f 4 fff//將內核復制到ram中?
set bootargs root =/dev/ram rw initrd = 0x20a 00000,4M init=/linuxrc console=ttyS0,11520?
0,mem = 32m//uboot傳遞給內核的引導參數。
設置完成後,saveenv存儲環境變量。?
學習體驗:zImage和uImage都是生成的可執行內核鏡像文件?
如何在u-boot中分別啟動它們是go addr和bootm addr實現啟動過程?
也就是zImage是通過go引導的,uImage是bootm?
zImage和uImage 2的關系是uImage是zImage通過mkimage(u-boot下tools下的壹個工具)生成的?
結果是後者的頭比前者多64個字節,多出來的64個字節用來通知u-boot。告知優步相關信息;
這樣壹來,u-boot引導內核的時候就有兩個地址:loadaddress和entry address 2之差剛好是0x40 (64字節)?
這樣使用bootm loadaddress時,u-boot會根據對應的loadaddress進行調整,有2種情況;?
1),當loadaddress和mkimage相同時:
然後在加載ldrpc和entryaddress時,會選擇mkinage的入口地址;即PC = load address+4;然後pc控制進程跳轉到反轉ram中執行;?
2)當loadaddress和mkimage不壹致時:
然後,u-bbot在比較完地址後,會從當前的loadaddress中減去64個字節,將真實的內核映像(去掉64字節頭的內核)復制到預先建立的loadaddress中,然後直接從這個loadaddress啟動內核;
綜上所述,以上兩種情況的實際區別是什麽?實際上,在執行最終代碼時,如果地址與mkinage中指定的不匹配,那麽u-boot會復制內核代碼,去掉頭文件後直接執行。如果不處理,內核會用loadaddress+0x40執行;?
下載zImage或uImage通過tftp服務;?
當tftp不成功時,Loadb使用串口下載內核。妳想用這種方法嗎?
Cp.b\。w\。我完成了從內存到閃存的復制?
最後可以設置bootcmd環境變量,實現u-boot自動引導內核啟動。
至於文件系統的2種方式:ramdisk和nfs推薦開發者使用nfs,方便修改;?
使用ramdisk時,?
#岡茲·k9.img.gz//Decompress?
# mount–olooopk9.img/mnt/new _磁盤//加載?
#umount /mnt/new_disk //卸載?
# gzip–c–v9k 9 . img & gt;K9.img.gz//收縮以生成最終的文件系統。
別忘了這四個命令,它們對妳來說有多強大?
我不希望您再次構建根文件系統。