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 包装器位非常特定于板,应注意确保您尝试构建的目标受到包装器位的支持。