首页UC › 内核空间页表的建立

内核空间页表的建立

页目录表及页表在定义如下:在 http://lxr.linux.no/#linux-bk+v2.6.11.5/include/asm-i386/pgtable.h#L34
extern pgd_t swapper_pg_dir[1024];
extern unsigned long pg0[1024];
其中swapper_pg_dir 为页目录,pg0 为一临时页表。

何以见得swapper_pg_dir是内核的页目录?
在内核的启动过程中,有如下代码:在http://lxr.linux.no/#linux-bk+v2.6.11.5/arch/i386/kernel/head.S#L182

从这里我们看出,内核启动时,内核把swapper_pg_dir的地址存入CR3寄存器中,并设置CR0中的PG位,打开分页机制。

函数paging_init()通过调用pagetable_init()对swapper_pg_dir进行填充、建立页表。我们来看 pagetable_init()的代码:在http://lxr.linux.no/#linux-bk+v2.6.11.5/arch/i386 /mm/init.c#L310

在继续深究之前,我们有必要了解几个相关的函数和宏。为了避免使本文臃肿、打乱本文的主线,我把相关内容写在了另一篇文章里

我们看kernel_physical_mapping_init()做了什么:在http://lxr.linux.no/#linux-bk+v2.6.11.5/arch/i386/mm/init.c#L143

多次循环后,第769~1024项页目录项及相应页表便建立起来了,这些页表建立了PAGE_OFFSET以上的896MB低端内核空间与物理内存的前max_low_pfn页的的映射。

内核空间的页表swapper_pg_dir建立了,由于每个进程公享内核空间,所以每个进程也就有了内核空间到物理空间的映射了。
进程还有各自的虚拟空间(也叫用户空间),进程的虚拟空间与物理空间之间的映射又是怎样建立的呢?让我开始踏上新的旅程吧:进程的虚拟空间

发表评论