項目開源位址:https://github.com/Mculover666/uboot-jz2440
0. 教程完整目錄
- 00 - 嵌入式Linux系統中Bootloader的作用和基本運作原理
- 01 - 下載下傳uboot源碼并使用VSCode遠端檢視源碼、編譯uboot(2012.04.01版本)
- 02 - 詳細探索uboot啟動過程(基于S3C2410處理器)
- 03 - 初步移植uboot 2012.04到JZ2440(修改時鐘,配置序列槽)
- 04 - 移植uboot 2012.04到JZ2440(支援Nor Flash讀寫)
- 05 - 移植uboot 2012.04到JZ2440(支援Nand Flash讀寫)
- 06 - 移植uboot 2012.04到JZ2440(支援DM9000C網卡)
- 07 - 移植uboot 2012.04到JZ2440(裁剪uboot大小)
- 08 - 移植uboot 2012.04到JZ2440(設定mtd分區表)
- 09 - 移植uboot 2012.04到JZ2440(設定預設環境變量參數)
- 10 - 移植uboot 2012.04到JZ2440(燒寫Linux核心、燒寫yaffs2檔案系統)
- 11 - 移植uboot 2012.04到JZ2440(移植完成,制作uboot更新檔)
1. 嵌入式Linux系統開發架構
一個嵌入式Linux的系統的架構如下圖:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5yM1MTO4cDNyY2YilTZ0U2YxYzXxEDOygDMxMzLcJTMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
軟體程式開發中,從下往上每一次的作用依次為:
- Bootloader:将硬體初始化,并将核心引導起來;
- Linux Kernel:定制、裁剪之後的Linux核心;
- 根檔案系統:提供檔案系統,更好的使用存儲空間;
- 裝置驅動:完成裝置操作,并向上層軟體提供裝置的調用接口;
- 應用程式:Linux系統程式設計、網絡程式設計、shell程式設計、圖形界面程式設計等等;
2. Bootloader的作用
Bootloader在上圖中處于最底層,有以下兩個作用:
- ①Bootloader和硬體息息相關:直接和CPU、外圍硬體裝置(存儲器、網卡、LCD等)打交道,負責初始化硬體裝置;
- ② Bootloader負責拉起核心:建立記憶體空間映射圖,為核心的啟動運作做好一切準備,最後将Linux核心代碼加載到RAM中運作;
3. Bootloader的操作模式
一般來說,bootload都會提供兩種操作模式:
- ① 正常啟動模式:無需開發者和使用者幹涉,上電後自動開始運作,完成啟動核心的任務;
- ② 下載下傳模式(開發者模式):需要使用者幹預,進入下載下傳模式,使用uboot指令進行操作;
4. Bootloader運作基本原理
BootLoader程式是分級載入機制,通常分為 stage1 和 stage2 兩大部分。
Stage1
BootLoader 的 stage1 依賴于CPU體系結構的代碼,例如CPU相關初始化代碼等, 通常都用彙編語言來實作,達到高效操作的目的。
stage1 包括以下步驟:
- ①硬體裝置初始化
- 屏蔽所有的中斷
- 設定CPU的速度和時鐘頻率
- 設定記憶體控制器
- 關閉 CPU 内部指令/資料 cache
- ②為加載 stage2 準備 RAM 空間
- ③拷貝 stage2 到 RAM 空間中
- ④設定好堆棧指針sp,為執行 C 語言代碼作好準備;
- ⑤跳轉到 stage2 階段的C程式入口處;
Stage2
BootLoader 的 stage2 通常用C語言來實作,可以實作更複雜的功能,而且代碼會具有更好的可讀性和可移植性。
stage2 包括以下步驟:
- ①初始化本階段要使用到的硬體裝置;
- 序列槽裝置:以便輸出資訊
- ……
- ②檢測系統記憶體映射(memory map):準備識别在整個 4GB 實體位址空間中有哪些位址範圍被配置設定用來尋址系統的 RAM單元;
- ③将 kernel 映像和根檔案系統映像從 flash 上讀到 RAM 空間中;
- ④為核心設定啟動參數;
- ⑤調用核心:跳至核心代碼入口開始執行;
5. 常用Bootloader
目前常用的Bootloader中,uboot是主流使用的,本系列文章着重講述uboot的源碼和移植。
uboot
U-Boot是由開源項目PPCBoot發展起來的,ARMboot并入了PPCBoot,和其他一些arch的Loader合稱U-Boot,2002年12月17日第一個版本U-Boot-0.2.0釋出,同時PPCBoot和ARMboot停止維護,但是截至目前,uboot一直在不斷的更新中。
uboot的特色是“u”- universal(通用的):
- 在處理器層面:支援PowerPC系列的處理器,支援MIPS、 x86、ARM、NIOS、XScale等諸多常用系列;
- 在核心層面:除了Linux之外,還支援NetBSD, VxWorks, QNX, RTEMS, ARTOS,LynxOS, android嵌入式作業系統等;
- 在裝置驅動層面:支援序列槽、以太網、SDRAM、FLASH、LCD、NVRAM、EEPROM、RTC、鍵盤等常用硬體裝置;
這些豐富的支援依賴于uboot的源碼開源,開源許可協定遵循GNU通用公共許可證。
其它
- Redboot:Redboot是Redhat公司随eCos釋出的一個bootloader方案,也是一個開源項目;
- Blob(Boot Loader Object):由Jan-Derk Bakker and Erik Mouw釋出,功能比較齊全,代碼較少,比較适合做修改移植,用來引導Liunx,目前大部分S3C44B0闆都用Blob修改移植後來加載uClinux;
- vivi:vivi是南韓mizi 公司開發的bootloader, 适用于ARM9處理器。