BLOB啟動流程與Bootloader程序可移植性研究
在嵌入式系統(tǒng)應(yīng)用中,通過引導(dǎo)程序(Bootloader)可以初始化硬件設(shè)備、建立內(nèi)存空間的映射圖、加載內(nèi)核,從而將系統(tǒng)的軟硬件環(huán)境帶到一個合適的狀態(tài),以便為最終調(diào)用操作系統(tǒng)內(nèi)核準備好正確的環(huán)境[1]。Bootloader依賴于實際的硬件和應(yīng)用環(huán)境,對于不同的硬件架構(gòu)以及相同架構(gòu)的不同電路板,都需要不同的Bootloader。由于單獨開發(fā)Bootloader的工作量較大,因此開發(fā)人員一般針對固定體系構(gòu)架開發(fā)一種可移植性的Bootloader,使之能夠在少量修改后應(yīng)用于同一體系構(gòu)架的其他電路板。BLOB就是一種針對ARM體系定制的可移植性良好的嵌入式Linux引導(dǎo)程序。BLOB支持多種CPU,包括SA1100、SA1110、PXA255、PXA270等,用戶可以根據(jù)目標板的特性進行定制。它能實現(xiàn)以下功能:
(1)引導(dǎo)嵌入式Linux,它可以把Linux、Kernel等從Flash加載到RAM中執(zhí)行;
(2)命令行下在線更新BLOB、Kernel和ramdisk;
(3)命令行下可以直接對物理尋址空間進行查看和修改。
可見BLOB除了引導(dǎo)系統(tǒng)這個基本功能外,還具備板級支持包(BSP)開發(fā)的功能。
系統(tǒng)的啟動通常有兩種方式,一種是可以直接Flash 啟動,另一種是可以將壓縮的內(nèi)存映像文件從Flash中復(fù)制、解壓到RAM,再從RAM啟動。系統(tǒng)上電時,BLOB采用后者,啟動過程分兩個階段進行,其中第一階段在Flash中運行,第二階段在RAM中運行。圖1為BLOB啟動流程圖。
1.1 第一階段
第一階段為從系統(tǒng)上電后在0x00000000 地址開始執(zhí)行的部分。這部分代碼運行在Flash中,其目的是為第二階段(stage 2)的執(zhí)行以及隨后的Kernel的執(zhí)行準備好基本的硬件環(huán)境[2]。
(1)屏蔽所有的中斷
為中斷提供服務(wù)通常是OS設(shè)備驅(qū)動程序的責任,因此在Bootloader的執(zhí)行全過程中不必響應(yīng)任何中斷。中斷屏蔽可以通過寫CPU的中斷屏蔽寄存器或狀態(tài)寄存器(如ARM的CPSR寄存器)來完成。
(2)設(shè)置CPU的速度和時鐘頻率
(3)RAM初始化
包括正確地設(shè)置系統(tǒng)內(nèi)存控制器的功能寄存器以及各內(nèi)存庫控制寄存器等。
(4)LED初始化
通過GPIO來驅(qū)動LED,其目的是表明系統(tǒng)的狀態(tài)是否正常。如果板子上沒有LED,則可以通過初始化UART向串口打印 Bootloader的Logo字符信息來完成。
1.2 第二階段
第二階段是C語言執(zhí)行代碼,具體說明如下。
(1)UART設(shè)置及初始化
至少初始化一個串口,以便與終端用戶進行 I/O 輸出信息,初始化計時器等。設(shè)備初始化完成后,可以輸出一些打印信息、程序名字字符串、版本號等。
(2)設(shè)置系統(tǒng)的內(nèi)存映射
內(nèi)存映射是指在整個物理地址空間中有哪些地址被分配用來尋址系統(tǒng)的RAM單元。具體的嵌入式系統(tǒng)往往只把CPU預(yù)留的全部RAM地址空間中的一部分映射到RAM單元上,而讓剩下的部分預(yù)留RAM地址空間處于未使用狀態(tài)。因此Bootloader的 stage 2必須在使用它之前檢測整個系統(tǒng)的內(nèi)存映射情況。在用上述算法檢測完系統(tǒng)的內(nèi)存映射情況后,BLOB將內(nèi)存映射的詳細信息打印到串口。
(3)加載內(nèi)核映像和根文件系統(tǒng)映像
在規(guī)劃內(nèi)存占用的布局時,應(yīng)包括兩個方面:內(nèi)核映像所占用的內(nèi)存范圍;根文件系統(tǒng)所占用的內(nèi)存范圍。在規(guī)劃內(nèi)存占用布局時,主要考慮基地址和映像的大小兩個方面。
對于內(nèi)核映像,一般將其拷貝到從(MEM_START+0x8000)這個基地址開始的大約1MB大小的內(nèi)存范圍內(nèi)(嵌入式Linux的內(nèi)核一般都不超過1MB)。
而對于根文件系統(tǒng)映像,則一般將其拷貝到 MEM_START+0x0010,0000開始的地方。如果用Ramdisk作為根文件系統(tǒng)映像,則其解壓后的大小一般是1MB。
(4)設(shè)置Linux內(nèi)核的啟動參數(shù)。
(5)可以選擇直接調(diào)用內(nèi)核或者進入下載模式。
在下載模式下,BLOB將通過串口從主機(Host)下載文件,例如下載內(nèi)核映像和根文件系統(tǒng)映像等。
評論