BootLoader
一. BootLoader簡介
在專用的嵌入式闆子運作GNU/Linux系統已經變得越來越流行。一個嵌入式Linux系統從軟體的角度看通常可以分為四個層次:
1、 引導加載程式。包括固化在固件(firmware)中的boot代碼(可選),和BootLoader兩大部分。
2、 Linux核心。特定于嵌入式闆子的定制核心以及核心的啟動參數。
3、 檔案系統。包括根檔案系統和建立于Flash記憶體裝置之上檔案系統。通常用ramdisk來作為rootfs。
4、 使用者應用程式。特定于使用者的應用程式。有時在使用者應用程式和核心層之間可能還會包括一個嵌入式圖形使用者界面。常用的嵌入式GUI有:MicroWindows和MiniGUI懂。
引導加載程式是系統加電後運作的第一段軟體代碼。PC機中的引導加載程式由BIOS(其本質就是一段固件程式)和位于硬碟MBR中的OS BootLoader(比如,LILO和GRUB等)一起組成。BIOS在完成硬體檢測和資源配置設定後,将硬碟MBR中的BootLoader讀到系統的RAM中,然後将控制權交給OS BootLoader。BootLoader的主要運作任務就是将核心映象從硬碟上讀到 RAM 中,然後跳轉到核心的入口點去運作,也即開始啟動作業系統。
而在嵌入式系統中,通常并沒有像BIOS那樣的固件程式(注,有的嵌入式CPU也會内嵌一段短小的啟動程式),是以整個系統的加載啟動任務就完全由BootLoader來完成。比如在一個基于ARM7TDMI core的嵌入式系統中,系統在上電或複位時通常都從位址0x00000000處開始執行,而在這個位址處安排的通常就是系統的BootLoader程式。
簡單地說,BootLoader就是在作業系統核心運作之前運作的一段小程式。通過這段小程式,我們可以初始化硬體裝置、建立記憶體空間的映射圖,進而将系統的軟硬體環境帶到一個合适的狀态,以便為最終調用作業系統核心準備好正确的環境。
通常,BootLoader是嚴重地依賴于硬體而實作的,特别是在嵌入式世界。是以,在嵌入式世界裡建立一個通用的BootLoader幾乎是不可能的。盡管如此,我們仍然可以對BootLoader歸納出一些通用的概念來,以指導使用者特定的BootLoader設計與實作。
二、常見bootloader介紹
1.U-BOOT介紹
uboot是一個龐大的公開源碼的軟體。他支援一些系列的arm體系,包含常見的外設的驅動,是一個功能強大的闆極支援包。其代碼可以從http://sourceforge.net/projects/u-boot下載下傳
U-BOOT是由PPCBOOT發展起來的,是PowerPC、ARM9、Xscale、X86等系統通用的Boot方案,從官方版本 0.3.2開始全面支援SC系列單闆機。u-boot是一個open source的bootloader,目前版本是0.4.0。u-boot是在ppcboot以及armboot的基礎上發展而來,雖然宣稱是0.4.0版本,卻相當的成熟和穩定,已經在許多嵌入式系統開發過程中被采用。由于其開發源代碼,其支援的開發闆衆多。唯一遺憾的是并不支援我們現在學習所用samsung 44B0X的開發闆。
為什麼我們需要u-boot?顯然可以将ucLinux直接燒入flash,進而不需要額外的引導裝載程式(bootloader)。但是從軟體更新的角度以及程式修補的來說,軟體的自動更新非常重要。事實上,引導裝載程式(bootloader)的用途不僅如此,但僅從軟體的自動更新的需要就說明我們的開發是必要的。
同時,u-boot移植的過程也是一個對嵌入式系統包括軟硬體以及作業系統加深了解的一個過程。
2。vivi介紹(下載下傳位址http://www.mizi.com/developer)
vivi是南韓mizi 公司開發的bootloader, 适用于ARM9處理器。 Vivi有兩種工作模式:啟動加載模式和下載下傳模式。啟動加載模式可以在一段時間後(這個時間可更改)自行啟動linux核心,這時vivi的預設模式。在下載下傳模式下,vivi為使用者提供一個指令行接口,通過接口可以使用vivi提供的一些指令,如下:
指令
功能
Load
把二進制檔案載入Flash或RAM
Part
操作MTD分區資訊。顯示、增加、删除、複位、儲存MTD分區
Param
設定參數
Boot
啟動系統
Flash
管理Flash,如删除Flash的資料
vivi代碼分析
vivi的代碼包括arch,init,lib,drivers和include等幾個目錄,共200多條檔案。
Vivi主要包括下面幾個目錄:
arch:此目錄包括了所有vivi支援的目标闆的子目錄,例如s3c2410目錄。
drivers:其中包括了引導核心需要的裝置的驅動程式(MTD和序列槽)。MTD目錄下分map、nand和nor三個目錄。
init:這個目錄隻有main.c和version.c兩個檔案。和普通的C程式一樣,vivi将從main函數開始執行。
lib:一些平台公共的接口代碼,比如time.c裡的udelay()和mdelay()。
include:頭檔案的公共目錄,其中的s3c2410.h定義了這塊處理器的一些寄存器。Platform/smdk2410.h定義了與開發闆相關的資源配置參數,我們往往隻需要修改這個檔案就可以配置目标闆的參數,如波特率、引導參數、實體記憶體映射等。
BSP
BSP闆級支援包(board support package),是介于主機闆硬體和作業系統中驅動層程式之間的一層,一般認為它屬于作業系統一部分,主要是實作對作業系統的支援,為上層的驅動程式提供通路硬體裝置寄存器的函數包,使之能夠更好的運作與硬體主機闆。在嵌入式系統軟體的組成中,就有BSP。BSP是相對于作業系統而言的,不同的作業系統對應于不同定義形式的BSP,例如VxWorks的BSP和Linux的BSP相對于某一CPU來說盡管實作的功能一樣,可是寫法和接口定義是完全不同的,是以寫BSP一定要按照該系統BSP的定義形式來寫(BSP的程式設計過程大多數是在某一個成型的BSP模闆上進行修改)。這樣才能與上層OS保持正确的接口,良好的支援上層OS。
SDK
百科名片
SDK(Software Development Kit, 即軟體開發工具包 )一般是一些被軟體工程師用于為特定的軟體包、軟體架構、硬體平台、作業系統等建立應用軟體的開發工具的集合。
基本資訊
SDK,Software Development Kit 的縮寫,中文即“軟體開發工具包”。廣義上指輔助開發某一類軟體的相關文檔、範例和工具的集合。一般而言,SDK即開發 Windows 平台下的應用程式所使用的SDK。
相關背景
API
API”,也就是 Application Programming Interface,其實就是作業系統留給應用程式的一個調用接口,應用程式通過調用作業系統的 API 而使作業系統去執行應用程式的指令(動作)。其實早在 DOS 時代就有 API 的概念,隻不過那個時候的 API 是以中斷調用的形式(INT 21h)提供的,在 DOS 下跑的應用程式都直接或間接的通過中斷調用來使用作業系統功能,比如将 AH 置為 30h 後調用 INT 21h 就可以得到 DOS 作業系統的版本号。而在 Windows 中,系統 API 是以函數調用的方式提供的。同樣是取得作業系統的版本号,在 Windows 中你所要做的就是調用 GetVersionEx() 函數。
可以這麼說,DOS API 是“Thinking in 彙編語言”的,而 Windows API 則是“Thinking in 進階語言”的。
DOS API 是系統程式的一部分,他們與系統一同被載入記憶體并且可以通過中斷矢量表找到他們的入口,那麼 Windows API 呢?要說明白這個問題就不得不引入我們下面要介紹得這個概念——DLL。
DLL
DLL,即 Dynamic Link Library(動态連結庫)。在windows環境下含有大量 .dll 格式的檔案,這些檔案就是動态連結庫檔案,其實也是一種可執行檔案格式。跟 .exe 檔案不同的是,.dll 檔案不能直接執行,他們通常由 .exe 在執行時裝入,内含有一些資源以及可執行代碼等。其實 Windows 的三大子產品就是以 DLL 的形式提供的(Kernel32.dll,User32.dll,GDI32.dll),裡面就含有了 API 函數的執行代碼。為了使用 DLL 中的 API 函數, 必須要有 API 函數的聲明(.H)和其導入庫(.LIB),導入庫可以先這樣了解:導入庫是為了在 DLL 中找到 API 的入口點而使用的。