代码是:
include/asm-x86/page_32.h
#define __pa(x) ((unsigned long)(x)-PAGE_OFFSET)
#define __va(x) ((void *)((unsigned long)(x)+PAGE_OFFSET))
如何理解 __pa(x) ?
谢谢
整个地址空间分为用户空间和内核空间。在 x86 中,用户与内核空间的比例通常为 3:1。这意味着较低的 3GiB 用于用户空间,而较高的 1GiB 用于内核。配置内核时可以更改此比率。
现在PAGE_OFFSET
宏指示内核地址空间的开始,在 x86 中,用户与内核的比例默认为 3:1,其值为0xC000000
.
内核地址空间的第一个区域用于将页框映射(直接映射)到虚拟地址空间,该区域跨越从PAGE_OFFSET
到high_memory
,high_memory
当系统有超过 896MiB 的内存时使用。
可以直接映射的内存区域被称为normal
,不能被映射的页在highmem