免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2339 | 回复: 6

[内存管理] 内存映射的请求调页 [复制链接]

论坛徽章:
16
2015亚冠之吉达阿赫利
日期:2015-08-17 11:21:462015年迎新春徽章
日期:2015-03-04 09:58:11酉鸡
日期:2014-12-07 09:06:19水瓶座
日期:2014-11-04 14:23:29天秤座
日期:2014-03-02 08:57:52双鱼座
日期:2014-02-22 13:07:56午马
日期:2014-02-14 11:08:18双鱼座
日期:2014-02-13 11:09:37卯兔
日期:2014-02-06 15:10:34子鼠
日期:2014-01-20 14:48:19戌狗
日期:2013-12-19 09:37:46射手座
日期:2013-12-19 09:33:47
发表于 2012-05-02 10:38 |显示全部楼层
ULK3 第16章 内存映射的请求分页  一节分析do_no_page函数的部分:

1.调用nopage方法,它返回包含所请求页的页框的地址
2.如果进程试图对页进行写入而该内存映射的是私有的,则通过把刚读取的页拷贝一份并把它插入页的非活动链表中来避免进一步的“写时复制异常”。
   如果私有内存映射区域还没有一个包含新页的被动匿名线性区(slave anonymous memory region),它要么追加一个新的被动匿名线性区,要么增大
   现有的。在下面的步骤中,该函数使用新页新而不是 nopage方法返回的页,所以后者不会被用户态进程修改。


这里有两个疑问:

1)则通过把刚读取的页拷贝一份并把它插入页的非活动链表中来避免进一步的“写时复制异常”。
这个不是很理解,为什么要拷贝到非活动链表,为什么拷贝到非活动链表后就可以避免进一步的“写时复制异常”.
2)被动匿名线性区(slave anonymous memory region)是什么啊,貌似没有听说过!

论坛徽章:
0
发表于 2012-05-02 17:34 |显示全部楼层
不懂帮顶

论坛徽章:
0
发表于 2012-05-03 10:47 |显示全部楼层
1)则通过把刚读取的页拷贝一份并把它插入页的非活动链表中来避免进一步的“写时复制异常”。
这个不是很理解,为什么要拷贝到非活动链表,为什么拷贝到非活动链表后就可以避免进一步的“写时复制异常”.

不知道,我看了2.6.9和3.2.9的代码,貌似都是加到active链表的呀。
拷贝到非活动链表后就可以避免进一步的“写时复制异常”,这个可能是表述上的问题吧。

2)被动匿名线性区(slave anonymous memory region)是什么啊,貌似没有听说过!

我也没有听说过。不过,猜想一下……
当vma以private映射到file,写操作造成cow的时候,cow分配的new_page其实是一个anon page(因为它已经私有化了,不再对应到文件了),这个new_page跟其对应的vma属性是不一致的。不知道linux内核是否曾经使用slave anonymous memory region这样的方式来管理这些cow后的new_pages。
我在2.6.9和3.2.9中没有发现这样的逻辑,不知道ULK3所针对的2.6.11是否有。

论坛徽章:
0
发表于 2012-05-03 11:18 |显示全部楼层
第一个问题不清楚,我看到的代码里没有把拷贝后的page加入非活动链表的操作的。

第二个slave anonymous memory region,我猜是作者自己造的一个词吧,可能因为这个memory region并不是用户进程主动创建的,而是内核为处理这种私有映射的COW时没有办法只能新创建一个vma(或扩展原来的),而这个vma都是用来安置此类page的,所以说他是slave anonymous的。

论坛徽章:
0
发表于 2012-05-03 11:34 |显示全部楼层
查了下英文原版的描述:
If the process is trying to write into the page and the memory mapping is private, it avoids a future Copy On Write fault by making a copy of the page just read and inserting it into the inactive list of pages (see Chapter 17).

所以我认为如kouu所说的,应该是一种翻译后表述上的问题。避免未来的COW的主体是通过making a copy of the page而不是inserting it into the inactive list of pages,将page加入非活动链表只是拷贝page后的一种行为,这个行为可能在不同的内核版本里不一样了,加入活动链表还是非活动链表都不是很关键的问题。

论坛徽章:
0
发表于 2012-05-03 17:24 |显示全部楼层
你把他表述的重点理解偏了,他不是说 "拷贝到非活动链表后就可以避免进一步的“写时复制异常”"。
他的意思是:

如果当前是因为“写”缺页导致的异常,就重新分配一页,拷贝一下nopage()返回的页面,进程接下来就可以写了。

如果是"读"缺页导致的异常,大可不必重新分配,直接使用nopage()的页,加上写保护,就OK了。

他的侧重点是要不要重新分配一页,而不是你说的插入哪个LRU链表。因为假如是“写”缺页导致的异常,你没有重新分配一页,而是使用了直接nopage()返回的页,那肯定要加写保护,因为是private映射的嘛,这样这个异常等于没处理完全,进程马上就要进来,进行写保护异常 的处理。实际上就是将一个异常的处理分成两步了。

论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
发表于 2012-05-04 20:38 |显示全部楼层
太久没看了,都没啥概念了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP