进程空间总共有4G,其中最高1G的空间(从0xC0000000开始)便是内核空间,剩下是用户空间。虽然内核空间占据了每个虚拟空间中的最高 1G 字节,但映射到物理内存却总是从最低地址(0×00000000)开始,所以内核空间的线性地址与物理地址之间存在一个偏移量0xC0000000,也叫 PAGE_OFFSET。
相关定义如下:在http://lxr.linux.no/#linux-bk+v2.6.11.5/include/asm-i386/page.h#L131
1 2 3 4 |
#define PAGE_OFFSET ((unsigned long)__PAGE_OFFSET) ...... #define __pa(x) ((unsigned long)(x)-PAGE_OFFSET) #define __va(x) ((void *)((unsigned long)(x)+PAGE_OFFSET)) |
其中__pa宏把内核空间的线性地址转换为物理地址,__va宏相反。注意这两个宏只适用于内核空间。。。
内核虚拟地址空间只有1GB大小,因此超出1GB大小的物理内存(即高端内存)就不能映射到内核空间。为此,内核地址空间的后128MB被腾出来,专门用于映射高端内存,否则,没有线性地址的高端内存不能被内核所访问。
因此,除去为映射高端内存而腾出的128MB,直接能够映射的物理内存大小只有896MB,在源码中叫high_memory。如下图所示:
我们内核新手之旅的下一站是:内核空间页表的建立。
发表评论
要发表评论,您必须先登录。