免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 14700 | 回复: 3
打印 上一主题 下一主题

请问进程的页表存储在哪里 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-06-02 11:02 |只看该作者 |倒序浏览
本帖最后由 wgs13579 于 2010-06-02 11:09 编辑

最近看书看到Linux内存管理,有个问题一直不明白:
   
    内核有自己的页表,进程有自己的页表,内核的页表存储在内核自己的虚拟空间中,那进程的页表呢?进程的页表存储在哪里呢?

   按照我看到的某一篇文章说,进程的页表也存储在内核的虚拟空间的低端内存中中,每次进程切换的时候,只需要将该页表的虚拟地址减去一个偏移量就可以了,那如果我创建的进程足够多,那岂不是内核的虚拟空间用来存放进程的页表都不够了,毕竟一个页表需要4M的空间。

另外的一个想法就是,进程在内核中有自己的某个数据结构,该数据结构包含了页目录的虚拟地址,进程切换的时候,将该虚拟地址赋值给CR3就行了,就是说在内核空间中只有进程的页目录的虚拟地址,不包含整个页表。

论坛徽章:
0
2 [报告]
发表于 2010-06-02 23:52 |只看该作者
我记得进程本身的页表也是动态分配的,并且有可能被交换到硬盘上。可以搜一下 DOUBLE PAGE FAULT.
不过记不清是LINUX OR WINDOWS了?T_T

"按照我看到的某一篇文章说,进程的页表也存储在内核的虚拟空间的低端内存中中,每次进程切换的时候,只需要将该页表的虚拟地址减去一个偏移量就可以了,"
这段我觉得是错的。你从啥文章看来的?给个连接?

论坛徽章:
0
3 [报告]
发表于 2010-06-03 13:47 |只看该作者
http://www.eefocus.com/article/09-06/74896s.html

那是链接

里面有这样一段话:

例如,进程的页目录PGD(属于内核数据结构)就处于内核空间中。在进程切换时,要将寄存器CR3设置成指向新进程的页目录PGD,而该目录的起始地址在内核空间中是虚地址,但CR3所需要的是物理地址,这时候就要用__pa()进行地址转换。在mm_context.h中就有这么一行语句:

asm volatile(“movl %0,%%cr3”: :”r” (__pa(next->pgd));

这是一行嵌入式汇编代码,其含义是将下一个进程的页目录起始地址next_pgd,通过__pa()转换成物理地址,存放在某个寄存器中,然后用mov指令将其写入CR3寄存器中。经过这行语句的处理,CR3就指向新进程next的页目录表PGD了。


其中__pa()的作用就是将虚拟地址减去偏移量,所以我才会那样理解~~~

论坛徽章:
0
4 [报告]
发表于 2010-06-03 23:15 |只看该作者
其实在1楼有一个问题。在X86-32, 4K PAGE的情况下,虚拟地址是分成3段,是有2级目录+1个OFFSET的。2级目录中,一个是PAGE DIRECTORY, 另外一级是PAGE TABLE。一个PAGE TABLE ENTRY 可以对应4K。一个PAGE DIRECTORY ENTRY 对应4M。

所以要完全映射4G 虚拟地址空间,那么只需要4G/4M= 1K 数目的PAGE DIRECTORY ENTRY, 这种情况下,每个ENTRY 是4 BYTE. 那么总共最小也只需要4K BYTE. 因为PAGE TABLE ENTRY可以为空,只要有一个不为空即可。

另外,KERNEL 部分的PAGE TABLES是所有PROCESS共享的。

3楼那段话没错。之前你说的太简单了,我没看明白。

其实建议看看 ULK3 CHAPTER 2. 一切就全明白了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP