免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
31 [报告]
发表于 2008-05-07 16:43 |只看该作者
当alloc_page的时候,page上确实多余一个引用。
但是如果你马上以(inode,index)来标识这个page,对这种非anonymous的page,它本身就需要一个固有的引用。在变anonymous后,才--这个固有引用。

所以alloc_page后,要想不被swapout:

1)不加入LRU链,则kswapd在尝试释放page时,根本看不到这个page,所以不会swapout

2)加入LRU链,但不以(inode,index)来标识这个page,则count==1,既page上多余一个引用。
    a)如果page未被影射至0~3G。则kswapd在扫描mm_struct时,也看不到这个page,既page永远作为anonymous而存在,而且其count==1。kswapd没办法释放这样的页,它只是将不关联buffer_head的anonymous page从LRU中剔除。
    b) 如果page被影射至0~3G。则kswapd在扫描mm_struct时,可以看到这个page。于是以( SwapDevice_inode,SwapDevice_index)来标识这个page,既变成 非anonymous,同时count++,既count==2。随后kswapd在释放page至buddy时,发现这个page->count==2,既使变anonymous后,仍然count==1,所以kswapd也不会释放这样的page。

3)加入LRU链,而且以(inode,index)来标识这个page,然后再次count++,令count上多余一个莫名其妙的引用。则kernel无论使使什么手段,这个page在非anonymous时,count至少是2;anonymous时,至少是1。kswapd也没办法释放这样的page。

4)加入LRU链,而且以(inode,index)来标识这个page,同时记PG_Lock。则kswapd见到PG_Lock的页时,马上忽略过去,不会做任何释放page至buddy的尝试,也不会做任何解除pte对page的引用的尝试(如果page被影射至0~3G)。

论坛徽章:
0
32 [报告]
发表于 2008-05-07 16:50 |只看该作者
谢谢楼上  仔细学习一下先

论坛徽章:
0
33 [报告]
发表于 2008-05-07 17:03 |只看该作者
我想我明白了  对你的耐心万分感谢    不知道最近a版到哪里去了  不然看到这么精彩的回复恐怕要加个保留吧 (哈那我就有2个精华了 虽然都和我没啥关系  全靠cu论坛牛牛们的精彩回复 )

论坛徽章:
0
34 [报告]
发表于 2008-05-07 18:06 |只看该作者
牛人的总结。 需要牢记。。

论坛徽章:
0
35 [报告]
发表于 2008-05-07 18:23 |只看该作者
原帖由 duanius 于 2008-5-7 17:03 发表
我想我明白了  对你的耐心万分感谢    不知道最近a版到哪里去了  不然看到这么精彩的回复恐怕要加个保留吧 (哈那我就有2个精华了 虽然都和我没啥关系  全靠cu论坛牛牛们的精彩回复 )

讲一讲,总结一下。
塑料袋讲的太细了,我有点看不懂了

论坛徽章:
0
36 [报告]
发表于 2008-05-07 19:06 |只看该作者
原帖由 zx_wing 于 2008-5-7 18:23 发表

讲一讲,总结一下。
塑料袋讲的太细了,我有点看不懂了

晕 你不要这么谦虚  给我们这些菜鸟一些活路好不好 压力很大的。。。
  看了motalelf 兄的讲解 我的理解是 一个页是否被换出 就是看两个  一个是这个页是否在lru队列中 还有一个就是它的引用记数在一次解除引用后是否降为0 (( 匿名后count==0) && ( 非脏) 的page) 如果同时满足  就有被换出的可能 所以 只要这两个条件没有被同时满足  页就不会被换出  
我们关心内核中分配的页是否会被换出  根据30楼 在sys_read/write或者sys_mmap2都会将页加入lru队列 所以即使是内核页也有被换出的可能 就看页的引用记数是否满足被换出的标准了 (下面例子纯属猜测)比如我们在内核态分配了一块内存  如果我们什么都不做  就不会被换出  (可能就是31楼的第一种方法 避免加入lru链) 但如果定义了mmap使其映射到用户空间  就有被换出的可能(因为有mmap的系统调用)
这时候就关注引用记数了  就像31楼所说  有几种方法 目的就是使它多一个引用  采用的方法就是避免被(inode,index)表识 (2a) 凭空给它加一次引用  (2b 3) 或者干脆就设置pg_locked(4)

也就是说
1.可能是被swapout的页是在lru里面的页 不管是内核页还是用户态分配的页
2.在加入lru的情况下 如果不被映射到0-3g 也不被标识  一直做为匿名页的存在  是不会被换出的(被映射肯定被标识 反之不一定)
3.如果被映射  或者被标识 那么增加一次count引用 也是不会被换出的
4.或者干脆设pg_locked

不清楚是不是真的理解了  有错误大家挑挑吧。。。  想想感觉差不多 一写出来果然就不那么自信了。
ps 原来他就是传说中的塑料袋阿。。。  果然很不一般 很特别 很厉害。。。

[ 本帖最后由 duanius 于 2008-5-7 19:13 编辑 ]

论坛徽章:
0
37 [报告]
发表于 2008-05-07 19:35 |只看该作者
原帖由 duanius 于 2008-5-7 19:06 发表

晕 你不要这么谦虚  给我们这些菜鸟一些活路好不好 压力很大的。。。
  看了motalelf 兄的讲解 我的理解是 一个页是否被换出 就是看两个  一个是这个页是否在lru队列中 还有一个就是它的引用记数在一次解除引 ...

我还有点小白问题,塑料袋兄也帮忙看看哈。
这里提到了LRU,LRU不是只是和page cache有关系吗?page cache在我印象中只和disk I/O有关系。
如果是单独分配一些页面,这些页面不用于disk I/O,那还会和page cache扯上关系,加入到LRU中吗?
另外是mmap,还是和上面问题一样的,如果是map文件会和LRU扯上关系,如果不map文件,只用于映射内存,会和LRU扯上关系吗?

论坛徽章:
0
38 [报告]
发表于 2008-05-07 20:03 |只看该作者
所以说叫你不要谦虚了  你一小白  我就大白了。。。
我这里有个大白问题 :  原来刚才说的mmap不是映射内存阿。。  我以为字符驱动里分配一块内存映射出去就是映射内存了 (不会因为用户态用描述符打开这个字符设备所以就是文件映射了吧) 那啥叫映射内存阿

论坛徽章:
0
39 [报告]
发表于 2008-05-07 20:11 |只看该作者
原帖由 duanius 于 2008-5-7 20:03 发表
所以说叫你不要谦虚了  你一小白  我就大白了。。。
我这里有个大白问题 :  原来刚才说的mmap不是映射内存阿。。  我以为字符驱动里分配一块内存映射出去就是映射内存了 (不会因为用户态用描述符打开这个字符 ...

“我以为字符驱动里分配一块内存映射出去就是映射内存了”这个就是我说的映射内存哈。
映射文件上是做disk I/O一种方式,细节就不说了,最后和read/write差别也不大。我认为只有映射文件的时候才会把内存页(实际上这个时候的页面属于page cache)和LRU扯上关系,映射内存的时候不会。

论坛徽章:
0
40 [报告]
发表于 2008-05-07 20:29 |只看该作者
我觉得映射内存还是会的吧  不然很多字符驱动里面为啥要锁页呢 比如下面一个字符驱动
在主函数里面分配并逐页锁页
        vmalloc_area = vmalloc(MAPLEN);
        if (!vmalloc_area)
                goto fail4;
        for (virt_addr = (unsigned long)vmalloc_area;
             virt_addr < (unsigned long)(&(vmalloc_area[MAPLEN / sizeof(int)]));
             virt_addr += PAGE_SIZE) {

                SetPageReserved(virt_to_page
                                (vaddr_to_kaddr((void *)virt_addr)));
        }

在mmap里面再次把vma锁住
int mapdrv_mmap(struct file *file, struct vm_area_struct *vma)
{
        。。。。

        /* do not want to have this area swapped out, lock it */
        vma->vm_flags |= VM_LOCKED;
        。。。。
        return 0;
}
对于用一page  锁了两次  不知道能不能说明问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP