壓縮核心zImage的啟動過程中的引數

2021-07-24 07:01:58 字數 3140 閱讀 9583

**

.text

段開始,先是核心解壓位址的確定

.text

#ifdef

config_auto_zreladdr

@ determine final kernel image address

movr4, pc

and r4, r4, #0xf8000000

add r4, r4, #

text_offset

#else

ldrr4, =

zreladdr

#endif 先從

linux

基本引數入手吧,見表1。

text_offset

是**相對於物理記憶體的偏移,通常選為

32k=0x8000

。config_auto_zreladdr

的意思是如果你不知道zreladdr位址要定在記憶體什麼地方,那麼這段**就可以幫你。看到

0xf8000000

了吧,那麼後面有多少個

0呢?答案是

27個,那麼2的

27次方就是

128m

,這就明白了,只要你把解壓程式放在最後解壓完成後的核心空間的

128m

之內的偏移的話,就可以自動設定好解壓後核心要執行的位址zreladdr

如果你沒有定義的話,那麼,就會去取

zreladdr

作為最後解壓的核心執行位址。那麼這個

zreladdr

是從**來的呢?答案是在:

arch/arm/boot/compressed/makefile

中定義的

# supply zreladdr to the decompressor via a linker symbol.

ifneq ($(config_auto_zreladdr),y)

ldflags_vmlinux += --defsym zreladdr=$(zreladdr)

endif

zreladdr這又是**定義的呢?答案是在:

arch/arm/boot/makefile

中定義的

ifneq ($(machine),)

include $(srctree)/$(machine)/makefile.boot

endif

# note: the following conditions must always be true: #

zreladdr == virt_to_phys(page_offset + text_offset) #

params_phys must be within 4mb of zreladdr #

initrd_phys must be in ram

zreladdr

:= $(zreladdr-y)

params_phys

:= $(params_phys-y)

initrd_phys

:= $(initrd_phys-y)

而裡面的幾個引數是在每個

arch/arm/mach-***/ makefile.boot

裡面定義的,內容如下:  

zreladdr-y

:= 0x20008000

params_phys-y 

:= 0x20000100

initrd_phys-y

:= 0x21000000

這下知道了,繞了一大圈,終於知道

r4存的是什麼了,就是最後核心解壓的起址,也是最後解壓後的核心的執行位址,記住,這個位址很重要。

解壓核心引數

解壓時symbol  解釋

ztextaddr

千成不要看成

zte啊,呵,這裡是

zimage

的執行的起始位址,當核心從

nor flash

中執行的時候很重要,如果在

ram中執行,這個設為0

zbssaddr

這個位址也是一樣的,這個是

bss的位址,如果在

nor中執行解壓的話,這個位址很重要。這個要放在

ram。

zreladdr

這個位址很重要,這個是解壓後核心存放的位址,也是最後解壓後核心的執行起址。

一般設為記憶體起址的

32k之後,如

arm: 0x20008000

zreladdr = phys_offset + text_offset

initrd_phys

ram disk

的實體地址

initrd_virt

ram disk

的虛擬位址

__virt_to_phys(initrd_virt) = initrd_phys

params_phys

核心引數的實體地址

核心引數

phys_offset 實際

ram的實體地址

對於當前

arm來說,就是

0x20000000

page_offset

核心空間的起始虛擬位址,通常

: 0xc0000000

,高階1g

__virt_to_phys(page_offset) = phys_offset

task_size

使用者程序的記憶體的最太值(以位元組為單位)

textaddr

核心啟執行的虛擬位址的起址,通常設為

0xc0008000

textaddr = page_offset + text_offset

__virt_to_phys(textaddr) = zreladdr

text_offset

相對於記憶體起址的核心**存放的偏移,通常設為

32k (0x8000)

dataaddr

這個是核心資料段的虛擬位址的起址,當用

zimage

的時候不要定義。



JOS 核心啟動過程

開機引導程式bootstrap 32 bit devices unused extended memory bios rom 16 bit devices,expansion roms vga display low memory bios 從上圖可以看出,bios的位址是從0xf0000 0x10...

linux核心啟動過程

第一步 電腦加電後cpu開始自身初始化,然後從某個固定位置 一般為0xfffffff0 取指令開始執行,此指令為跳轉指令,跳轉到bios 首部。第二步 bios開始加電自檢進行post power on self test 此階段完成系統硬體檢測,包括記憶體 系統匯流排檢測等,然後bios讀取啟動裝...

Linux核心啟動過程

linux核心啟動過程 第一篇日誌就摘錄一下linux核心的啟動過程,參考了 linux核心移植和yaffs2根檔案系統製作 嵌入式linux系統從軟體角度看可以分為四部分 引導引導程式 bootloader linux核心,檔案系統,應用程式。bootloader是系統啟動時執行的第一段 它主要用...