PowerPC 引导包装器

Copyright (C) Secret Lab Technologies Ltd.

PowerPC 镜像目标会压缩内核镜像 (vmlinux) 并用引导包装器将其包裹,以便系统固件能够使用它。由于没有标准的 PowerPC 固件接口,引导包装器被设计成能够适应需要构建的每种类型的镜像。

引导包装器可以在 arch/powerpc/boot/ 目录中找到。该目录中的 Makefile 包含所有可用镜像类型的目标。不同的镜像类型用于支持 PowerPC 平台上发现的各种固件接口。OpenFirmware 是来自苹果、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 文件或纯二进制文件。

dtbImages 用于没有直接传递设备树接口的系统。dtbImages 类似于 simpleImages,不同之处在于 dtbImages 具有用于从板级固件提取数据的平台特定代码,而 simpleImages 完全不与固件交互。

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’的特殊目标。这些目标构建由内核配置选择的所有默认镜像。默认镜像是通过将目标添加到 $image-y 变量中,由引导包装器 Makefile (arch/powerpc/boot/Makefile) 选择的。查看 Makefile 可以了解哪些默认镜像目标可用。

如何构建

arch/powerpc 旨在支持多平台内核,这意味着单个 vmlinux 镜像可以在许多不同的目标板上启动。这也意味着引导包装器必须能够在单次构建中为多种类型的镜像进行包装。设计上决定在引导包装器源代码中不使用任何条件编译代码(#ifdef 等)。无论内核配置如何,所有的引导包装器部分在任何时候都是可构建的。在每次内核构建时构建所有的包装器组件,也确保了包装器中晦涩的部分至少能在各种各样的环境中通过编译测试。

包装器通过在链接时仅链接适用于该镜像类型的包装器组件来适应不同的镜像类型。“包装器脚本”(位于 arch/powerpc/boot/wrapper)由 Makefile 调用,负责为该镜像类型选择正确的包装器组件。这些参数在脚本的注释块中有很好的文档记录,因此在此不予重复。然而,值得一提的是,该脚本使用 -p (platform) 参数作为决定编译哪个包装器组件的主要方法。寻找脚本中间的大型 ‘case “$platform” in’ 块。这也是可以通过更改链接顺序来选择特定于平台的修复程序的地方。

特别是,在使用 cuImage 时应格外小心。cuImage 包装器组件非常特定于开发板,应当注意确保您尝试构建的目标受该包装器组件的支持。