當前位置:編程學習大全網 - 源碼下載 - Linuxboot源代碼分析

Linuxboot源代碼分析

linux的uboot引導映像與zImage和uImage的區別

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//收縮以生成最終的文件系統。

別忘了這四個命令,它們對妳來說有多強大?

我不希望您再次構建根文件系統。

  • 上一篇:武士2:復仇的iPhone版遊戲
  • 下一篇:誰有vc++數字圖像處理的源代碼急需!!謝謝妳
  • copyright 2024編程學習大全網