DeviceTree 啟動¶
在 Linux/ppc64 核心的開發過程中,更具體地說是新增舊 IBM pSeries/iSeries 對之外的新平臺型別時,決定強制執行一些關於核心入口和引導載入程式 <-> 核心介面的嚴格規則,以避免 ppc32 核心入口點以及將新平臺新增到核心的方式發生的退化。 傳統的 iSeries 平臺打破了這些規則,因為它早於這個方案,但是主樹中不會接受任何不正確遵循這些規則的新板級支援。 此外,自從 ppc32 和 ppc64 的 arch/powerpc 合併架構出現以來,新的 32 位平臺和進入 arch/powerpc 的 32 位平臺也將需要使用這些規則。
將在下面更詳細地定義的主要要求是存在一個裝置樹,其格式在 Open Firmware 規範之後定義。 但是,為了簡化嵌入式板供應商的生活,核心不要求裝置樹代表系統中的每個裝置,而只需要存在一些節點和屬性。 例如,核心不要求您為系統中的每個 PCI 裝置建立一個節點。 必須具有 PCI 主橋的節點,以便提供中斷路由資訊和記憶體/IO 範圍等。 還建議為片上裝置和其他不完全適合現有 OF 規範的匯流排定義節點。 這在核心可以探測這些裝置並將驅動程式與裝置匹配的方式上創造了很大的靈活性,而無需硬編碼各種表格。 它還使板供應商可以更靈活地進行小的硬體升級,而不會顯著影響核心程式碼或使其混亂特殊情況。
入口點¶
核心只有一個入口點,位於核心映像的開頭。 該入口點支援兩種呼叫約定
a) 從 Open Firmware 啟動。 如果您的韌體與 Open Firmware (IEEE 1275) 相容或提供與 OF 相容的客戶端介面 API(不需要對 Forth 字的“interpret”回撥的支援),則可以使用以下方式進入核心:
r5:由 IEEE 1275 定義的 powerpc 繫結的 OF 回撥指標。 當前僅支援 32 位客戶端介面
r3, r4:任何 initrd 的地址和長度,如果存在,否則為 0
MMU 處於開啟或關閉狀態; 核心將執行位於 arch/powerpc/kernel/prom_init.c 中的 trampoline,以從開放韌體中提取裝置樹和其他資訊,並構建一個扁平化的裝置樹,如 b) 中所述。 prom_init() 將使用第二種方法重新進入核心。 此 trampoline 程式碼在韌體的上下文中執行,韌體應該處理該時間內的所有異常。
b) 使用扁平化的裝置樹塊直接進入。 此入口點由 a) 在 OF trampoline 之後呼叫,也可以由不支援 Open Firmware 客戶端介面的引導載入程式直接呼叫。 它也被“kexec”用於實現從先前執行的核心“熱”啟動新核心。 我將在本文件中更詳細地描述此方法,因為方法 a) 只是標準的 Open Firmware,因此應根據定義它及其與 PowerPC 平臺繫結的各種標準文件來實現。 然後入口點定義變為
r3:RAM 中裝置樹塊(在第二章中定義)的物理指標
r4:核心本身的物理指標。 這被彙編程式碼用於在您以啟用 MMU 和非 1:1 對映進入核心時正確停用 MMU。
r5:NULL(用於與方法 a 區分)
關於 SMP 入口的說明:或者您的韌體將您的其他 CPU 放在 ROM 中的某個睡眠迴圈或自旋迴圈中,您可以透過軟重置或其他方式將它們取出,在這種情況下,您無需關心,或者您必須使用所有 CPU 進入核心。 如何使用方法 b) 執行此操作將在本文件的後續修訂版中描述。
板級支援(平臺)不是互斥的配置選項。 可以在單個核心映像中構建任意一組板級支援。 核心將根據裝置樹的內容“知道”要用於給定平臺的功能集。 因此,您應該
a) 在 arch/powerpc/Kconfig 中新增您的平臺支援作為 _boolean_ 選項,遵循 PPC_PSERIES 和 PPC_PMAC 的示例。 後者可能是一個很好的板級支援的例子,可以從它開始。
b) 將您的主平臺檔案建立為“arch/powerpc/platforms/myplatform/myboard_setup.c”,並在
CONFIG_選項的條件下將其新增到 Makefile 中。 此檔案將定義一個型別為“ppc_md”的結構,其中包含通用程式碼將用於訪問您的平臺特定程式碼的各種回撥
一個核心映像可以支援多個平臺,但前提是這些平臺具有相同的核心架構。 單個核心構建不能同時支援 Book E 的配置和具有經典 Powerpc 架構的配置。