Chinaunix首页 | 论坛 | 博客
  • 博客访问: 193134
  • 博文数量: 41
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 131
  • 用 户 组: 普通用户
  • 注册时间: 2013-09-03 20:39
文章分类

全部博文(41)

文章存档

2019年(2)

2018年(1)

2014年(19)

2013年(19)

分类: LINUX

2014-01-18 18:20:17

每个进程都是拥有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是页全局目录中用户空间所占的表项数目,这里应该可以看到把内核页目录复制到进程的页目录的高项部分了。 
由此看进程应该是不会直接使用内核页表,都是用的复制品。 



http://blog.csdn.net/evenness/article/details/7656812
阅读(3021) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~