|
发表于 2004-12-26 20:10:54
|
显示全部楼层
二级分页的话,IA-32把高十位做为页目录索引,中间10位是页表索引,最后12位是OFFSET;那么内核页目录的前768项相当于占位作用,一直是0。比如我找页目录中第800项,那么首先从CR3寄存器找到页目录所在地址,然后找索引为800的项;这些低项就是占着个位置,否则因为是0就删除这些低项的话就无法按照高10位索引找到正确的项。
每个进程都有自己的页目录,页表,即自己的地址空间;也可能进程之间某个页表相同,这意味着共享这块地址区域。
系统运行在内核态,那么需要对内核空间寻址,那么就利用内核页目录,页表寻址;但是对于需要访问某进程地址空间的情况(比如发生系统调用,给该系统调用传递了一个进程地址空间的参数),那么处于内核态的例程就可以访问该进程地址空间的页目录,页表,从而实现寻址。
但是进程不可以访问内核地址空间,比如如果发生系统调用,给该系统调用传递了一个进程地址空间的参数,而这个参数是在PAGE_OFFSET以上的,那就会引发异常。只有给内核传递PAGE_OFFSET以下的地址参数才合法。
应该说清楚了吧:内核寻址内核空间的时候(>=PAGE_OFFSET),那肯定要用内核页目录,页表了;需要寻址进程地址空间(< AGE_OFFSET),就利用进程页目录,页表。处于用户地址空间的进程是无权直接访问内核空间的,也就无法使用内核页表了。只有通过系统调用,进入内核态执行,这时候才可以访问内核页表。 |
|