Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> Linux 教學

嵌入式 Linux 系統啟動全流程深度剖析:從 Bootloader 到核心解壓

編輯:Linux 教學

嵌入式 Linux 雙階段啟動架構

嵌入式 Linux 啟動分為兩個截然不同的階段:系統引導與Linux 啟動。系統引導負責在核心載入記憶體前完成 CPU 初始化、IO 設備配置,並將 Linux 核心載入記憶體,這部分完全由 Bootloader 實現。當 Bootloader 將核心映像載入記憶體後,控制權移交給 Linux 核心,進入核心啟動階段。

階段一:Bootloader 深度解析(以 Hyper250 XScale 為例)

啟動代碼結構

Hyper250 Bootloader 核心代碼位於 start_xscale.S,包含兩個關鍵頭文件:

  • config.h:硬體巨集定義與系統配置
  • start_xscale.h:晶片級暫存器定義與初始化值

config.h 關鍵配置項

配置類別主要內容
儲存總線Flash 大小/字長、SRAM 基址/大小/區塊大小
動態記憶體DRAM 大小、基址
軟體包資訊套件名稱、版本號
Bootloader 位置DRAM/SRAM 最大值、載入位置、堆疊基址
核心位置DRAM/SRAM 基址、核心最大值、區塊數量
檔案系統位置根目錄基址、最大值、區塊數量
LOADER 程式靜態記憶體基址、最大值、區塊數量
網路配置網路相關參數設定

start_xscale.h 硬體抽象層

定義所有關鍵硬體模組的基址與暫存器偏移:

  • 記憶體基址 (0xA0000000)
  • 中斷控制器基址 (0x40D00000) 與保護堆疊偏移
  • 時鐘管理基址 (0x41300000) 與暫存器初始值
  • GPIO 介面基址 (0x40E00000) 完整暫存器映射
  • 記憶體控制器基址 (0x48000000)
  • 電源管理、FFUART 等外設完整定義

start_xscale.S 啟動流程

  1. 設定中斷基址,初始化中斷保護堆疊
  2. 初始化 GPIO 介面
  3. 初始化 SDRAM 記憶體控制器
  4. 將 Bootloader 從 Flash 複製到 SDRAM
  5. 載入 Linux 核心映像:從 Flash (0x000C0000) 載入 SDRAM (0xA0008000)
  6. 設定保護堆疊
  7. 呼叫 main.c 的 c_main() 進入 C 語言環境

階段二:Linux 核心啟動與解壓流程

Makefile 編譯產物分析

arch/arm/boot/compressed/ 目錄編譯產出關鍵檔案:

  • vmlinux:未壓縮核心
  • head.o:核心頭部,負責初始設定
  • misc.o:解壓核心主邏輯
  • head-xscale.o:XScale 專用初始化,連結時與 head.o 合併
  • piggy.o:壓縮後的核心映像(中間檔案)

解壓啟動流程

  1. Bootloader 完成引導,呼叫 bootLinux() 跳轉到核心起始位置
  2. 若核心已壓縮,執行 arch/arm/boot/compressed/head.S 入口點
  3. 呼叫 decompress_kernel() (misc.c)
  4. 依序執行 proc_decomp_setup()、arch_decomp_setup() 初始化
  5. 列印 "Uncompressing Linux..." 訊息
  6. 呼叫 gunzip() 解壓核心到指定位置
  7. 解壓完成後,相關代碼佔用記憶體釋放

head.S 關鍵初始化邏輯

  • ARM CPU 除錯輸出統一宏定義
  • 設定核心起始/結束地址,保存架構 ID
  • CPU 模式切換:用戶模式→超級用戶模式,關閉中斷
  • LC0 結構 delta offset 分析,判斷核心重載需求

核心重載地址計算關鍵

關鍵在於三個 Makefile 與連結腳本的交互:

  • arch/arm/boot/Makefile
  • arch/arm/boot/compressed/Makefile
  • arch/arm/boot/compressed/vmlinux.lds.in

關鍵地址定義:LOAD_ADDR = 0xA0008000,TEXT_START = 0。Bootloader 將壓縮核心 (zImage) 載入 RAM 0xA0008000,核心解壓前運行於 RAM 中,因此需將相對地址轉換為物理地址(核心重載)。

Copyright © Windows教程網 All Rights Reserved