bootloader 核心啟動引數

2021-05-22 04:29:20 字數 2050 閱讀 4059

一:

啟動引數的傳遞過程 

啟動引數是包裝在資料結構裡的,

在linux kernel

啟動的時候

,bootloader

把這個資料結構拷貝到某個位址

, 在改動pc

跳向核心介面的同時

,通過通用暫存器

r2來傳遞這個位址的值

,下面這句話就是

uboot

跳向linux 

kernel的**

(bootm

命令) 

thekernel (0, bd->bi_arch_number, bd->bi_boot_params); 

thekernel其實不是個函式

,而是指向核心入口位址的指標

,把它強行轉化為帶三個引數的函式指標

,會把三個 

引數儲存到通用暫存器中,

實現了向

kernel

傳遞資訊的功能

,在這個例子裡,會把

r0賦值為

0,r1

賦值為機器號 

r2賦值為啟動引數資料結構的首位址 

因此,要向核心傳遞引數很簡單

,只要把啟動引數封裝在

linux

預定好的資料結構裡

,拷貝到某個位址

(一般 

約定俗成是記憶體首位址+100dex) 

二:啟動引數的資料結構 

啟動引數可儲存在兩種資料結構中,param_struct

和tag,

前者是2.4

核心用的

,後者是

2.6以後的核心更期望用的 

但是,到目前為止

,2.6

的核心也可以相容前一種結構

,兩種資料結構具體定義如下

(arm cpu): 

struct param_struct  s; 

char unused[256]; 

} u1; 

union  s; 

} u2; 

char commandline[command_line_size]; 

};param_struct只需要設定

cmmandline,u1.s.page_size,u1.s.nr_pages

三個域,

具體使用可參見下面的例子 

對於tag來說,

在實際使用中是乙個

struct tag

組成的列表,在

tag->tag_header中,

一項是u32 tag(重名,

注意型別

) 其值用巨集atag_core,atag_mem,atag_cmdline,atag_none

等等來表示

,此時下面

union

就會使用與之相關的資料結構 

同時,規定

tag列表中第一項必須是

atag_core,

最後一項必須是

atag_none,

比如在linux

**中,

找到啟動引數之後 

首先看tag

列表中的第一項的

tag->hdr.tag

是否為atag_core,

如果不是

,就會認為啟動引數不是

tag結構而是

param_struct 

結構,然後呼叫函式來轉換.在

tag->tag_header中,

另一項是

u32 size,

表示tag

的大小,tag

組成列表的方式就是 

指標+size,

實際使用中用

tag_next (params).tag

的具體使用見三中的例子 

struct tag  u; 

};需要注意的是,

這兩個資料結構在

uboot

中和linux

中分別有定義

,這個定義必須一直才能正常傳遞引數 

如果實際使用中不一致的話就不能正常傳遞,

可以自行修改 

bootloader啟動流程

bootloader a.svc模式 關中斷 mmu cache 看門狗等 b.基本初始化 時鐘 串列埠 flash 記憶體 c.自搬移到記憶體 d.設定棧,調到c部分 e.大部分硬體初始化 網絡卡 sd卡 usb f.搬移核心到記憶體 g.執行核心 kernel a.自解壓核心 b.執行核心彙編部...

啟動程式BootLoader介紹

bootloader是系統加電後 作業系統核心或使用者應用程式執行之前,首先必須執行的一段程式 通過這段程式,為最終呼叫作業系統核心 執行使用者應用程式準備好正確的環境。對於嵌入式系統來說,有的使用作業系統,也有的不使用作業系統,但在系統啟動時都必須執行bootloader,為系統執行準備好軟硬體環...

Bootloader啟動過程

bootloader啟動過程 系統加電後,先執行第一階段彙編 進行相應的內部硬體初始化 暫存器 記憶體等 將第二階段c 複製到ram位址bloc abs base,然後跳轉到第二階段開始執行,在第二階段中,從彙編 跳轉到c 的main 函式,繼續如下工作 外圍硬體初始化 串列埠 usb等 將flas...