免费注册 查看新帖 |

Chinaunix

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

x86下dma映射以及页面锁页换页的问题 [复制链接]

论坛徽章:
0
41 [报告]
发表于 2008-05-07 21:13 |只看该作者
鉴于从第二页就开始走题  还是改下名字吧

论坛徽章:
0
42 [报告]
发表于 2008-05-07 22:58 |只看该作者
kernel分配一个page后,
只有page为有名页时,才加入pagecache和LRU。
而page为匿名页时,kernel并不将page加入pagecache和LRU。首先没有(inode,index)这个标识,就没办法加入pagecache;加入LRU的话,也没有意义,因为kswapd对LRU中的匿名页完全是特殊处理。


kswap有两个相反的功能

甲: 扫描0~3G的各vm_area的过程,在这个过程中
      a) 将各匿名页变有名(仅限脏的匿名页,非脏匿名页是另外一套处理)
             1. 分配一个(SwapDevice_Inode,SwapDevice_Index),另page变有名
             2. page加入pagecache和LRU
             3. 再以后的处理,以有名页来对待这个page。
      b)遇到有名页
             1. pte从引用page,变为引用(inode,Index),因此page->count--。

乙: 扫描LRU中的过程,这个过程中。
      a) 将各有名页变匿名(前提是这么做有意义,变匿名时count--将导致page释放到buddy)
         b) 遇到匿名页,是另外一套处理。page关联buffer_head则留在LRU;否则丛LRU删除


既甲从(0,3G)中,挑选出来匿名页,将他们变有名,并另他们都在pagecache和LRU中;
同时从(0,3G)中,挑选出来有名页,另pte不再引用这些page,count--。
同时还有个兼职,非脏匿名页只可能是empty_zero_page,直接解除影射,真缺页的时候再补上。

而乙从LRU中,挑选出来有名页,将他们变匿名。前提是(非脏) && (不关联buffer_head) && (匿名后count==0),
同时还有几个兼职,有名页因脏而无法释放的,根据(inode,index),进行回写。
                  有名页因关联buffer_head无法释放的,尝试解除buffer_head与page的关联。
                  匿名页关联buffer_head的,尝试解除buffer_head与page的关联。若成功则将page从LRU剔除。
                  匿名页不关联buffer_head的,直接从LRU剔除



swapout的过程大概如此,
第一步扫描[0,3G]是为的:
     1)page均关联(inode,index),脏的话有地方可以回写,否则匿名写都没地方写。
     2)page均关联(inode,index),pte若不引用page后,可以引用(inode,index)。
真正的关键还是在第二步。



另外,mmap影射内存而非文件时,
如果只是读,那么都是读的empty_zero_page,和LRU扯不上关系。

但是一旦写,马上COW出来一个匿名的脏页,
随后kswapd在扫描[0,3G]时,马上将它关联一个(SwapDevice_Inode,SwapDevice_Index),并加入到pagecache和LRU;然后pte不再引用这个新产生的有名脏页,而是引用(SwapDevice_Inode,SwapDevice_Index)。
随后kswapd在扫描LRU时,将这个有名脏页,回写到(SwapDevice_Inode,SwapDevice_Index),变为有名干净页;然后再变匿名,变为匿名干净页,从而count==0,释放至buddy。

论坛徽章:
0
43 [报告]
发表于 2008-05-07 23:10 |只看该作者
原帖由 zx_wing 于 2008-5-7 18:23 发表
塑料袋讲的太细了,我有点看不懂了


恐怕不是太细。面对一个涵盖广,关节多的话题,我觉得自己要么说出来颠三倒四,要么说的不够精确。

上个月我去一个地方面试,人家让我自己谈内存管理,也是这么一个大题目,我觉得实在说不清,说了两句,直接说不懂。最后被pass了。

论坛徽章:
0
44 [报告]
发表于 2008-05-08 10:49 |只看该作者
motalelf 解释的够详细!

不过kernel 2.6的MM进行了相当大的修改。例如引入了reverse mapping,kswap中扫描所有process的mm_struct这样耗时的工作,已经不需要了。

论坛徽章:
0
45 [报告]
发表于 2008-05-08 15:19 |只看该作者
原帖由 motalelf 于 2008-5-7 22:58 发表
另外,mmap影射内存而非文件时,
如果只是读,那么都是读的empty_zero_page,和LRU扯不上关系。

但是一旦写,马上COW出来一个匿名的脏页,

这应该是针对私有的情况吧  如果是共享映射应该不存在cow的情况吧

论坛徽章:
0
46 [报告]
发表于 2008-05-08 15:23 |只看该作者
原帖由 motalelf 于 2008-5-7 22:58 发表
kernel分配一个page后,
只有page为有名页时,才加入pagecache和LRU。
而page为匿名页时,kernel并不将page加入pagecache和LRU。首先没有(inode,index)这个标识,就没办法加入pagecache;加入LRU的话,也没有 ...

非常清楚 万分感谢

论坛徽章:
0
47 [报告]
发表于 2012-03-12 02:40 |只看该作者
好文章!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP