天天看點

uboot研讀筆記 | 00 - 嵌入式Linux系統中Bootloader的作用和基本運作原理

項目開源位址: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的系統的架構如下圖:

uboot研讀筆記 | 00 - 嵌入式Linux系統中Bootloader的作用和基本運作原理

軟體程式開發中,從下往上每一次的作用依次為:

  • 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處理器。