bootloader启动流程分析
bootloader啟動(dòng)流程分析
?
1、Bootloader的概念和作用
? ? ? Bootloader是嵌入式系統(tǒng)的引導(dǎo)加載程序,它是系統(tǒng)上電后運(yùn)行的第一段程序。在完成對(duì)系統(tǒng)的初始化任務(wù)之后,它會(huì)將Flash中的Linux內(nèi)核拷貝到 RAM 中去,跳轉(zhuǎn)到內(nèi)核的第一條指令處繼續(xù)執(zhí)行,從而啟動(dòng) Linux 內(nèi)核。由此可見,bootloader和 Linux內(nèi)核密不可分,要想了解 Linux內(nèi)核的啟動(dòng)過程,我們必須先得了解 bootloader的執(zhí)行過程,這樣才能對(duì)嵌入式系統(tǒng)的整個(gè)啟過程有清晰的掌握。
?
2、常見的Bootloader
X86:LILO和GRUB
ARM: 每一種芯片都會(huì)有自己的Bootloader
PowerPC:ppcboot
MIPS:YAMON
U-BOOT支持以上所有平臺(tái),是bootloader介公認(rèn)的老大,因此接下來要深入學(xué)習(xí)U-BOOT。
?
3、Bootloader啟動(dòng)流程分析
? ? ? Bootloader啟動(dòng)的兩個(gè)階段: stage1 和 stage2兩大部分。 stage1 主要是一些依賴于 CPU 體系結(jié)構(gòu)的代碼。這一階段的代碼主要是通過匯編來實(shí)現(xiàn)的。 stage1 為位置無關(guān)代碼,通常在Flash 中運(yùn)行。所以有的指令為相對(duì)尋址,可以在任何位置運(yùn)行。stage2 則是通常用 C 語言來實(shí)現(xiàn),這樣可以實(shí)現(xiàn)更復(fù)雜的功能,而且代碼 會(huì)具有更好的可讀性和可移植性。
stage1負(fù)責(zé)的主要任務(wù)有:
???① 硬件設(shè)備初始化包括:關(guān)閉Watchdog、關(guān)閉中斷、設(shè)置 CPU 的速度和時(shí)鐘頻率、配置SDRAM 存儲(chǔ)控制器及 IO、關(guān)閉處理器內(nèi)部指令/數(shù)據(jù) Cache 等;
???② 為加載Bootloader 的 stage2 代碼準(zhǔn)備 RAM ;
???③ 復(fù)制 Bootloader的 stage2 代碼到 RAM 中;
???④ 設(shè)置堆棧;
???⑤ 跳轉(zhuǎn)到 stage2的 C 函數(shù)入口點(diǎn)。
stage2 負(fù)責(zé)的主要任務(wù)有:
??? ① 硬件設(shè)備的初始化(如串口、Flash和網(wǎng)卡等);
??? ② 系統(tǒng)的內(nèi)存映射檢測(cè);
??? ③將內(nèi)核映像從 Flash 讀到 RAM 中;
??? ④ 設(shè)置內(nèi)核啟動(dòng)參數(shù);
??? ⑤ 調(diào)用內(nèi)核。
Bootloader 調(diào)用內(nèi)核的方法就是直接跳轉(zhuǎn)到內(nèi)核的第一條指令處。在調(diào)用內(nèi)核之前下列的條件必須要滿足:
(1) CPU 寄存器的設(shè)置
??? ① R0 為 0;
??? ② R1 為機(jī)器碼;
??? ③ R2 為啟動(dòng)參數(shù),標(biāo)記列表在RAM 中的起始基地址。
(2)CPU 工作模式
??? ① 必須禁止中斷( IRQ 和 FIQ);
??? ② CPU 必須設(shè)置為 SVC 模式。
(3)Cache 和 MMU 的設(shè)置
??? ① MMU 必須關(guān)閉;
??? ② 指令 Cache 可以打開或關(guān)閉;
??? ③ 數(shù)據(jù) Cache 必須關(guān)閉。
?
4、uboot簡(jiǎn)介
? ? U-Boot,全稱Universal Boot Loader,遵循GPL 條款。為什么我們要選用U-Boot 作為Bootloader 呢?
??? ①開放源碼;
??? ②對(duì)多種嵌入式操作系統(tǒng)內(nèi)核的支持,如Linux、QNX等;
??? ③對(duì)多個(gè)處理器系列的支持,如X86、PowerPC 、ARM等;
??? ④較好的穩(wěn)定性和可靠性;
??? ⑤功能的設(shè)置較為靈活,適合U-Boot 調(diào)試、操作系統(tǒng)不同引導(dǎo)要求、產(chǎn)品發(fā)布等;
??? ⑥豐富的設(shè)備驅(qū)動(dòng)源碼,如串口、以太網(wǎng)等。
?
5、U-BOOT代碼結(jié)構(gòu)分析
U-BOOT目錄下有多個(gè)子目錄,分別存放管理不同的源程序。這些目錄下所要存放的文件有其規(guī)則,可以分成三類:
第一類目錄與處理器體系結(jié)構(gòu)或者開發(fā)板硬件直接相關(guān);
第二類目錄是一些通用的函數(shù)或者驅(qū)動(dòng)程序;
第三類目錄是 U-BOOT 的應(yīng)用程序、工具或者文檔。
U-BOOT目錄結(jié)構(gòu)
| board | 本目錄存放與已有開發(fā)板相關(guān)的文件。每種開發(fā)板有一個(gè)子目錄,子目錄僅存放與開發(fā)板相關(guān)的c文件和配置文件,不包含開發(fā)板CPU架構(gòu)通用的實(shí)現(xiàn)文件。 |
| common | 實(shí)現(xiàn)基本命令,一條命令一個(gè)文件 |
| CPU | 與CPU 架構(gòu)相關(guān)的目錄,每款CPU或架構(gòu)在一個(gè)子目錄下。其中的子目錄都是以 U-BOOT 所支持的 CPU 為名,比如有子目錄 mips、 mpc8260等,每個(gè)子目錄中都包括Makefile、config.mk、interrupt.c、cpu.c和serials.c和 start.S。 |
| disk | 對(duì)磁盤的支持 |
| doc | 文檔目錄 |
| drivers | 存放設(shè)備驅(qū)動(dòng)程序的目錄,mmc、串口等 |
| examples | 一些獨(dú)立運(yùn)行的應(yīng)用程序的例子。 |
| fs | 支持的文件系統(tǒng)。如ext2、yaffs2、jffs2等文件系統(tǒng) |
| include | 需要的頭文件都在該目錄下,和各種平臺(tái)所支持的匯編文件,系統(tǒng)配置文件和對(duì)文件系統(tǒng)所支持的文件,其configs 子目錄下與目標(biāo) 板相關(guān)的配置頭文件是移植過程中經(jīng)常要修改的文件。 |
| net | 與網(wǎng)絡(luò)協(xié)議棧相關(guān)的代碼。BOOTP 協(xié)議、 TFTP 協(xié)議 RARP協(xié)議和 NFS 文件系統(tǒng)的實(shí)現(xiàn)。 |
| lib | 庫(kù)文件 |
| post | 上電自檢。 |
| tools | 生成U-BOOT的工具,例如mkimage等 |
?
后面分析uboot時(shí)的一些參考手冊(cè):
(1)ARM Architecture Reference Manual.pdf
(2)S5PV210_iROM_ApplicationNote_Preliminary_20091126.pdf
(3)S5PV210_UM_REV1.1.pdf
總結(jié)
以上是生活随笔為你收集整理的bootloader启动流程分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 压缩文件命令
- 下一篇: 记录一次重装win10系统的流程