ARM Linux 上的内核内存布局¶
Russell King <rmk@arm.linux.org.uk>
2005 年 11 月 17 日 (2.6.15)
本文档描述了 Linux 内核用于 ARM 处理器的虚拟内存布局。 它指出了哪些区域可供平台使用,以及哪些区域由通用代码使用。
ARM CPU 最多可以寻址 4GB 的虚拟内存空间,并且这必须在用户空间进程、内核和硬件设备之间共享。
随着 ARM 架构的成熟,有必要为新设施保留某些 VM 空间区域; 因此,本文档可能会随着时间的推移保留更多的 VM 空间。
起始 |
结束 |
用途 |
---|---|---|
ffff8000 |
ffffffff |
copy_user_page / clear_user_page 使用。 对于 SA11xx 和 Xscale,这用于设置微型缓存映射。 |
ffff4000 |
ffffffff |
ARMv6 及更高版本 CPU 上的缓存别名。 |
ffff1000 |
ffff7fff |
保留。 平台不得使用此地址范围。 |
ffff0000 |
ffff0fff |
CPU 向量页。 如果 CPU 支持向量重定位(控制寄存器 V 位),则 CPU 向量将映射到此处。 |
fffe0000 |
fffeffff |
XScale 缓存刷新区域。 这在 proc-xscale.S 中用于刷新整个数据缓存。(XScale 没有 TCM。) |
fffe8000 |
fffeffff |
用于在 CPU 内部安装 DTCM 的平台的 DTCM 映射区域。 |
fffe0000 |
fffe7fff |
用于在 CPU 内部安装 ITCM 的平台的 ITCM 映射区域。 |
ffc80000 |
ffefffff |
Fixmap 映射区域。 fix_to_virt() 提供的地址将位于此处。 |
ffc00000 |
ffc7ffff |
保护区域 |
ff800000 |
ffbfffff |
固件提供的 DT blob 的永久、固定只读映射 |
fee00000 |
feffffff |
PCI I/O 空间的映射。 这是 vmalloc 空间内的静态映射。 |
VMALLOC_START |
VMALLOC_END-1 |
vmalloc() / |
PAGE_OFFSET |
high_memory-1 |
内核直接映射 RAM 区域。 这将映射平台的 RAM,并且通常以 1:1 的关系映射所有平台 RAM。 |
PKMAP_BASE |
PAGE_OFFSET-1 |
永久内核映射。 将 HIGHMEM 页面映射到内核空间的一种方式。 |
MODULES_VADDR |
MODULES_END-1 |
内核模块空间。 通过 insmod 插入的内核模块使用动态映射放置在此处。 |
TASK_SIZE |
MODULES_VADDR-1 |
当使用 KASan 时,KASan 影子内存。 从 MODULES_VADDR 到内存顶部的范围在此处被影子化,每个字节的内存有 1 位。 |
00001000 |
TASK_SIZE-1 |
用户空间映射。 每个线程的映射通过 mmap() 系统调用放置在此处。 |
00000000 |
00000fff |
CPU 向量页/空指针陷阱。 不支持向量重映射的 CPU 将其向量页放置在此处。 内核和用户空间的 NULL 指针解引用也会通过此映射捕获。 |
请注意,与上述区域冲突的映射可能会导致内核无法启动,或者可能会导致内核在运行时(最终)崩溃。
由于未来的 CPU 可能会影响内核映射布局,用户程序不得访问其 0x0001000 到 TASK_SIZE 地址范围之外的任何内存。 如果他们希望访问这些区域,他们必须使用 open() 和 mmap() 设置自己的映射。