DeviceTree 引导¶
在 Linux/ppc64 内核的开发过程中,更具体地说,在旧的 IBM pSeries/iSeries 对之外添加新的平台类型时,决定强制执行一些关于内核入口和引导加载程序 <-> 内核接口的严格规则,以避免 ppc32 内核入口点以及向内核添加新平台的方式所造成的退化。传统的 iSeries 平台打破了这些规则,因为它早于此方案,但在主树中不会接受不正确遵循这些规则的新板级支持。此外,自从 ppc32 和 ppc64 的 arch/powerpc 合并架构出现以来,新的 32 位平台和移入 arch/powerpc 的 32 位平台也将被要求使用这些规则。
将在下面更详细定义的主要要求是存在一个设备树,其格式是根据 Open Firmware 规范定义的。但是,为了使嵌入式板供应商的生活更轻松,内核不要求设备树表示系统中的每个设备,而只要求存在一些节点和属性。例如,内核不要求您为系统中的每个 PCI 设备创建节点。为了提供中断路由信息和内存/IO 范围等,必须为 PCI 主桥接器创建一个节点。还建议为片上设备和其他不特别适合现有 OF 规范的总线定义节点。这为内核如何探测这些设备并将驱动程序与设备匹配提供了很大的灵活性,而无需硬编码各种表格。它还使板供应商可以更灵活地进行次要硬件升级,而不会对内核代码产生重大影响或使其混乱不堪。
入口点¶
内核只有一个入口点,位于内核映像的开头。该入口点支持两种调用约定
a) 从 Open Firmware 引导。如果您的固件与 Open Firmware (IEEE 1275) 兼容或提供与 OF 兼容的客户端接口 API(不需要支持 forth 单词的 “interpret” 回调),则可以使用以下方式进入内核:
r5 : IEEE 1275 绑定到 powerpc 定义的 OF 回调指针。目前仅支持 32 位客户端接口
r3, r4 : 初始化 ramdisk 的地址和长度(如果有),或者为 0
MMU 可以打开或关闭;内核将运行位于 arch/powerpc/kernel/prom_init.c 中的 trampoline 以从开放固件中提取设备树和其他信息,并构建一个如 b) 中所述的扁平化设备树。然后 prom_init() 将使用第二种方法重新进入内核。此 trampoline 代码在固件的上下文中运行,该固件应在此期间处理所有异常。
b) 使用扁平化设备树块直接进入。此入口点在 OF trampoline 之后由 a) 调用,也可以由不支持 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” 并将其添加到 Makefile 中,条件是您的
CONFIG_
选项。此文件将定义类型为 “ppc_md” 的结构,其中包含通用代码将用来获取您的平台特定代码的各种回调
一个内核映像可能支持多个平台,但前提是这些平台具有相同的核心架构。单个内核构建不能同时支持 Book E 的配置和经典 Powerpc 架构的配置。