移植

摘自列表存档 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)

用于初始化中断的特定于机器的函数。