免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: eclipse_2
打印 上一主题 下一主题

进程是如何映射页表的? [复制链接]

论坛徽章:
0
11 [报告]
发表于 2009-03-10 20:58 |只看该作者
原帖由 eclipse_2 于 2009-3-10 16:30 发表

进程的用户空间也是由内核的MMU来管理马?
当一个进程来访问用户太的页面时,它也要时通过内核页表来访问的吗?
有点晕了 。。。。。。
一个进程有除了有一个于其他进程一样的内核页表之外,还有一个自己的 ...

一个进程只有一个页目录, 在页目录的后面1/4部分是映射的内核页表的.

论坛徽章:
0
12 [报告]
发表于 2009-03-10 22:01 |只看该作者

回复 #1 eclipse_2 的帖子

Linux内存管理实现的方式

论坛徽章:
0
13 [报告]
发表于 2009-03-10 22:06 |只看该作者
原帖由 kns1024wh 于 2009-3-10 22:01 发表
Linux内存管理实现的方式

一个内存的页面是如何跟物理磁盘上的页面联系上的?
也就是说do_no_page的时候,分配一个内存页面,然后把物理磁盘上的页面的内容读入
是怎么找的到磁盘上的页面的?有什么映射关系吗?

论坛徽章:
0
14 [报告]
发表于 2009-03-10 22:22 |只看该作者
应该是通过swap_entry这个结构来连接的吧

论坛徽章:
0
15 [报告]
发表于 2009-03-10 23:29 |只看该作者
反正我看深入理解linux内核,中没有提到用户态的内存页表。
进程的所有信息都应该在内核中记录。内核负责调度。
用户态其实没什么东西。

论坛徽章:
0
16 [报告]
发表于 2009-03-10 23:36 |只看该作者
原帖由 emmoblin 于 2009-3-10 23:29 发表
反正我看深入理解linux内核,中没有提到用户态的内存页表。
进程的所有信息都应该在内核中记录。内核负责调度。
用户态其实没什么东西。

我觉得还是有用户态的内存页表吧
内核页表只是对3g-4g的虚拟地址映射
而0-3g的虚拟地址的映射纪录在用户态的内存页表中

论坛徽章:
0
17 [报告]
发表于 2009-03-11 15:06 |只看该作者
原帖由 eclipse_2 于 2009-3-10 16:22 发表

就是一个新的进程从装入内存开始,他的页表是如何建立的。



一个新进程,他的页表是从他的父进程复制过来的。2.6内核是fork时候让进程共享他父进程的页表,当修改页表项的时候,内核才会创建指定页表项。
然后进程再把它自己需要的库文件通过mmap系统调用映射到它自己的地址空间。当进程需要访问这些映射的地址空间的时候(例如某个块),会发生缺页,然后再依照缺页处理过程到磁盘上找到相应的数据块读入内存。这时候这个进程的页表已经基本被刷成全新的了。

例如:

$ strace ls
execve("/bin/ls", ["ls"], [/* 42 vars */]) = 0
brk(0)                                  = 0x90e3000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY)      = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=72332, ...}) = 0
mmap2(NULL, 72332, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb7fe3000
close(3)                                = 0
open("/lib/librt.so.1", O_RDONLY)       = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\200\211\252\0004\0\0\0$"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=48484, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7fe2000
mmap2(0xaa7000, 37456, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xaa7000
mmap2(0xaaf000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x7) = 0xaaf000
close(3)                                = 0
open("/lib/libselinux.so.1", O_RDONLY)  = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\240|\232\0004\0\0\0004"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=110092, ...}) = 0

[ 本帖最后由 zhang1980s 于 2009-3-11 15:17 编辑 ]

论坛徽章:
0
18 [报告]
发表于 2009-03-11 15:37 |只看该作者
原帖由 zhang1980s 于 2009-3-11 15:06 发表



一个新进程,他的页表是从他的父进程复制过来的。2.6内核是fork时候让进程共享他父进程的页表,当修改页表项的时候,内核才会创建指定页表项。
然后进程再把它自己需要的库文件通过mmap系统调用映射到它 ...

请问
缺页中断时 内存中的页面如何跟物理磁盘的页面联系上的?
也就是do_no_page的时候如何找的到磁盘的那个页的?

论坛徽章:
0
19 [报告]
发表于 2009-03-11 15:55 |只看该作者
markw来了,收衣服啊!!

论坛徽章:
0
20 [报告]
发表于 2009-03-11 16:06 |只看该作者
原帖由 markw 于 2009-3-11 15:50 发表
1.每个进程只有一个页表,0-3G映射的是用户空间的内存,也就是应用程序可以直接操作的,3-4G映射的内核空间,这部分表由所有进程共享。页表保存在内核态,由内核帮助进程来维护,这个过程对于进程是透明的,进程 ...


对于已经写到交换分区的部分,这个时候页表项不是空,而是保存了它在交换分区里的地址,根据这个地址可以从交换分区取出对应的物理页面。
》》
请问所有的磁盘都是交换设备吗?
如果不是,那么它的页面是如何被找到的 ?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP