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.%

用于较旧版本的 U-Boot 的向后兼容 uImage(对于不了解设备树的版本)。此镜像将设备树 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 包装器位是特定于板的,应注意确保你尝试构建的目标受包装器位支持。