本書主要介紹BootLoader的開發理論、流程與實例,以當前流行的ARM和Linux為藍本,詳細介紹了如何一步步實現可用的BootLoader。該書既對Linux下的開發環境、編譯器使用、處理器架構以及編譯和鏈接、鏈接腳本的細節做了較全面的理論介紹,又結合具體的環境向讀者說明了BootLoader的原理和開發流程,使讀者真正懂得BootLoader是如何工作的,即便今后遇到其他處理器或者引導其他操作系統,也能熟知開發或者移植BootLoader的思路。本書是初涉BootLoader移植開發領域讀者的一本不可多得的參考書。書中介紹的理論不僅僅對理解BootLoader有幫助,而且對理解計算機系統(嵌入式系統)也有啟發意義,適合廣大嵌入式系統愛好者和開發人員參考使用。
本書系統講解BootLoader開發理論、流程與實例。
以ARM和Linux為藍本,詳細介紹了如何實現可用的BootLoader。
是嵌入式Linux移植開發領域的工程師不可多得的參考書。
本書主要介紹BootLoader的開發理論、流程與實例,以當前流行的ARM和Linux為藍本,詳細介紹如何一步步實現可用的BootLoader。該書既對Linux下的開發環境、編譯器使用、處理器架構以及編譯和鏈接、鏈接腳本的細節做了較全面的理論介紹,又結合具體的環境向讀者說明了BootLoader的原理和開發流程,使讀者真正懂得BootLoader是如何工作的,即便今后遇到其他處理器或者引導其他操作系統,也能熟知開發或者移植BootLoader的思路。
為了引導操作系統,BootLoader與CPU體系結構和操作系統有著非常緊密的聯系。在本書中,我們以ARM體系結構和嵌入式Linux操作系統為原型講述BootLoader的原理。通過理論聯系實踐的方法,讓讀者理解BootLoader的概念,掌握開發BootLoader的方法。
本書適合從學習單片機向ARM過渡、希望了解嵌入式開發的在校學生以及想要從事BootLoader開發/移植工作的工程師參考。
BootLoader就是在操作系統內核運行之前運行的一段小程序。通過這段小程序,我們可以初始化硬件設備、建立內存空間的映射,從而將系統的軟硬件環境設置成一個合適的狀態,以便為最終調用操作系統內核準備好正確的環境。
在嵌入式系統中,通常沒有像PC中的BIOS那樣的固件程序,因此整個系統的加載啟動任務就完全由BootLoader來完成。BootLoader是CPU上電后運行的第一段程序,它的作用就是對嵌入式系統中的硬件進行初始化,創建內核需要的一些信息并將這些信息通過相關機制傳遞給內核,從而將系統的軟硬件環境帶到一個合適的狀態,最終調用操作系統內核,真正起到引導和加載內核的作用。實際上,一個功能比較強大的BootLoader已經相當于一個微型的操作系統了。
不同的CPU體系結構有不同的BootLoader。有些BootLoader支持多種體系結構的CPU,比如U-Boot就同時支持ARM體系結構和MIPS體系結構。除了依賴于CPU的體系結構外,BootLoader實際上也依賴于具體的嵌入式板級設備的配置。也就是說,對于兩塊不同的嵌入式板而言,即使它們是基于同一種CPU而構建的,要想讓運行在一塊板子上的BootLoader程序也能運行在另一塊板子上,通常需要修改BootLoader的源程序。因此每款嵌入式產品的BootLoader都是獨一無二的,但我們可以總結出開發或者維護特定BootLoader需要哪些背景知識,掌握了這些背景知識,我們就可以做到以不變應萬變。
為了引導操作系統,BootLoader與CPU體系結構和操作系統有著非常緊密的聯系。
在本書中,我們以ARM體系結構和嵌入式Linux操作系統為原型講述BootLoader的原理。通過理論聯系實踐的方法論,讓讀者理解BootLoader的概念,掌握開發BootLoader的方法。本書適合從單片機向ARM過渡并希望了解嵌入式開發的在校學生以及想要從事BootLoader開發移植工作的工程師參考使用。
下面來梳理一下需要哪些背景知識:
1)因為我們引導的操作系統是Linux,所以需要熟悉Linux開發環境。
BootLoader也是一串代碼,我們必須了解Linux下編輯器和編譯器的用法;作為Linux下的開發者,對shell腳本和Make工程管理工具也要有必要的了解。第1章對BootLoader做了基本介紹,第2章則詳細介紹了Linux開發環境。
2)因為我們僅僅以ARM體系結構作為原型,所以會在第3~5章講述ARM體系結構、ARM指令集和ARM獨特的尋址模式。
3)很多嵌入式開發人員都是通信、電子和自動化等專業的,對于計算機的編譯和鏈接掌握得不夠深入,因此第6章介紹編譯和鏈接。控制鏈接行為的鏈接腳本是特有的腳本語言,第7章比較詳細地介紹了該腳本的細節。
4)第8章采用流水燈的實驗融會貫通前面各章節的理論,接著第9章對U-Boot代碼展開分析,最后在第10章一步一步地實現了BootLoader。在此過程中,我們更注重ARM體系結構、編譯鏈接等知識的融會貫通,不會花太多篇幅講解DRAM、MMC等模塊的驅動。
本書能夠成書,要感謝LinkSprite團隊的資源支持和左寶柱在pcDuino v3平臺上的幫助。最后感謝家人和朋友對我的支持,鼓勵我完成這項值得用心去做的工作。因作者水平有限且時間倉促,書中難免存在疏漏,還望廣大讀者不吝賜教。
胡爾佳2014年11月
機工授權書
查看全部↓
前言
第1章 BootLoader的概念
1.1 BootLoader的角色
1.2 BootLoader的來歷
1.3 BootLoader的概念
1.3.1 MCU下的BootLoader
1.3.2嵌入式ARM和Linux下的
BootLoader
1.3.3 PC下的引導流程
1.4本章小結
第2章L.nux開發環境
2.1編輯器Vim
2.1.1 Vim介紹
2.1.2 Vim的兩個基本模式
2.1.3 Vim的兩個常用模式
2.1.4 Vim的啟動與退出
2.1.5 Vim下光標的移動
2.1.6 Vim下的復制、粘貼和
刪除
2.1.7 Vim下的撤銷和重復
2.1.8 Vim下的查找和替換
2.1.9 Vim下的文件恢復
2.1.10 Vim下的插件
2.2編譯器GCC和交叉編譯器
2.2.1 GCC的編譯流程
2.2.2 GCC的常用編譯選項
2.2.3交叉編譯器
2.3常用shell命令和腳本
2.3.1 find命令
2.3.2 grep命令
2.3.3管道與重定向
2.4 工程管理Make和Makefile
2.4.1 Make和Makefile
2.4.2 Makefile中的變量
2.4.3 自動推導規則
2.4.4嵌套的Makefile
2.4.5 Make偽目標
2.4.6自動化變量
2.4.7 Make的內嵌函數
2.5本章小結
第3章 ARM體系結構
3.1處理器模式
3.2異常
3.3 ARM寄存器
3.4通用寄存器
3.4.1未分組的寄存器:
R0~R7
3.4.2分組的寄存器:
R8~R14
3.4.3寄存器R15:程序計數器
3.5程序狀態寄存器
3.5.1 PSR位的類型
3.5.2條件標志位
3.5.3中斷禁止位
3.5.4模式位
3.6本章小結
第4章ARM指令集
4.1數據處理指令
4.2分支指令
4.3軟中斷指令
4.4程序狀態寄存器指令
4.5協處理器指令
4.6加載常量的偽指令
4.7本章小結
第5章ARM尋址模式
5.1尋址模式1-數據處理指令的
尋址模式
5.1.1編碼格式
5.1.2移位器操作數
5.1.3數據處理操作——立即數
5.1.4數據處理操作——寄存器
5.1.5數據處理操作——立即數
的邏輯左移
5.1.6數據處理操作——寄存器
的邏輯左移
5.1.7數據處理操作——立即數
的邏輯右移
5.1.8數據處理操作——寄存器
的邏輯右移
5.1.9數據處理操作——立即數
的算術右移
5.1.10數據處理操作——寄存器
的算術右移 一
5 .1.11數據處理操作——立即數
的循環右移 一
5.1.12數據處理操作——寄存器
的循環右移 一
5.1.13數據處理操作——擴展的
循環右移
5.2尋址模式2-字或無符號
字節的load/store指令
5.2.1編碼格式
5.2.2立即數偏移
5.2.3寄存器偏移
5.2.4比例寄存器偏移
5.2.5立即數的前變址尋址
5.2.6寄存器的前變址尋址
5.2.7 比例寄存器的前變址尋址
5.2.8立即數的后變址尋址
5.2.9寄存器的后變址尋址
5.2.10比例寄存器的
后變址尋址
5.3 尋址模式3-雜類load/store
指令的尋址方式
5.3.1編碼格式
5.3.2雜類load/store-立即數
偏移
第6章編譯和鏈接
第7章鏈接腳本
第8章Linux下開發流水燈
第9章U-Boot代碼的分析
第10章實現簡單的BootLoader
查看全部↓
前言/序言