注意:很多初學(xué)者總是將啟動(dòng)代碼和Bootloader聯(lián)系在一起,這是錯(cuò)誤的
什么是啟動(dòng)代碼?
啟動(dòng)代碼是系統(tǒng)上電或者復(fù)位后運(yùn)行的第一段代碼,是進(jìn)入C 語言的main 函數(shù)之前需要執(zhí)行的那段匯編代碼。
啟動(dòng)代碼有何用?
它的作用是在用戶程序運(yùn)行之前對(duì)系統(tǒng)硬件及軟件環(huán)境進(jìn)行必要的初始化并在最后使程序跳轉(zhuǎn)到用戶程序。它直接面對(duì)ARM 處理器內(nèi)核及硬件控制器進(jìn)行編程,所執(zhí)行的操作與具體的目標(biāo)系統(tǒng)緊密相關(guān)。
C語言程序的運(yùn)行需要具備一定的條件,如分配好外部數(shù)據(jù)空間,堆棧空間和中斷入口等。另外,匯編代碼可以更直接地對(duì)硬件進(jìn)行操作,效率更高,這對(duì)啟動(dòng)中斷等對(duì)時(shí)間要求更高的情況是非常必要的
什么是Bootloader?
Bootloader不是一段代碼,它是一個(gè)具有引導(dǎo)裝載功能的完整的程序,如可以引導(dǎo)裝載linux的vivi,uboot,以及通常PC機(jī)上的BOIS程序等。
啟動(dòng)代碼和Bootloader關(guān)系?
Bootloader也包含了相應(yīng)的啟動(dòng)代碼,也就是說,啟動(dòng)代碼是Bootloader的一部分,是所有相應(yīng)應(yīng)用程序的一部分。
Bootloader講解
簡單地說,BootLoader 就是在操作系統(tǒng)內(nèi)核運(yùn)行之前運(yùn)行的一段小程序。通過這段小程序,我們可以初始化硬件設(shè)備、建立內(nèi)存空間的映射圖,從而將系統(tǒng)的軟硬件環(huán)境帶到一個(gè)合適的狀態(tài),以便為最終調(diào)用操作系統(tǒng)內(nèi)核準(zhǔn)備好正確的環(huán)境。
系統(tǒng)加電或復(fù)位后,所有的 CPU 通常都從某個(gè)由 CPU 制造商預(yù)先安排的地址上取指令。這是由處理器設(shè)計(jì)決定的。比如,基于 ARM7TDMI core 的 CPU 在復(fù)位時(shí)通常都從地址 0x00000000 取它的第一條指令。而基于 CPU 構(gòu)建的嵌入式系統(tǒng)通常都有某種類型的固態(tài)存儲(chǔ)設(shè)備(比如:ROM、EEPROM 或 FLASH 等)被映射到這個(gè)預(yù)先安排的地址上。因此在系統(tǒng)加電后,CPU 將首先執(zhí)行 Boot Loader 程序。
Boot Loader 的操作模式
通常多階段的 Boot Loader 能提供更為復(fù)雜的功能,以及更好的可移植性。大多數(shù) Boot Loader 都包含兩種不同的操作模式:"啟動(dòng)加載"模式和"下載"模式,這種區(qū)別僅對(duì)于開發(fā)人員才有意義。但從最終用戶的角度看,Boot Loader 的作用就是用來加載操作系統(tǒng),而并不存在所謂的啟動(dòng)加載模式與下載工作模式的區(qū)別。
啟動(dòng)加載(Boot loading)模式:這種模式也稱為"自主" (Autonomous)模式。也即 Boot Loader 從目標(biāo)機(jī)上的某個(gè)固態(tài)存儲(chǔ)設(shè)備上將操作系統(tǒng)加載到 RAM 中運(yùn)行,整個(gè)過程并沒有用戶的介入。這種模式是 Boot Loader 的正常工作模式,因此在嵌入式產(chǎn)品發(fā)布的時(shí)侯,BootLoader 顯然必須工作在這種模式下。
下載(Downloading)模式:在這種模式下,目標(biāo)機(jī)上的 Boot Loader 將通過串口連接或網(wǎng)絡(luò)連接等通信手段從主機(jī)(Host)下載文件,比如:下載內(nèi)核映像和根文件系統(tǒng)映像等。從主機(jī)下載的文件通常首先被
Boot Loader 保存到目標(biāo)機(jī)的 RAM 中,然后再被 Boot Loader 寫到目標(biāo)機(jī)上的FLASH 類固態(tài)存儲(chǔ)設(shè)備中。
Boot Loader的組成
從操作系統(tǒng)的角度看,BootLoader 的總目標(biāo)就是正確地調(diào)用內(nèi)核來執(zhí)行。另外,由于 Boot Loader 的實(shí)現(xiàn)依賴于 CPU 的體系結(jié)構(gòu),因此大多數(shù) Boot Loader 都分為 stage1 和 stage2 兩大部分。依賴于 CPU 體系結(jié)構(gòu)的代碼,比如設(shè)備初始化代碼等,通常都放在 stage1 中,而且通常都用匯編語言來實(shí)現(xiàn),以達(dá)到短小精悍的目的。而 stage2 則通常用C語言來實(shí)現(xiàn),這樣可以實(shí)現(xiàn)給復(fù)雜的功能,而且代碼會(huì)具有更好的可讀性和可移植性。
一、Boot Loader 的 stage1 通常包括以下步驟(以執(zhí)行的先后順序)
首先是硬件設(shè)備初始化。這是 Boot Loader 一開始就執(zhí)行的操作,其目的是為 stage2 的執(zhí)行以及隨后的 kernel 的執(zhí)行準(zhǔn)備好一些基本的硬件環(huán)境。它通常包括以下步驟(以執(zhí)行的先后順序):
1.屏蔽所有的中斷。為中斷提供服務(wù)通常是 OS 設(shè)備驅(qū)動(dòng)程序的責(zé)任,因此在 Boot Loader 的執(zhí)行全過程中可以不 必響應(yīng)任何中斷。中斷屏蔽可以通過寫 CPU的中斷屏蔽寄存器或狀態(tài)寄存器(比如 ARM 的 CPSR 寄存器)來完 成。
2.設(shè)置 CPU 的速度和時(shí)鐘頻率。
3.RAM 初始化。包括正確地設(shè)置系統(tǒng)的內(nèi)存控制器的功能寄存器以及各內(nèi)存庫控制寄存器等。
等。
之后是下面的步驟:
為加載Boot Loader 的 stage2 準(zhǔn)備 RAM 空間。
拷貝Boot Loader 的 stage2 到 RAM 空間中。
設(shè)置好堆棧。
跳轉(zhuǎn)到stage2 的 C 入口點(diǎn)。
二、Boot Loader的 stage2 通常包括以下步驟(以執(zhí)行的先后順序)
初始化本階段要使用到的硬件設(shè)備。
檢測系統(tǒng)內(nèi)存映射(memory map)。
將kernel 映像和根文件系統(tǒng)映像從 flash 上讀到RAM 空間中。
為內(nèi)核設(shè)置啟動(dòng)參數(shù)。
調(diào)用內(nèi)核。
下面這個(gè)截圖是在一篇PDF文檔上看到的,覺的不錯(cuò),貼在此處。
bootloader的最終目的是啟動(dòng)內(nèi)核,又為了方便開發(fā),可以加入串口、網(wǎng)卡、燒寫flash等功能。
|