移植¶
摘自列表存档 http://lists.arm.linux.org.uk/pipermail/linux-arm-kernel/2001-July/004064.html
初始定义¶
以下符号定义依赖于您了解 __virt_to_phys() 对您的机器的转换。 此宏将传递的虚拟地址转换为物理地址。 通常,它只是
phys = virt - PAGE_OFFSET + PHYS_OFFSET
解压缩器符号¶
- ZTEXTADDR
解压缩器的起始地址。 这里讨论虚拟地址或物理地址没有意义,因为在调用解压缩器代码时,MMU 将处于关闭状态。 通常,您在此地址调用内核以开始引导。 这不必位于 RAM 中,它可以位于闪存或其他只读或可读写寻址的介质中。
- ZBSSADDR
解压缩器的零初始化工作区的起始地址。 这必须指向 RAM。 解压缩器将为您进行零初始化。 同样,MMU 将处于关闭状态。
- ZRELADDR
这是将写入解压缩后的内核并最终执行的地址。 以下约束必须有效
__virt_to_phys(TEXTADDR) == ZRELADDR
内核的初始部分经过精心编码,使其与位置无关。
- INITRD_PHYS
放置初始 RAM 磁盘的物理地址。 仅当您使用 bootpImage 内容时才相关(仅在旧的 struct param_struct 上有效)。
- INITRD_VIRT
初始 RAM 磁盘的虚拟地址。 以下约束必须有效
__virt_to_phys(INITRD_VIRT) == INITRD_PHYS
- PARAMS_PHYS
struct param_struct 或标签列表的物理地址,为内核提供有关其执行环境的各种参数。
内核符号¶
- PHYS_OFFSET
RAM 第一个库的物理起始地址。
- PAGE_OFFSET
RAM 第一个库的虚拟起始地址。 在内核引导阶段,虚拟地址 PAGE_OFFSET 将映射到物理地址 PHYS_OFFSET,以及您提供的任何其他映射。 这应该与 TASK_SIZE 的值相同。
- TASK_SIZE
用户进程的最大大小(以字节为单位)。 由于用户空间始终从零开始,因此这是用户进程可以访问的最大地址 + 1。 用户空间堆栈从该地址向下增长。
任何低于 TASK_SIZE 的虚拟地址都被视为用户进程区域,因此由内核在逐进程的基础上动态管理。 我将此称为用户段。
任何高于 TASK_SIZE 的内容对于所有进程都是通用的。 我将此称为内核段。
(换句话说,您不能将 IO 映射放置在 TASK_SIZE 以下,因此不能放置在 PAGE_OFFSET)。
- TEXTADDR
内核的虚拟起始地址,通常为 PAGE_OFFSET + 0x8000。 这是内核映像的最终位置。 在最新的内核中,它必须位于 128MB 区域中的 32768 字节处。 以前的内核此处限制为 256MB。
- DATAADDR
内核数据段的虚拟地址。 使用解压缩器时,不得定义。
- VMALLOC_START / VMALLOC_END
限定 vmalloc() 区域的虚拟地址。 此区域中不得有任何静态映射; vmalloc 将覆盖它们。 地址也必须位于内核段中(见上文)。 通常,vmalloc() 区域从最后一个虚拟 RAM 地址(使用变量 high_memory 找到)上方 VMALLOC_OFFSET 字节处开始。
- VMALLOC_OFFSET
通常合并到 VMALLOC_START 中的偏移量,以在虚拟 RAM 和 vmalloc 区域之间提供一个空洞。 我们这样做是为了允许捕获越界内存访问(例如,某些内容写入映射内存映射的末尾)。 通常设置为 8MB。
架构特定宏¶
- BOOT_MEM(pram,pio,vio)
pram 指定 RAM 的物理起始地址。 必须始终存在,并且应与 PHYS_OFFSET 相同。
pio 是包含 IO 的 8MB 区域的物理地址,用于 arch/arm/kernel/debug-armv.S 中的调试宏。
vio 是 8MB 调试区域的虚拟地址。
预计调试区域将在代码稍后的架构特定代码中重新初始化(通过 MAPIO 函数)。
- BOOT_PARAMS
与 PARAMS_PHYS 相同,请参阅 PARAMS_PHYS。
- FIXUP(func)
特定于机器的修复,在内存子系统初始化之前运行。
- MAPIO(func)
用于映射 IO 区域(包括上面的调试区域)的特定于机器的函数。
- INITIRQ(func)
用于初始化中断的特定于机器的函数。