内核维护着一组自己使用的页表,驻留在所谓主内核页全局目录(master kernel page global directory)中。系统初始化后,这组页表永远不会被任何进程或者任何内核线程直接使用;更确切第说,主内核页全局目录的最高目录项部分作为参考模 型,为系统中每个普通进程对应的页全局目录项提供模板。0x2ff |--------------------|| || || ||--------------------|| |Provisional kernel Page Tables|--------------------|_end| || |Uninitialized kernel data| ||--------------------|_edata| || || |Initialized kernel data| ||--------------------|_etext| || || |Kernel code| || |0x100 | ||--------------------|_text (0x00100000)| || |Unavailable page fames0x9f | ||--------------------|| || || |Available page fames| || |1 | ||--------------------|0 | |Unavailable page fames|--------------------|Page frame #Linux 2.6的前768个页框(3MB)物理内存前3MB布局示意图内核在初始化的第一阶段,可以通过与物理地址相同的线性地址或者通过从0xc0000000开始的8MB线性地址对RAM的前8MB进行寻址:0项和0x300(768)项的地址字段置为pg0的物理地址,而1项和0x301(769)项的地址字段置为pg1的物理地址
把这四项的Present、Read/Write、User/Supervisor标志置位
把这四项的Accessed、Dirty、 PCD、 PWD、 Page Size标志清0页全局目录放在swapper_pg_dir变量中,而映射前8MB RAM的两个目录项是pg0和pg1:extern pgd_tswapper_pg_dir[1024];typedef struct { unsigned long long pgd; }pgd_t;|--------------------|1023 | || |(对应128MB虚拟空间)| ||--------------------|| || || || || || ||--------------------|769 | |pg1 --> 5~8MB|--------------------|768 | |pg0 --> 1~4MB|--------------------|| || || || || || || || || || || || || || || || ||--------------------|1 | |pg1 --> 5~8MB|--------------------|0 | |pg0 --> 1~4MB%%cr3------->|--------------------|Provisional kernel Page Tables(swapper_pg_dir)线性地址:0xc000 0000的高20位为1100000000(2)=768当RAM小于896MB时的最终内核页表:内核页表所提供的最终映射必须把从0xc000 0000开始的内核线性地址转化为从0开始的物理地址
宏_pa用于把从PAGE_OFFSET开始的线性地址转换成相应的物理地址,而宏_va做相反的转化
主内核页全局目录(The master kernel Page Global Directory)仍然保存在swapper_pg_dir变量中。它由paging_init()函数初始化
线性地址的最高128MB留给几种映射取用,因此剩余的映射RAM的内核地址空间为1GB - 128MB = 896MB
进程间前3G的线性空间是不同的, 而最后1G内核空间都是相同的, 即有着同样的页表目录项跟页表, 这些页表目录称为master kernel page global directory, 保存在swapper_pg_dir(数组1024项)中内核的启动分两个阶段:第一阶段建立了页表目录项中的2个项, 既有2个页表, 每个页表一般有1024个项, 这样就总共可以映射8M的内存空间。启动分页?这个8M的就可以被使用了(这个8M的映射是通过线性映射来的, 内核来静态的初始化它)第二阶段初始化所有1G线性空间的对应的256个页表全部初始化, 对物理内存进行映射, 从页表的第768项开始, 因为之前的已经映射好了