免费注册 查看新帖 |

Chinaunix

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

[内存管理] linear的非共享页面写入操作为什么是创建anon类型的页面? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-06-17 08:45 |只看该作者 |倒序浏览
在handle_pte_fault()中,将会根据pte和vma的状态来判断创建对应的FILE_MAPPING和ANON 页面,
handle_pte_fault
                if (pte_none(entry)) {
                        if (vma->vm_ops) {
                                if (likely(vma->vm_ops->fault))
                                        return do_linear_fault(mm, vma, address,pte, pmd, flags, entry);
                        }
                        return do_anonymous_page(mm, vma, address,pte, pmd, flags);
本人理解,包括网上帖子描述do_linear_fault主要是用来创建FILE_MAPPING页面的,
do_linear_fault
->__do_fault
                /*Should we do an early C-O-W break?  */
        page = vmf.page;
        if (flags & FAULT_FLAG_WRITE) {
                if (!(vma->vm_flags & VM_SHARED)) {
                        page = cow_page;
                        anon = 1;
                        copy_user_highpage(page, vmf.page, address, vma);
                        __SetPageUptodate(page);

在这里,为啥COW的写入是非VM_SHARED类型,就是ANON类型页面,如果是VM_SHARED类型,就是FILE_MAPPING页面呢?

谢谢!

论坛徽章:
0
2 [报告]
发表于 2014-06-17 09:55 |只看该作者
你想错了。这里只是判断对非VM_SHARE页进行的写缺页异常,不光是要fault进存放磁盘数据的页(要插入pagecache的页),还要另外分配一个新的页用来COW,用于此进程写数据——因为这是一个私有映射(!VM_SHARED),它所做的修改不能反映到文件中去,也就是说不能修改pagecache。

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
3 [报告]
发表于 2014-06-17 12:16 |只看该作者
!VM_SHARED表示"私有映射",即该区域为本进程私有的,不与其它进程共享,此时需要复制一个新的副本给"私有映射"专用,这里并非 通常理解的COW,COW是在do_wp_fault流程中处理

论坛徽章:
0
4 [报告]
发表于 2014-06-17 12:58 |只看该作者
谢谢njuzhyf和humjb_1983。

在创建file map映射时,如果不设置MAP_SHARE,是不是就是不带vm_share的flag? 这个私有映射的场景是哪种情况?

对于filemapping,也可能存在写的情况,写一个file的page cache不反应到文件中去,难道还反应到anon页面上去?

如果要是private page写,为啥就不是到COW那里一起处理创建新anon页面操作呢?

这里我肯定是有个地方没转过弯来,不知道哪个地方概念搞糊涂了。

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
5 [报告]
发表于 2014-06-17 14:40 |只看该作者
kerryxi 发表于 2014-06-17 12:58
谢谢njuzhyf和humjb_1983。

在创建file map映射时,如果不设置MAP_SHARE,是不是就是不带vm_share的flag ...

“如果不设置MAP_SHARE,是不是就是不带vm_share的flag”---对的,私有映射场景很多吧,如果不想mmap的区域跟其它进程共享,就可以用私有映射~
个人理解这里的COW,和fork之后的COW是不同的,这里涉及文件的map,应该也不能跟anon混在一起处理,这是不一样的分支。

论坛徽章:
0
6 [报告]
发表于 2014-06-17 14:57 |只看该作者
humjb_1983 发表于 2014-06-17 14:40
“如果不设置MAP_SHARE,是不是就是不带vm_share的flag”---对的,私有映射场景很多吧,如果不想mmap的区 ...


如果说不带VM_SAHRE的是私有映射,走的就是anon的映射分支。但那么带MAP_SHARE也是mmap常用的参数,这里面也可能是share的anon页面。  所以为什么!VM_SHARE就是anon私有映射页面,而VM_SHARE就变成是文件映射 page呢?两者为啥就不是同一种类型的anon映射页面呢?

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
7 [报告]
发表于 2014-06-17 15:05 |只看该作者
如果说不带VM_SAHRE的是私有映射,走的就是anon的映射分支。--- 这个为什么?anon映射跟VM_SHARE标志没多大关系吧~~

论坛徽章:
0
8 [报告]
发表于 2014-06-17 17:48 |只看该作者
回复 4# kerryxi


"在创建file map映射时,如果不设置MAP_SHARE,是不是就是不带vm_share的flag? 这个私有映射的场景是哪种情况?"

举个简单的例子~~ELF可执行文件有.text, .data, .bss..... 在程序执行的时候,.data应该就是私有映射的file mmap。不然你觉得你程序执行时
修改一些全局变量的值会反映到你的可执行文件中去?~~就是你列出代码的那个逻辑,你读的时候,内核是不会管的,直接读pagecache中的页,但
你想写的时候,内核会COW出来一个匿名页面出来了。


“对于filemapping,也可能存在写的情况,写一个file的page cache不反应到文件中去,难道还反应到anon页面上去?”


你说对了,比如你程序修改全局变量,这个修改后的值在程序运行期间确实是存放在COW出来的那个匿名页面中。


“如果要是private page写,为啥就不是到COW那里一起处理创建新anon页面操作呢?

这里我肯定是有个地方没转过弯来,不知道哪个地方概念搞糊涂了。   “


呵呵呵。。。映射有两种:私有和共享;页面来源有两种:文件和匿名;有私有文件映射,共享文件映射,私有匿名映射,共享匿名映射。。。
仔细看看do_mmap_pgoff和handle_pte_fault。

论坛徽章:
0
9 [报告]
发表于 2014-06-17 18:18 |只看该作者
回复 8# njuzhyf


    那对于一个file映射,如果此时进程要写入这个页面,那么创建新的page页面是什么类型? 因为file mapping的页面也可能要写入到磁盘的。

论坛徽章:
0
10 [报告]
发表于 2014-06-17 22:50 |只看该作者
回复 9# kerryxi

私有映射,就COW出一个匿名页面让进程写;共享映射就会直接写pagecache中的页,并标记那页为脏
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP