啟動 ARM Linux

作者:Russell King

日期:2002 年 5 月 18 日

以下文件與 2.4.18-rmk6 及更高版本相關。

要啟動 ARM Linux,您需要一個引導載入程式,它是一個在主核心之前執行的小程式。引導載入程式應初始化各種裝置,並最終呼叫 Linux 核心,並將資訊傳遞給核心。

本質上,引導載入程式應提供(至少)以下內容

  1. 設定和初始化 RAM。

  2. 初始化一個序列埠。

  3. 檢測機器型別。

  4. 設定核心標記列表。

  5. 載入 initramfs。

  6. 呼叫核心映象。

1. 設定和初始化 RAM

現有引導載入程式

強制性

新引導載入程式

強制性

引導載入程式應找到並初始化核心將用於系統中易失性資料儲存的所有 RAM。它以機器相關的方式執行此操作。(它可以使用內部演算法自動定位和調整所有 RAM 的大小,或者可以使用機器中 RAM 的知識,或者引導載入程式設計者認為合適的任何其他方法。)

2. 初始化一個序列埠

現有引導載入程式

可選,推薦

新引導載入程式

可選,推薦

引導載入程式應初始化並啟用目標上的一個序列埠。這允許核心序列埠驅動程式自動檢測它應該使用哪個序列埠作為核心控制檯(通常用於除錯目的或與目標通訊。)

作為替代方案,引導載入程式可以透過標記列表將相關的“console=”選項傳遞給核心,指定埠和序列埠格式選項,如中所述

3. 檢測機器型別

現有引導載入程式

可選

新引導載入程式

強制性,除非是僅使用 DT 的平臺

引導載入程式應透過某種方法檢測其執行的機器型別。這是否是一個硬編碼值,或者是一些檢視連線硬體的演算法,都超出了本文件的範圍。引導載入程式最終必須能夠為核心提供 MACH_TYPE_xxx 值。(參見 linux/arch/arm/tools/mach-types)。這應該在暫存器 r1 中傳遞給核心。

對於僅使用 DT 的平臺,機器型別將由裝置樹確定。將機器型別設定為全 1 (~0)。這不是絕對必要的,但可以確保它不會匹配任何現有型別。

4. 設定引導資料

現有引導載入程式

可選,強烈推薦

新引導載入程式

強制性

引導載入程式必須提供標記列表或 dtb 映象,用於將配置資料傳遞給核心。引導資料的物理地址在暫存器 r2 中傳遞給核心。

4a. 設定核心標記列表

引導載入程式必須建立並初始化核心標記列表。有效的標記列表以 ATAG_CORE 開頭,以 ATAG_NONE 結尾。ATAG_CORE 標記可能為空,也可能不為空。一個空的 ATAG_CORE 標記的大小欄位設定為 ‘2’ (0x00000002)。ATAG_NONE 必須將大小欄位設定為零。

任何數量的標籤都可以放在列表中。重複的標籤是否附加到先前標籤攜帶的資訊,或者是否完全替換資訊是未定義的;一些標籤的行為就像前者,另一些標籤的行為就像後者。

引導載入程式必須至少傳遞系統記憶體的大小和位置,以及根檔案系統的位置。因此,最小的標記列表應該如下所示

              +-----------+
base ->       | ATAG_CORE |  |
              +-----------+  |
              | ATAG_MEM  |  | increasing address
              +-----------+  |
              | ATAG_NONE |  |
              +-----------+  v

標記列表應儲存在系統 RAM 中。

標記列表必須放置在核心解壓縮器或 initrd “bootp” 程式都不會覆蓋的記憶體區域中。建議的放置位置是 RAM 的前 16KiB。

4b. 設定裝置樹

引導載入程式必須將裝置樹映象 (dtb) 載入到系統 ram 中,地址為 64 位對齊,並使用引導資料對其進行初始化。dtb 格式的文件位於 https://www.devicetree.org/specifications/. 核心將查詢 dtb 物理地址處的 0xd00dfeed 的 dtb 魔術值,以確定是否已傳遞 dtb 而不是標記列表。

引導載入程式必須至少傳遞系統記憶體的大小和位置,以及根檔案系統的位置。dtb 必須放置在核心解壓縮器不會覆蓋它的記憶體區域中,同時保持在核心低記憶體對映覆蓋的區域內。

一個安全的位置是 RAM 起始位置上方 128MiB 邊界的正上方。

5. 載入 initramfs。

現有引導載入程式

可選

新引導載入程式

可選

如果正在使用 initramfs,那麼與 dtb 一樣,它必須放置在核心解壓縮器不會覆蓋它的記憶體區域中,同時也要位於核心低記憶體對映覆蓋的區域中。

一個安全的位置是裝置樹 blob 正上方,裝置樹 blob 本身將被載入到如上推薦的 RAM 起始位置上方 128MiB 邊界的正上方。

6. 呼叫核心映象

現有引導載入程式

強制性

新引導載入程式

強制性

有兩種呼叫核心 zImage 的選項。如果 zImage 儲存在快閃記憶體中,並且已正確連結以從快閃記憶體執行,則引導載入程式可以直接呼叫快閃記憶體中的 zImage。

zImage 也可以放置在系統 RAM 中並在那裡呼叫。核心應放置在 RAM 的前 128MiB 中。建議將其載入到 32MiB 以上,以避免在解壓縮之前需要重新定位,這將使啟動過程稍微快一些。

當啟動原始(非 zImage)核心時,約束更嚴格。在這種情況下,必須將核心載入到系統中的一個偏移量,該偏移量等於 TEXT_OFFSET - PAGE_OFFSET。

在任何情況下,都必須滿足以下條件

  • 停止所有具有 DMA 功能的裝置,以避免記憶體被錯誤的網路資料包或磁碟資料損壞。這將為您節省許多除錯時間。

  • CPU 暫存器設定

    • r0 = 0,

    • r1 = 在上述 (3) 中發現的機器型別編號。

    • r2 = 系統 RAM 中標記列表的物理地址,或系統 RAM 中裝置樹塊 (dtb) 的物理地址

  • CPU 模式

    必須停用所有形式的中斷(IRQ 和 FIQ)

    對於不包含 ARM 虛擬化擴充套件的 CPU,CPU 必須處於 SVC 模式。(Angel 存在一個特殊例外)

    包含虛擬化擴充套件支援的 CPU 可以進入 HYP 模式,以便核心可以充分利用這些擴充套件。這是此類 CPU 的推薦啟動方法,除非虛擬化已被預安裝的虛擬機器監控程式使用。

    如果核心由於任何原因未進入 HYP 模式,則必須進入 SVC 模式。

  • 快取,MMU

    MMU 必須關閉。

    指令快取可以開啟或關閉。

    資料快取必須關閉。

    如果核心以 HYP 模式進入,則上述要求適用於 HYP 模式配置以及普通的 PL1(特權核心模式)配置。此外,必須停用所有進入虛擬機器監控程式的陷阱,並且必須授予 PL1 對所有外圍裝置和 CPU 資源的訪問許可權,只要在架構上可行。除了進入 HYP 模式外,系統配置應使不包含虛擬化擴充套件支援的核心可以在沒有額外幫助的情況下正確啟動。

  • 引導載入程式應透過直接跳轉到核心映象的第一個指令來呼叫核心映象。

    在支援 ARM 指令集的 CPU 上,即使對於 Thumb-2 核心,也必須在 ARM 狀態下進行輸入。

    在僅支援 Thumb 指令集的 CPU 上,例如 Cortex-M 類 CPU,必須在 Thumb 狀態下進行輸入。