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
驗證校驗和...好
通過OK UBOOT BOOM命令解壓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的區別。vmlinuz
Vmlinuz是壹個可引導的壓縮內核。“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 == >設置壓縮類型“壓縮”
-a == >將加載地址設置為“地址”(十六進制)
-e == >將入口點設置為“ep”(十六進制)
-n == >將圖像名稱設置為“名稱”
-d == >使用“數據文件”中的圖像數據
-x == >設置XIP(就地執行)
參數描述:
-A指定CPU的架構:
用價值表示的系統結構
阿爾法阿爾法
武裝手臂
x86英特爾x86
ia64 IA64
mips
MIPS 64 64位
ppc
IBM S390
sh SuperH
sparc SPARC
sparc64 SPARC 64位
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指定用於映射的源文件。
我在編譯期間使用的命令如下:
#制作zImage //生成zImage鏡像
#/usr/local/arm/K9 uboot/tools/mkimage-n ' Linux 2 . 4 . 27 '-A arm-O Linux-T
kernel-C none-a 0x 20007 fc0-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/新磁盤
# umount/mnt/new _ disk//uninstall
# gzip–c–v9k 9 . img & gt;K9.img.gz//compression生成最終的文件系統。
接下來,我們將下載內核並準備文件系統。讓我解釋壹下我的內存分配如下:
閃光燈:
0x 10000000――0x 10020000 boot
0x 10020000――0x 10040000 uboot
0x 10040000――0x 10060000
0x 10060000――0x 10200000內核
0x 10200000――0x 11000000內存磁盤
Sdram:
0x 20007 fc0――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 \;運行引導//uboot復位的執行指令。
設置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\。l完成從內存到閃存的復制。
最後可以設置bootcmd環境變量,實現u-boot自動引導內核啟動。
至於文件系統的2種方式:ramdisk和nfs推薦開發者使用nfs,方便修改;
當使用ramdisk時,
#岡茲·k9.img.gz//Decompress
# mount–olooopk9.img/mnt/new _磁盤//懸掛負載
# umount/mnt/new _ disk//uninstall
# gzip–c–v9k 9 . img & gt;K9.img.gz//compression生成最終的文件系統。
別忘了這四個命令對妳來說有多強大。
我不希望您再次構建根文件系統。