|
发表于 2004-12-29 11:24:11
|
显示全部楼层
每个进程都是拥有4G地址空间,只是用户态下面无法访问高1G空间;内核空间是被所有进程共享的,那么该进程的页目录表的高项部分就应该是内核页表的内容,只是USER/SUPERVISOR位是0,用户态无法访问而已;CR3寄存器就是该进程的页目录地址,进程从用户态切换到内核态,CR3没变,但是却拥有可以访问高项的内核空间的权限了,这样发生系统调用的时候,内核也直接访问当前进程的用户空间,使用的虚拟地址也和当前进程处于用户空间时候使用的虚拟地址是一样的。
下面这段代码是get_pgd_slow(pgd_alloc调用)中的:
memcpy(pgd + USER_PTRS_PER_PGD,
swapper_pg_dir + USER_PTRS_PER_PGD,
(PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t));
pgd_alloc可以为新进程建立一个页全局目录,swapper_pg_dir是内核页全局目录地址,USER_PTRS_PER_PGD是页全局目录中用户空间所占的表项数目,这里应该可以看到把内核页目录复制到进程的页目录的高项部分了。
由此看进程应该是不会直接使用内核页表,都是用的复制品。
前面说得概念有点混淆,而且我的理解也很片面,还请兄弟继续指正。 |
|