嵌入式系統的BootLoader技術淺析_啟動過程
阿新 • • 發佈:2019-02-06
論文導讀::嵌入式系統是以應用為中心、以計算機為基礎、軟硬體可裁剪。即啟動過程可分為階段1和階段2兩個部分。技術概述。
論文關鍵詞:嵌入式系統,啟動過程,BootLoader技術
一 BootLoader技術概述
嵌入式系統是以應用為中心、以計算機為基礎、軟硬體可裁剪,適用於系統對功能、可靠性、成本、功耗嚴格要求的專用計算機系統。計算機系統都具有相應的載入程式,對於嵌入式系統在執行主程式之前要執行一些初始化的過程來完成對系統的初始化,並創造嵌入式程式執行的環境。我們熟悉的PC中的載入程式一般BIOS和位於MBR的 OS bootloader(例如 LILO 或者 GRUB)一起組成。
在嵌入式系統中,出於經濟方面的考慮一般不配置 BIOS,在嵌入式系統中,通常採用BootLoader技術來啟動程式。啟動時用於完成初始化操作的程式碼被稱為BootLoader 程式,整個系統的載入啟動任務就由 BootLoader來完成。通過這段程式,可以初始化硬體裝置、建立記憶體空間的對映圖啟動過程,從而將系統的軟硬體環境設定在一個合適的狀態,以便為呼叫作業系統核心準備好正確的環境。BootLoader依賴於硬體和應用環境,不同的CPU有不同的 Bootloader。即使他們是基於同一種 CPU,要想讓執行在一塊目標板上的Bootloader程式也能執行在另一塊板子上,通常也需要對BootLoader的源程式進行修改。因此,對 Bootloader 進行分析,並找出其中的規律和原理,使得BootLoader 運行於各種不同的硬體平臺。
二 BootLoader 技術的基本特徵
1 BootLoader 安裝地址的固定性
系統加電或復位後,CPU 通常都從由CPU 製造商預先安排好的地址上取指令, 如XScale 核心的CPU 通常都從地址0x00000000處取它的第一條指令。基於這種CPU 構建的嵌入式系統通常都有某種型別的固態儲存裝置被對映到這個預先安排的地址上。所以系統加電後,CPU 將首先執行BootLoader 的程式。
圖 1 是一個同時裝有BootLoader、核心的啟動引數、核心映像和根檔案系統映像的固態儲存裝置的典型空間分配圖。
圖1 固態儲存裝置的典型空間分配結構圖
2 BootLoader 的多階段性
通常多階段的BootLoader 能提供複雜的功能以及較好的可移植性。在有作業系統的情況下, 從固態儲存裝置上啟動的BootLoader 一般都是分成兩個階段進行啟動,即啟動過程可分為階段1和階段2兩個部分。階段1一般用匯編語言編寫,而階段2用高階語言C編寫。
(3) BootLoader的多操作模式性
大多數的BootLoader都包含兩種不同的操作方式,即啟動載入模式和下載模式論文開題報告範文。啟動模式也稱為“自主”模式,即BootLoader從目標機的某個固態儲存裝置上將作業系統載入到RAM中執行,整個過程不需要使用者的介入。下載模式就是目標機上的BootLoader將通過串列埠連線或網路連線等通訊手段從主機上下載檔案。從主機上下載的檔案通常首先被BootLoader儲存到目標機的RAM中,然後再被BootLoader寫到目標機的Flash類固態儲存裝置中。BootLoader的這種模式通常在第一次安裝核心與根檔案系統時被使用,此外,以後的系統更新也會使用BootLoader的這種工作模式。功能強大的BootLoader一般可以支援這兩種操作模式。
三 BootLoader的初始化過程
BootLoader 的初始化不但過程與具體的目標系統和開發系統有關啟動過程,而且還與有無作業系統有關係,通常可分為兩大類:帶作業系統的和不帶作業系統BootLoader 。
1 不帶作業系統的 BootLoader載入
此類BootLoader的載入和功能相對簡單,是最簡單的BootLoader,叫硬體啟動載入程式更合適一些。其載入流程和完成的主要功能包括:分配中斷向量表;初始化儲存器系統;初始化堆疊;初始化有特殊要求的埠、裝置;初始化應用程式執行環境;改變處理器模式;呼叫主應用程式,即最後跳到main[]函式執行應用程式,具體流程如圖2所示。
2 帶作業系統的 BootLoader載入
為了便於描述說明,首先做一個假定:假定核心映像與根檔案系統映像被載入到RAM中執行,因為核心映像與根檔案系統映像也可以直接在ROM或快閃記憶體這樣的固態儲存裝置中執行。
從作業系統的角度看,BootLoader的總目標就是正確呼叫核心來執行。BootLoader的實現依賴於CPU的體系結構,大多數BootLoader都分為階段1和階段2兩個部分。依賴於CPU體系結構的程式碼,比如初始化裝置等,通常都放在階段1中,並且用匯編語言來實現,以達到短小精悍的目的。而在階段2,則通常用C語言來實現,這樣可以實現一些複雜的功能,而且使程式碼具有更好的可讀性和可移植性。圖3詳細描述了階段1和階段2的具體實現步驟。
(1)BootLoader階段1詳細分析
①基本的硬體初始化。這是BootLoader最開始就執行的操作,其目的是為階段2的執行以及隨後的核心執行準備好一些基本的硬體環境,通常包含以下步驟:遮蔽所有的中斷;設定CPU的速度和時鐘頻率;RAM初始化啟動過程,包括正確設定系統的記憶體控制器的功能暫存器以及各記憶體庫控制暫存器等;初始化LED;關閉CPU內部指令/資料Cache。
②為載入階段2準備RAM空間。為了獲得更快的執行速度,通常把階段2載入到RAM空間中執行,因此必須為載入BootLoader的階段2準備好一段可用的RAM空間範圍。由於階段2通常是C語言執行程式碼,因此在考慮空間大小時,除了考慮階段2可執行的映像大小外,還必須將堆疊空間也考慮進來。此外,空間大小最好是記憶體頁大小的倍數。一般而言,1MB的RAM空間就足夠了。
③將階段2的核心映像和根檔案映像複製到RAM中。
④設定堆疊指標SP。這是為了執行C語言程式碼而做的準備。
⑤跳轉到階段2的C入口點。
(2)BootLoader階段2詳細分析
階段2是用C語言來實現,但是與普通C語言應用程式不同的是,在編譯和連線BootLoader的程式時,不能使用glibc庫中的任何支援函式,這就帶來了一個問題:跳轉至main()的地址如何確定。一個巧妙的辦法是利用trampoline的概念,即用匯編寫一段trampoline小程式,並將其作為階段2可執行映像的執行入口點。然後在trampoline彙編小程式中用CPU跳轉指令跳入main()函式中去執行;而當main()返回時,CPU執行路徑顯然再次回到trampoline程式。簡言之:用trampoline小程式作為main()函式的外部包裹。階段2初始化的具體步驟如下:
①所需硬體初始化。一般指初始化本階段要使用的硬體裝置,包括:至少一個串列埠,以便和終端使用者進行I/O輸出資訊;計時器等。
②檢測系統的記憶體對映。所謂的儲存對映就是指在整個實體地址空間中被分配用來定址系統的RAM單元。雖然CPU通常預留出一大段足夠的地址空間給系統RAM,但是在搭建具體的嵌入式系統時,卻不一定實現CPU預留的全部RAM地址空間論文開題報告範文。所以啟動過程,BootLoader的階段2必須在它工作之前檢查整個記憶體對映情況。
③載入核心映像和根檔案系統映像。首先要規劃記憶體佔用的佈局。一般包括兩個方面:核心映像所佔用的記憶體範圍以及根檔案系統所佔用的記憶體範圍。在規劃記憶體佔用的佈局時,主要考慮基地址和映像大小的2個方面。其次要從快閃記憶體上覆制。由於像ARM這樣的嵌入式CPU通常都是在統一的記憶體地址空間中定址Flash等固態儲存裝置,因此從快閃記憶體上讀取資料與從RAM單元中讀取資料沒有什麼不同,用一個簡單的迴圈就可以完成快閃記憶體裝置上的複製映像工作。
④ 設定核心的啟動引數。一般來說,在將核心映像和根檔案系統映像複製到RAM空間後,就可以啟動核心了。但是在呼叫核心之前,先用設定核心的啟動引數。
⑤ 呼叫核心。BootLoader呼叫核心的方法是直接跳轉到核心的第一條指令處。在跳轉前,必須滿足下列條件:
●CPU暫存器的設定正確。
●CPU模式:必須禁止終端;CPU必須用SVC模式。
●Cache和MMU的設定:MMU必須關閉;指令Cache可以開啟也可以關閉;資料Cache必須關閉。
四 總結
BootLoader是作業系統和硬體的樞紐,它為作業系統核心的啟動提供了必要的條件和引數。啟動過程中BootLoader的初始化過程就是初始化CPU內部關鍵的暫存器、配置外圍硬體電路相關暫存器、建立中斷向量表等,然後跳轉到一般由高階語言編寫的主函式的應用程式程式碼去執行,這樣就可以利用高階語言來編寫完成系統設計所要求的各種功能。
參考文獻
[1]陳文智.嵌入式系統開發原理與實踐[M].北京:清華大學出版社,2005.69-81
[2]陳海軍,申衛昌,史穎.嵌入式系統載入程式詳探[J].計算機技術與發展,2006 ,1
[3]嚴菊明.基於ARM嵌入式系統的通用Bootloader的設計與實現[D]東南大學2005
[4]陳為軍,李正明,孫俊,馮麗芳.基於U-BOOT的S3C44B0載入程式設計實現[J]微計算機資訊2007.2
論文關鍵詞:嵌入式系統,啟動過程,BootLoader技術
一 BootLoader技術概述
嵌入式系統是以應用為中心、以計算機為基礎、軟硬體可裁剪,適用於系統對功能、可靠性、成本、功耗嚴格要求的專用計算機系統。計算機系統都具有相應的載入程式,對於嵌入式系統在執行主程式之前要執行一些初始化的過程來完成對系統的初始化,並創造嵌入式程式執行的環境。我們熟悉的PC中的載入程式一般BIOS和位於MBR的 OS bootloader(例如 LILO 或者 GRUB)一起組成。
在嵌入式系統中,出於經濟方面的考慮一般不配置 BIOS,在嵌入式系統中,通常採用BootLoader技術來啟動程式。啟動時用於完成初始化操作的程式碼被稱為BootLoader 程式,整個系統的載入啟動任務就由 BootLoader來完成。通過這段程式,可以初始化硬體裝置、建立記憶體空間的對映圖啟動過程,從而將系統的軟硬體環境設定在一個合適的狀態,以便為呼叫作業系統核心準備好正確的環境。BootLoader依賴於硬體和應用環境,不同的CPU有不同的 Bootloader。即使他們是基於同一種 CPU,要想讓執行在一塊目標板上的Bootloader程式也能執行在另一塊板子上,通常也需要對BootLoader的源程式進行修改。因此,對 Bootloader 進行分析,並找出其中的規律和原理,使得BootLoader 運行於各種不同的硬體平臺。
二 BootLoader 技術的基本特徵
1 BootLoader 安裝地址的固定性
系統加電或復位後,CPU 通常都從由CPU 製造商預先安排好的地址上取指令, 如XScale 核心的CPU 通常都從地址0x00000000處取它的第一條指令。基於這種CPU 構建的嵌入式系統通常都有某種型別的固態儲存裝置被對映到這個預先安排的地址上。所以系統加電後,CPU 將首先執行BootLoader 的程式。
圖 1 是一個同時裝有BootLoader、核心的啟動引數、核心映像和根檔案系統映像的固態儲存裝置的典型空間分配圖。
圖1 固態儲存裝置的典型空間分配結構圖
2 BootLoader 的多階段性
通常多階段的BootLoader 能提供複雜的功能以及較好的可移植性。在有作業系統的情況下, 從固態儲存裝置上啟動的BootLoader 一般都是分成兩個階段進行啟動,即啟動過程可分為階段1和階段2兩個部分。階段1一般用匯編語言編寫,而階段2用高階語言C編寫。
(3) BootLoader的多操作模式性
大多數的BootLoader都包含兩種不同的操作方式,即啟動載入模式和下載模式論文開題報告範文。啟動模式也稱為“自主”模式,即BootLoader從目標機的某個固態儲存裝置上將作業系統載入到RAM中執行,整個過程不需要使用者的介入。下載模式就是目標機上的BootLoader將通過串列埠連線或網路連線等通訊手段從主機上下載檔案。從主機上下載的檔案通常首先被BootLoader儲存到目標機的RAM中,然後再被BootLoader寫到目標機的Flash類固態儲存裝置中。BootLoader的這種模式通常在第一次安裝核心與根檔案系統時被使用,此外,以後的系統更新也會使用BootLoader的這種工作模式。功能強大的BootLoader一般可以支援這兩種操作模式。
三 BootLoader的初始化過程
BootLoader 的初始化不但過程與具體的目標系統和開發系統有關啟動過程,而且還與有無作業系統有關係,通常可分為兩大類:帶作業系統的和不帶作業系統BootLoader 。
1 不帶作業系統的 BootLoader載入
此類BootLoader的載入和功能相對簡單,是最簡單的BootLoader,叫硬體啟動載入程式更合適一些。其載入流程和完成的主要功能包括:分配中斷向量表;初始化儲存器系統;初始化堆疊;初始化有特殊要求的埠、裝置;初始化應用程式執行環境;改變處理器模式;呼叫主應用程式,即最後跳到main[]函式執行應用程式,具體流程如圖2所示。
2 帶作業系統的 BootLoader載入
為了便於描述說明,首先做一個假定:假定核心映像與根檔案系統映像被載入到RAM中執行,因為核心映像與根檔案系統映像也可以直接在ROM或快閃記憶體這樣的固態儲存裝置中執行。
從作業系統的角度看,BootLoader的總目標就是正確呼叫核心來執行。BootLoader的實現依賴於CPU的體系結構,大多數BootLoader都分為階段1和階段2兩個部分。依賴於CPU體系結構的程式碼,比如初始化裝置等,通常都放在階段1中,並且用匯編語言來實現,以達到短小精悍的目的。而在階段2,則通常用C語言來實現,這樣可以實現一些複雜的功能,而且使程式碼具有更好的可讀性和可移植性。圖3詳細描述了階段1和階段2的具體實現步驟。
(1)BootLoader階段1詳細分析
①基本的硬體初始化。這是BootLoader最開始就執行的操作,其目的是為階段2的執行以及隨後的核心執行準備好一些基本的硬體環境,通常包含以下步驟:遮蔽所有的中斷;設定CPU的速度和時鐘頻率;RAM初始化啟動過程,包括正確設定系統的記憶體控制器的功能暫存器以及各記憶體庫控制暫存器等;初始化LED;關閉CPU內部指令/資料Cache。
②為載入階段2準備RAM空間。為了獲得更快的執行速度,通常把階段2載入到RAM空間中執行,因此必須為載入BootLoader的階段2準備好一段可用的RAM空間範圍。由於階段2通常是C語言執行程式碼,因此在考慮空間大小時,除了考慮階段2可執行的映像大小外,還必須將堆疊空間也考慮進來。此外,空間大小最好是記憶體頁大小的倍數。一般而言,1MB的RAM空間就足夠了。
③將階段2的核心映像和根檔案映像複製到RAM中。
④設定堆疊指標SP。這是為了執行C語言程式碼而做的準備。
⑤跳轉到階段2的C入口點。
(2)BootLoader階段2詳細分析
階段2是用C語言來實現,但是與普通C語言應用程式不同的是,在編譯和連線BootLoader的程式時,不能使用glibc庫中的任何支援函式,這就帶來了一個問題:跳轉至main()的地址如何確定。一個巧妙的辦法是利用trampoline的概念,即用匯編寫一段trampoline小程式,並將其作為階段2可執行映像的執行入口點。然後在trampoline彙編小程式中用CPU跳轉指令跳入main()函式中去執行;而當main()返回時,CPU執行路徑顯然再次回到trampoline程式。簡言之:用trampoline小程式作為main()函式的外部包裹。階段2初始化的具體步驟如下:
①所需硬體初始化。一般指初始化本階段要使用的硬體裝置,包括:至少一個串列埠,以便和終端使用者進行I/O輸出資訊;計時器等。
②檢測系統的記憶體對映。所謂的儲存對映就是指在整個實體地址空間中被分配用來定址系統的RAM單元。雖然CPU通常預留出一大段足夠的地址空間給系統RAM,但是在搭建具體的嵌入式系統時,卻不一定實現CPU預留的全部RAM地址空間論文開題報告範文。所以啟動過程,BootLoader的階段2必須在它工作之前檢查整個記憶體對映情況。
③載入核心映像和根檔案系統映像。首先要規劃記憶體佔用的佈局。一般包括兩個方面:核心映像所佔用的記憶體範圍以及根檔案系統所佔用的記憶體範圍。在規劃記憶體佔用的佈局時,主要考慮基地址和映像大小的2個方面。其次要從快閃記憶體上覆制。由於像ARM這樣的嵌入式CPU通常都是在統一的記憶體地址空間中定址Flash等固態儲存裝置,因此從快閃記憶體上讀取資料與從RAM單元中讀取資料沒有什麼不同,用一個簡單的迴圈就可以完成快閃記憶體裝置上的複製映像工作。
④ 設定核心的啟動引數。一般來說,在將核心映像和根檔案系統映像複製到RAM空間後,就可以啟動核心了。但是在呼叫核心之前,先用設定核心的啟動引數。
⑤ 呼叫核心。BootLoader呼叫核心的方法是直接跳轉到核心的第一條指令處。在跳轉前,必須滿足下列條件:
●CPU暫存器的設定正確。
●CPU模式:必須禁止終端;CPU必須用SVC模式。
●Cache和MMU的設定:MMU必須關閉;指令Cache可以開啟也可以關閉;資料Cache必須關閉。
四 總結
BootLoader是作業系統和硬體的樞紐,它為作業系統核心的啟動提供了必要的條件和引數。啟動過程中BootLoader的初始化過程就是初始化CPU內部關鍵的暫存器、配置外圍硬體電路相關暫存器、建立中斷向量表等,然後跳轉到一般由高階語言編寫的主函式的應用程式程式碼去執行,這樣就可以利用高階語言來編寫完成系統設計所要求的各種功能。
參考文獻
[1]陳文智.嵌入式系統開發原理與實踐[M].北京:清華大學出版社,2005.69-81
[2]陳海軍,申衛昌,史穎.嵌入式系統載入程式詳探[J].計算機技術與發展,2006 ,1
[3]嚴菊明.基於ARM嵌入式系統的通用Bootloader的設計與實現[D]東南大學2005
[4]陳為軍,李正明,孫俊,馮麗芳.基於U-BOOT的S3C44B0載入程式設計實現[J]微計算機資訊2007.2