2013-11-23 49 views
1

我嘗試瞭解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

==========================================

我的問題是:

  1. 圖像類型是未壓縮的,這意味着我們不壓縮vmlinux中的zImage來?

  2. 加載地址:20008000:這是在arch/arm/boot/Makefile中定義的解壓縮圖像的地址= ZRELADDR? 這個地址也是../arm/kernel/head.o的地址嗎? 看來我們不使用地址KERNEL_PHYS,這種方法是常用的方式還是隻適用於AT91SAM系列?

  3. 基本上,我們的程序建立和啓動是:

一個。構建內核步驟:vmlinux - > uImage(跳過創建zImage)。

b。內核啓動步驟:DataFlash/NAND --load - > uImage(@ 0x22200000) - 解壓縮 - >未壓縮映像(@ 0x20008000)。

在這種情況下,在啓動過程中沒有zImage,儘管在構建消息中我看到了zImage的創建。我錯了 ?

4。那麼我在/arch/arm/kernel/vmlinux.lds中找到的地址0xC0008000如何處理: 。 = 0xC0000000 + 0x00008000; 我們用它嗎?我把這個地址與ZRELADDR混淆了。

問候。

回答

2
  1. uImage文件最有可能是使用zImage構建的。它表示未壓縮,因爲uImage本身沒有壓縮。

  2. 加載地址可以被啓動加載程序用來存儲對Linux內核啓動的初期階段的數據(在引導加載程序定義的命令行等)。

  3. 你說得對關於啓動過程。但是,當使用zImage時,解壓由內核而不是引導加載程序完成。見decompress_kernel()

  4. 地址0xc0008000是一個虛擬地址。它映射到物理地址0x20008000。虛擬地址只能在Linux建立內存轉換(MMU)之後使用。

+0

您好克里斯托弗奧吉爾, 萬一有在構建過程中使用的zImage,然後啓動過程將是: **的uImage(數據閃存/ NAND)** --- --- load_to_RAM> **的uImage (@ 0x22200000)** --- decompress_uImage - > ** zImage(@ KERNEL_PHYS)** --- decompress_zImage ---> **未壓縮的圖像(@ 0x20008000)**。 那麼,我們得到** KERNEL_PHYS **? 謝謝 –

+0

我認爲上面的地址KERNEL_PHYS應該是「ZTEXTADDR」。從命令:bootm $ {kernel_addr},u-boot代碼將uImage從kernel_addr解包到ZTEXTADDR,但我無法在任何地方獲得ZTEXTADDR。 –

+0

其實我不認爲有一個步驟decompress_uImage。一旦uImage被處理,它的有效載荷(內核zImage)被拷貝到0x22200000,然後pc跳到這個相同的地址。然後Linux解壓縮完成,最終的圖像在0x20008000解壓縮。 –