PowerPC 引導包裝器¶
版權所有 (C) Secret Lab Technologies Ltd.
PowerPC 映象目標壓縮並用引導包裝器包裝核心映象 (vmlinux),使其可被系統韌體使用。 沒有標準的 PowerPC 韌體介面,因此引導包裝器被設計為可適應需要構建的每種映象。
引導包裝器可以在 arch/powerpc/boot/ 目錄中找到。 該目錄中的 Makefile 包含所有可用映象型別的目標。 不同的映象型別用於支援在 PowerPC 平臺上找到的各種韌體介面。 OpenFirmware 是來自 Apple、IBM 和其他公司的通用 PowerPC 系統上最常用的韌體型別。 U-Boot 通常在嵌入式 PowerPC 硬體上找到,但還有一些其他流行的韌體實現。 每個韌體介面都需要不同的映象格式。
引導包裝器由 arch/powerpc/boot/Makefile 中的 makefile 構建,它使用包裝指令碼 (arch/powerpc/boot/wrapper) 生成目標映象。 構建系統的詳細資訊將在下一節中討論。 目前,存在以下映象格式目標
cuImage.%
向後相容的 uImage,適用於舊版本的 U-Boot(對於不理解裝置樹的版本)。 此映象將裝置樹 blob 嵌入到映象中。 引導包裝器、核心和裝置樹都嵌入在 U-Boot uImage 檔案格式中,引導包裝器程式碼從舊的 bd_info 結構中提取資料,並在跳轉到核心之前將資料載入到裝置樹中。
由於舊 U-Boot 介面中使用的 bd_info 結構中存在一系列 #ifdef,因此 cuImage 是特定於平臺的。 每個特定的 U-Boot 平臺都有一個不同的平臺初始化檔案,該檔案使用來自平臺特定 bd_info 檔案的資料填充嵌入式裝置樹。 特定板的 cuImage 平臺初始化程式碼可以在 arch/powerpc/boot/cuboot.*.c 中找到。 可以在包裝器結構中找到針對特定板的正確 cuImage 初始化程式碼的選擇。
dtbImage.%
類似於 zImage,不同之處在於裝置樹 blob 嵌入在映象內部,而不是由韌體提供。 輸出映象檔案可以是 elf 檔案或扁平二進位制檔案,具體取決於平臺。
dtbImage 用於沒有用於直接傳遞裝置樹的介面的系統上。 dtbImage 類似於 simpleImage,不同之處在於 dtbImage 具有用於從板韌體提取資料的平臺特定程式碼,而 simpleImage 根本不與韌體通訊。
PlayStation 3 支援使用 dtbImage。 使用 PlanetCore 韌體的 Embedded Planet 板也是如此。 板特定初始化程式碼通常可以在名為 arch/powerpc/boot/<platform>.c 的檔案中找到; 但這可以被包裝器指令碼覆蓋。
simpleImage.%
獨立於韌體的壓縮映象,不依賴於任何特定的韌體介面,並且嵌入了裝置樹 blob。 此映象是一個扁平二進位制檔案,可以載入到 RAM 中的任何位置並跳轉到。 韌體無法使用此映象型別將任何配置資料傳遞給核心,並且它完全依賴於嵌入的裝置樹來獲取所有資訊。
treeImage.%;
用於在某些 ppc4xx 硬體上找到的 OpenBIOS 韌體的映象格式。 此映象將裝置樹 blob 嵌入到映象中。
uImage
U-Boot 使用的本機映象格式。 uImage 目標不新增任何引導程式碼。 它只是將壓縮的 vmlinux 包裝在 uImage 資料結構中。 此映象需要能夠將裝置樹傳遞給核心的 U-Boot 版本。 如果使用舊版本的 U-Boot,則需要改用 cuImage。
zImage.%
不嵌入裝置樹的映象格式。 由 OpenFirmware 和其他能夠提供裝置樹的韌體介面使用。 此映象期望韌體在引導時提供裝置樹。 通常,如果您有通用 PowerPC 硬體,那麼您需要這種映象格式。
嵌入裝置樹 blob 的映象型別(simpleImage、dtbImage、treeImage 和 cuImage)都從 arch/powerpc/boot/dts/ 目錄中的檔案生成裝置樹 blob。 Makefile 根據目標名稱選擇正確的裝置樹源。 因此,如果核心是用“make treeImage.walnut”構建的,那麼構建系統將使用 arch/powerpc/boot/dts/walnut.dts 來構建 treeImage.walnut。
還存在兩個特殊目標,稱為“zImage”和“zImage.initrd”。 這些目標構建核心配置選擇的所有預設映象。 預設映象由引導包裝器 Makefile (arch/powerpc/boot/Makefile) 透過將目標新增到 $image-y 變數來選擇。 檢視 Makefile 以檢視哪些預設映象目標可用。
它是如何構建的¶
arch/powerpc 旨在支援多平臺核心,這意味著單個 vmlinux 映象可以在許多不同的目標板上啟動。 這也意味著引導包裝器必須能夠在單個構建上包裝多種映象。 決定不在引導包裝器原始碼中使用任何條件編譯程式碼(#ifdef 等)。 所有引導包裝器片段都可以在任何時候構建,而不管核心配置如何。 在每個核心構建上構建所有包裝器位還可以確保包裝器的模糊部分至少在各種環境中進行編譯測試。
透過連結到僅適用於映象型別的包裝器位,在連結時使包裝器適應不同的映象型別。 Makefile 呼叫“包裝器指令碼”(位於 arch/powerpc/boot/wrapper 中),並負責為映象型別選擇正確的包裝器位。 引數在指令碼的註釋塊中有很好的文件記錄,因此這裡不再重複。 然而,值得一提的是,該指令碼使用 -p (平臺) 引數作為決定編譯哪些包裝器位的主要方法。 在指令碼中間查詢大的“case “$platform” in”塊。 這也是可以透過更改連結順序來選擇平臺特定修復的地方。
特別是,在使用 cuImage 時應格外小心。 cuImage 包裝器位非常特定於板,應注意確保您嘗試構建的目標受到包裝器位的支援。