
引導 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 必須關閉
- 指令快取可以打開可以關閉
- 資料快取必須關閉
- 引導加載程式應該直接跳轉到內核鏡像處執行第一條指令
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/95016.html
標籤:Linux
