引導 ARM Linux 本文翻譯自:https://www.kernel.org/doc/html/latest/arm/booting.html 引導 ARM Linux 需要一個引導載入程式,它是一個先於內核運行的小段程式。引導載入程式被用於初始化各種設備,並最終調用 Linux 內核,同時給 ...
引導 ARM Linux
本文翻譯自:https://www.kernel.org/doc/html/latest/arm/booting.html
引導 ARM Linux 需要一個引導載入程式,它是一個先於內核運行的小段程式。引導載入程式被用於初始化各種設備,並最終調用 Linux 內核,同時給內核傳遞參數。
總之,引導載入程式需要提供一下幾種功能:
- 設置和初始化記憶體
- 初始化一個串口
- 檢測機器類型
- 設置內核標簽列表
- 載入 initramfs
- 調用內核鏡像
1. 設置和初始化記憶體
- Existing boot loaders: MANDATORY
- New boot loaders: MANDATORY
引導載入程式用來查詢和初始化所有記憶體,該過程是體繫結構相關的。
2. 初始化一個串口
- Existing boot loaders: OPTIONAL, RECOMMENDED
- New boot loaders: OPTIONAL, RECOMMENDED
引導載入程式應該在目標辦上初始化和使能一個串口,這樣可以使內核串口驅動自動地檢測哪個串口可用於內核控制台。
另外,引導載入程式可以通過標記列表傳遞 'console=' 選項給內核指定埠,串口參數格式選項詳見:Documentation/admin-guide/kernel-parameters.rst
3. 檢測機器類型
- Existing boot loaders: OPTIONAL
- New boot loaders: MANDATORY except for DT-only platforms
引導載入程式需要通過一些方法來檢測目標板類型,最終提供給內核一個MACH_TYPE_xxx的值給內核,該值詳見:linux/arch/arm/tools/mach-types。該值需要放在寄存器 r1 中。
4. 設置引導數據
- Existing boot loaders: OPTIONAL, HIGHLY RECOMMENDED
- New boot loaders: MANDATORY
引導載入程式必須一個標記列表或者 dtb 鏡像給內核,該引導數據的物理地址需要放置在寄存器 r2 中。
引導家在程式必須創建和初始化內核標記列表,一個有效的標記列表開始於ATAG_CORE,結束於ATAG_NONE。引導載入程式最少要傳遞系統記憶體的大小和位置以及文件系統位置。因此最小的標記列表類似於:
+-----------+
base -> | ATAG_CORE | |
+-----------+ |
| ATAG_MEM | | increasing address
+-----------+ |
| ATAG_NONE | |
+-----------+ v
標記列表應該放置在系統 RAM 中,推薦放置在前 16KiB 處,以防止被內核解壓縮程式覆蓋掉。
5. 載入 initramfs
- Existing boot loaders: OPTIONAL
- New boot loaders: OPTIONAL
6. 調用內核鏡像
- Existing boot loaders: MANDATORY
- New boot loaders: MANDATORY
調用內核鏡像 zImage 有兩種可能,如果 zImage 位於 flash 中,並且被正確鏈接,那麼就可以直接在 flash 中調用 zImage。同時 zImage 也可能在 RAM 中調用,內核應該放置在記憶體的前 128MiB 中,推薦載入到 32MIB 之上來避免內核在解壓縮之前重定位,這可以加快引導速度。
如果引導的是原生的內核,那麼內核的載入位置就必須嚴格等於 TEXT_OFFSET - PAGE_OFFSET。
無論什麼情況,以下條件必須得到滿足:
- 關閉所有 DMA 相關的設備
- CPU 寄存器設置
- r0 = 0
- r1 = 機器類型碼
- r3 = 標記列表在系統記憶體中的物理地址
- CPU 模式
- 關閉所有中斷
- CPU 必須處於 SVC 模式
- 緩存和 MMU
- MMU 必須關閉
- 指令緩存可以打開可以關閉
- 數據緩存必須關閉
- 引導載入程式應該直接跳轉到內核鏡像處執行第一條指令