
BootLoader的啟動流程
標(biāo)簽(空格分隔): Linux
BootLoader的啟動流程
BootLoader的第?階段通常包含以下步驟(以執(zhí)?的先后順序):
硬件設(shè)備初始化
為加載 Boot Loader的stage2準(zhǔn)備RAM空間。
拷貝Boot Loader的stage2到RAM空間中。
設(shè)置好堆棧。
跳轉(zhuǎn)到stage2 的 C ??點(diǎn)。
BootLoader的第?階段通常包括以下步驟(以執(zhí)?的先后順序):
初始化本地階段要使?到的硬件設(shè)備
檢測系統(tǒng)內(nèi)存映射(memory map)
將kernel映像和根?件系統(tǒng)映像從flash上讀到RAM空間中。
為內(nèi)核設(shè)置啟動參數(shù)
調(diào)?內(nèi)核
1. Boot Loader的stage1
1. 基本的硬件初始化
這是Boot Loader ?開始就執(zhí)?的操作,其?的是為stage2的執(zhí)?以及隨后的kernel的執(zhí)?準(zhǔn)備好?些基本的硬件環(huán)境。它通常包括以下步驟
(以執(zhí)?的先后順序):
1. 屏蔽所有的中斷。為中斷提供服務(wù)器通常是OS設(shè)備驅(qū)動程序的責(zé)任,因此在Boot Loader的執(zhí)?全過程中可以不必響
應(yīng)任何中斷。中斷屏蔽可以通過寫CPU的中斷屏蔽寄存器或狀態(tài)寄存器(?如ARM的CPSR寄存器)來完成。
2. 設(shè)置CPU的速度和時(shí)鐘頻率。
3. RAM初始化。包括正確地設(shè)置系統(tǒng)的內(nèi)存控制器的功能寄存器以及各內(nèi)存控制寄存器等。
4. 初始化LED。典型地,通過GPIO來驅(qū)動LED,其?的是表明系統(tǒng)的狀態(tài)是OK還是Error。如果板?上沒有LED,那么
也可以通過初始化UART向串?打印Boot Loader的Logo字符信息來完成這?點(diǎn)。
5. 關(guān)閉CPU內(nèi)部指令/數(shù)據(jù) cache。
2. 為加載 stage2 準(zhǔn)備 RAM 空間
為了后?的敘述?便,這?把所安排的RAM空間范圍的??記為:stage2_size(字節(jié)),把起始地址和終?地址分別記為: stage2_start 和
stage2_end (這兩個(gè)地址均以4字節(jié)邊界對齊)。
因此:
stage2_end = stage2_start + stage2_size
另外,還必須確保所安排的地址范圍的的確確是可讀寫的RAM空間,因此,必須對你所安排的地址范圍進(jìn)?測試。
3. 拷貝stage2到RAM中
拷貝時(shí)要確定兩點(diǎn):
1. stage2的可執(zhí)?映像在固態(tài)存儲設(shè)備的存放地址和終?地址。
2. RAM空間的起始地址。
4. 設(shè)置堆棧指針sp
堆棧指針的設(shè)置是為了執(zhí)? C 語?代碼作為準(zhǔn)備。通常我們可以把sp的值設(shè)置為(stage2_end - 4), 也即在上?所安排的那個(gè)1MB的RAM空間
的最頂端(堆棧向下?長)。
此外,在設(shè)置堆棧指針 sp 之前,也可以關(guān)閉 led 燈,以提??戶我們準(zhǔn)備跳轉(zhuǎn)到stage2。經(jīng)過上述這些執(zhí)?步驟后,系統(tǒng)的物理內(nèi)存布局應(yīng)該
如下圖。
image_-159.6kB
image_-159.6kB
5. 跳轉(zhuǎn)到 stage2 的 C ??點(diǎn)
在上述?切都就緒后,就可以跳轉(zhuǎn)到 Boot Loader 的 stage2 去執(zhí)?了。?如,在 ARM 系統(tǒng)中,這可以通過修改 PC 寄存器為合適的地址來
實(shí)現(xiàn)。
2. Boot Loader 的 stage2
1. 初始化本階段要使?到的硬件設(shè)備
這通常包括:
1. 初始化?少?個(gè)串?,以便和終端?戶進(jìn)?I/O輸出信息
2. 初始化計(jì)時(shí)器等。在初始化這些設(shè)備之前,也可以重新把LED燈點(diǎn)亮,以表明我們已經(jīng)進(jìn)? main() 函數(shù)執(zhí)?。設(shè)備初
始化完成后,可以輸出?些打印信息,程序名字字符串、版本號等。
2. 檢測系統(tǒng)的內(nèi)存映射 (memory map)
所謂內(nèi)存映射就是指在整個(gè)4GB物理地址空間中有哪些地址范圍被分配?來尋址系統(tǒng)的RAM單元。
?如,在SA-1100 CPU中,從0xC000,0000開始的512地址空間被?作系統(tǒng)的RAM地址空間,?在 Samsung S3C44B0X CPU中,從
0x0c00,0000到0x1000,0000之間的64M地址空間被?作系統(tǒng)的RAM地址空間。
雖然 CPU 通常預(yù)留出??段?夠的地址給系統(tǒng)RAM,但是在搭建具體的嵌?式系統(tǒng)時(shí)不?定會實(shí)現(xiàn) CPU 預(yù)留的全部 RAM 地址空間。
3. 加載內(nèi)核映像和根?件系統(tǒng)映像
1. 規(guī)劃內(nèi)存占?的布局
這?包括兩個(gè)??:內(nèi)核映像所占?的內(nèi)存范圍;根?件系統(tǒng)所占?的內(nèi)存范圍。在規(guī)劃內(nèi)存占?的布局時(shí),主要考
慮基地址和映像的??兩個(gè)??。
2. 從 Flash 上拷貝
由于像 ARM 這樣的嵌?式CPU通常都是在統(tǒng)?的內(nèi)存地址空間中尋址Flash等固態(tài)存儲設(shè)備的,因此從Flash上讀取
數(shù)據(jù)與從 RAM 單元中讀取數(shù)據(jù)并沒有什么不同。
??個(gè)簡單的循環(huán)就可以完成從Flash設(shè)備上拷貝映像的?作:
while(count){
*dest++ = *src++; /*都是以字節(jié)?式對齊*/
count -= 4; /*字節(jié)數(shù)*/
};
4. 設(shè)置內(nèi)核的啟動參數(shù)
應(yīng)該說,在將內(nèi)核映像和根?件系統(tǒng)映像拷貝到 RAM 空間中后,就可以準(zhǔn)備啟動 Linux 內(nèi)核了。
但是在調(diào)?內(nèi)核之前,應(yīng)該作進(jìn)?步準(zhǔn)備?作,即:設(shè)置Linux內(nèi)核的啟動參數(shù)。
5. 調(diào)?內(nèi)核
Boot Loader 調(diào)? Linux 內(nèi)核的?法是直接跳轉(zhuǎn)到內(nèi)核的第?條指令處,也即直接跳轉(zhuǎn)到 MEM_START+0x8000 地址處。

本文發(fā)布于:2023-05-24 03:18:48,感謝您對本站的認(rèn)可!
本文鏈接:http://www.newhan.cn/zhishi/a/168486952851870.html
版權(quán)聲明:本站內(nèi)容均來自互聯(lián)網(wǎng),僅供演示用,請勿用于商業(yè)和其他非法用途。如果侵犯了您的權(quán)益請與我們聯(lián)系,我們將在24小時(shí)內(nèi)刪除。
本文word下載地址:BootLoader的啟動流程.doc
本文 PDF 下載地址:BootLoader的啟動流程.pdf
| 留言與評論(共有 0 條評論) |