嵌入式 Linux 啟動分為兩個截然不同的階段:系統引導與Linux 啟動。系統引導負責在核心載入記憶體前完成 CPU 初始化、IO 設備配置,並將 Linux 核心載入記憶體,這部分完全由 Bootloader 實現。當 Bootloader 將核心映像載入記憶體後,控制權移交給 Linux 核心,進入核心啟動階段。
Hyper250 Bootloader 核心代碼位於 start_xscale.S,包含兩個關鍵頭文件:
config.h:硬體巨集定義與系統配置start_xscale.h:晶片級暫存器定義與初始化值| 配置類別 | 主要內容 |
|---|---|
| 儲存總線 | Flash 大小/字長、SRAM 基址/大小/區塊大小 |
| 動態記憶體 | DRAM 大小、基址 |
| 軟體包資訊 | 套件名稱、版本號 |
| Bootloader 位置 | DRAM/SRAM 最大值、載入位置、堆疊基址 |
| 核心位置 | DRAM/SRAM 基址、核心最大值、區塊數量 |
| 檔案系統位置 | 根目錄基址、最大值、區塊數量 |
| LOADER 程式 | 靜態記憶體基址、最大值、區塊數量 |
| 網路配置 | 網路相關參數設定 |
定義所有關鍵硬體模組的基址與暫存器偏移:
main.c 的 c_main() 進入 C 語言環境arch/arm/boot/compressed/ 目錄編譯產出關鍵檔案:
vmlinux:未壓縮核心head.o:核心頭部,負責初始設定misc.o:解壓核心主邏輯head-xscale.o:XScale 專用初始化,連結時與 head.o 合併piggy.o:壓縮後的核心映像(中間檔案)bootLinux() 跳轉到核心起始位置arch/arm/boot/compressed/head.S 入口點decompress_kernel() (misc.c)proc_decomp_setup()、arch_decomp_setup() 初始化gunzip() 解壓核心到指定位置關鍵在於三個 Makefile 與連結腳本的交互:
arch/arm/boot/Makefilearch/arm/boot/compressed/Makefilearch/arm/boot/compressed/vmlinux.lds.in關鍵地址定義:LOAD_ADDR = 0xA0008000,TEXT_START = 0。Bootloader 將壓縮核心 (zImage) 載入 RAM 0xA0008000,核心解壓前運行於 RAM 中,因此需將相對地址轉換為物理地址(核心重載)。