我嘗試瞭解ARM內核的編譯和啓動過程。我從www.kernel.org拿走了vanila linux,並在AT91SAM9260的運行配置之後構建它。 在我們編譯內核的消息中顯示:在AT91SAM9260中啓動Linux內核
=================================== =======
LD的vmlinux
SORTEX vmlinux的
SYSMAP System.map
objcopy把拱/臂/引導/圖像
內核:拱/臂/引導/圖像準備就緒
GZIP拱/臂/引導/壓縮/ piggy.gzip
AS拱/臂/引導/壓縮/ piggy.gzip.o
LD拱/臂/引導/壓縮/ vmlinux的
objcopy把弓/ ARM /開機/的zImage
內核:弓/ ARM /開機/的zImage準備
的uImage弓/ ARM /開機/ uImage執行
圖像名稱:Linux的3.9.1 +
創建:星期六11月23日18點15分58秒2013
圖像種類:ARM Linux內核圖像(未壓縮)
數據大小:1635544個字節= 1597.21 KB = 1.56 MB
加載地址:20008000
入口點:20008000
圖片拱/臂/引導/的uImage是重新ady
==========================================
我的問題是:
圖像類型是未壓縮的,這意味着我們不壓縮vmlinux中的zImage來?
加載地址:20008000:這是在arch/arm/boot/Makefile中定義的解壓縮圖像的地址= ZRELADDR? 這個地址也是../arm/kernel/head.o的地址嗎? 看來我們不使用地址KERNEL_PHYS,這種方法是常用的方式還是隻適用於AT91SAM系列?
基本上,我們的程序建立和啓動是:
一個。構建內核步驟:vmlinux - > uImage(跳過創建zImage)。
b。內核啓動步驟:DataFlash/NAND --load - > uImage(@ 0x22200000) - 解壓縮 - >未壓縮映像(@ 0x20008000)。
在這種情況下,在啓動過程中沒有zImage,儘管在構建消息中我看到了zImage的創建。我錯了 ?
4。那麼我在/arch/arm/kernel/vmlinux.lds中找到的地址0xC0008000如何處理: 。 = 0xC0000000 + 0x00008000; 我們用它嗎?我把這個地址與ZRELADDR混淆了。
問候。
您好克里斯托弗奧吉爾, 萬一有在構建過程中使用的zImage,然後啓動過程將是: **的uImage(數據閃存/ NAND)** --- --- load_to_RAM> **的uImage (@ 0x22200000)** --- decompress_uImage - > ** zImage(@ KERNEL_PHYS)** --- decompress_zImage ---> **未壓縮的圖像(@ 0x20008000)**。 那麼,我們得到** KERNEL_PHYS **? 謝謝 –
我認爲上面的地址KERNEL_PHYS應該是「ZTEXTADDR」。從命令:bootm $ {kernel_addr},u-boot代碼將uImage從kernel_addr解包到ZTEXTADDR,但我無法在任何地方獲得ZTEXTADDR。 –
其實我不認爲有一個步驟decompress_uImage。一旦uImage被處理,它的有效載荷(內核zImage)被拷貝到0x22200000,然後pc跳到這個相同的地址。然後Linux解壓縮完成,最終的圖像在0x20008000解壓縮。 –