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