Boot Loader啟動過程

2021-06-26 21:54:28 字數 2010 閱讀 1405

由於boot loader的實現依賴與cpu的體系結構,因此大多數的boot loader都分為stage1和stage2兩個階段:

1,bootloader 的第一階段(stage1),工作流程

1.1,硬體裝置初始化通常包括如下步驟:(按先後順序執行):

復位(reset)

設定cpu為超級保護模式(svc) 即特權模式(supervisor)

關閉看門狗,不必附加餵狗**。

遮蔽所有中斷,為中斷提供服務通常是os裝置驅動程式的責任,因此在 boot loader 的執行全過程中可以不必響應任何中斷。中斷遮蔽可以通過寫cpu的中斷遮蔽暫存器或狀態暫存器(比如 arm 的 cpsr 暫存器)來完成。

設定系統時鐘頻率。

初始化記憶體控制器,包括正確地設定系統的記憶體控制器的功能暫存器以及各記憶體庫控制暫存器等。

初始化串列埠等,典型地,初始化uart並向串列埠列印相關字元資訊。

初始化led。典型地,通過gpio 來驅動led,其目的是表明系統的狀態是 ok 還是 error。如果板子上沒有 led,那麼也可以通過初始化 uart 向串列埠列印 boot loader 的logo 字元資訊來完成這一點。

關閉 cpu 內部指令/資料 cache。

1.2,**重定位主要檢查自己是否在記憶體中。如果是跳到堆疊段(stack_setup**段)設定堆疊,不是就載入自己到ram空間。

1.3,載入bootloader第二階段**到ram空間,拷貝時要確定兩點:(1) stage2 的可執行映象在固態儲存裝置的存放起始位址和終止位址;(2) ram 空間的起始位址。

1.4,堆疊指標的設定是為了執行 c 語言**作好準備。通常我們可以把 sp 的值設定為(stage2_end-4),因為棧是向下生長的,所以通常把棧指標設在1mb空間的最頂端。此外,在設定堆疊之前,也可以把指示用的led燈關閉,以提示使用者跳轉到stage2。經過以上步驟設定以後,系統的物理記憶體布局應該如圖所示。

1.5,跳轉到第二階段(stage2)**入口,在上述一切就緒後,就可以跳轉到boot loader的stage2執行了,通過修改pc暫存器為合適的位址來實現的。

2,bootloader的第二階段(stage2)工作流程

2.1,初始化本階段要使用到的硬體裝置,這通常包括:

(1)設定時鐘、初始化至少乙個串列埠,以便和終端使用者進行 i/o 輸出資訊;(2)初始化計時器等。在初始化這些裝置之前,也可以重新把 led 燈點亮,以表明我們已經進入 main_loop() 函式執行。

2.2,檢測系統記憶體對映(memory map)

所謂記憶體對映就是指在整個4gb 實體地址空間中有哪些位址範圍被分配用來定址系統的ram 單元。比如,在sa-1100 cpu 中,從0xc000,0000 開始的512m 位址空間被用作系統的ram 位址空間,而在samsung s3c44b0x cpu 中,從 0x0c00,0000 到 0x1000,0000 之間的 64m 位址空間被用作系統的 ram 位址空間。雖然cpu 通常預留出一大段足夠的位址空間給系統 ram,但是在搭建具體的嵌入式系統時卻不一定會實現 cpu 預留的全部 ram 位址空間。也就是說,具體的嵌入式系統往往只把 cpu 預留的全部 ram 位址空間中的一部分對映到 ram 單元上,而讓剩下的那部分預留 ram 位址空間處於未使用狀態。由於上述這個事實,因此 boot loader 的 stage2 必須在它想幹點什麼 (比如,將儲存在 flash 上的核心映像讀到 ram 空間中) 之前檢測整個系統的記憶體對映情況,也即它必須知道 cpu 預留的全部 ram 位址空間中的哪些被真正對映到 ram 位址單元,哪些是處於 "unused" 狀態的。

2.3,將核心映像和根檔案系統映像從flash上讀到ram空間中。

規劃記憶體占用的布局

從 disk上拷貝

2.4,為核心設定啟動引數。

應該說,在將核心映像和根檔案系統映像拷貝到 ram 空間中後,就可以準備啟動 linux 核心了。但是在呼叫核心之前,應該作一步準備工作,即:設定 linux 核心的啟動引數。

2.5 啟動核心

Bootloader啟動過程

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

bootloader啟動過程詳細說明

今天早上看了一上午的bootloader簡單原始碼,終於捋順了bootloader的執行過程,之前只是知道bootloader 會先被irom中的 拷貝到iram中一部分,然後執行這部分 會把整個bootloader 拷貝到sdram中,最終在sdram執行剩下的 而這段 會把kernel拷貝到sd...

bootloader 啟動過程詳細說明

今天早上看了一上午的bootloader簡單原始碼,終於捋順了bootloader的執行過程,之前只是知道bootloader 會先被irom中的 拷貝到iram中一部分,然後執行這部分 會把整個bootloader 拷貝到sdram中,最終在sdram執行剩下的 而這段 會把kernel拷貝到sd...