Linux.ChinaUnix.net
ChinaUnix | Linux首页 | 新闻 | 博客 | 文章 | 专栏 | 新手 | 方案 | 图书 | 下载 | 人才 | 手册 | wiki | 搜索     
Linux论坛
  会员: 密码: 免费注册 | 忘记密码 | 会员登录 | 搜索 | 帮助 


x86下dma映射以及页面锁页换页的问题
首页 » CU论坛 » Linux » 汇总贴列表 » 内核源码 »  
[打印] [订阅] [收藏] [推荐给朋友] [本帖文本页]
motalelf
风云使者



UID:384785
注册:2006-3-11
最后登录: 2008-06-22
帖子:431
精华:0

可用积分:202
信誉积分:105
专家积分:0 (本版)

状态:...离线...

[资料] [站内短信] [Blog]


顶部
31楼 发表于 2008-5-7 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)。



您对本贴的看法:鲜花[1] 臭蛋[0]

__________________________________

三个代表,吾党所宗。
以杜八耻,以进八荣。
咨尔多士,为民先锋。
夙夜匪懈,和谐是从。
   
CU可用积分兑换Linux/Unix精品图书 |《Ubuntu标准教程》书评获奖名单公布
duanius
风云使者



UID:471810
注册:2006-10-1
最后登录: 2008-07-05
帖子:407
精华:1

可用积分:363
信誉积分:100
专家积分:0 (本版)

状态:...保密...

[资料] [站内短信] [Blog]


顶部
32楼 发表于 2008-5-7 16:50 
谢谢楼上  仔细学习一下先



您对本贴的看法:鲜花[0] 臭蛋[0]
CU可用积分兑换Linux/Unix精品图书 |《Ubuntu标准教程》书评获奖名单公布
duanius
风云使者



UID:471810
注册:2006-10-1
最后登录: 2008-07-05
帖子:407
精华:1

可用积分:363
信誉积分:100
专家积分:0 (本版)

状态:...保密...

[资料] [站内短信] [Blog]


顶部
33楼 发表于 2008-5-7 17:03 
我想我明白了  对你的耐心万分感谢    不知道最近a版到哪里去了  不然看到这么精彩的回复恐怕要加个保留吧 (哈那我就有2个精华了 虽然都和我没啥关系  全靠cu论坛牛牛们的精彩回复 )



您对本贴的看法:鲜花[0] 臭蛋[0]
CU可用积分兑换Linux/Unix精品图书 |《Ubuntu标准教程》书评获奖名单公布
zhzhl555
侠客




UID:207093
注册:2004-12-12
最后登录: 2008-07-04
帖子:15
精华:0

可用积分:26
信誉积分:100
专家积分:0 (本版)

状态:...离线...

[资料] [站内短信] [Blog]


顶部
34楼 发表于 2008-5-7 18:06 
牛人的总结。 需要牢记。。



您对本贴的看法:鲜花[0] 臭蛋[0]
CU可用积分兑换Linux/Unix精品图书 |《Ubuntu标准教程》书评获奖名单公布
zx_wing   帅哥 (骑着猪的青蛙)
大天使
学徒



UID:499746
注册:2006-12-4
最后登录: 2008-07-05
帖子:1691
精华:3

可用积分:2342
信誉积分:100
专家积分:1 (本版)

来自:成都
状态:...保密...

[资料] [站内短信] [Blog]


顶部
35楼 发表于 2008-5-7 18:23 


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

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



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________


C调 ---- C语言
都是最喜欢的
CU可用积分兑换Linux/Unix精品图书 |《Ubuntu标准教程》书评获奖名单公布
duanius
风云使者



UID:471810
注册:2006-10-1
最后登录: 2008-07-05
帖子:407
精华:1

可用积分:363
信誉积分:100
专家积分:0 (本版)

状态:...保密...

[资料] [站内短信] [Blog]


顶部
36楼 发表于 2008-5-7 19:06 


QUOTE:
原帖由 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] 臭蛋[0]
CU可用积分兑换Linux/Unix精品图书 |《Ubuntu标准教程》书评获奖名单公布
zx_wing   帅哥 (骑着猪的青蛙)
大天使
学徒



UID:499746
注册:2006-12-4
最后登录: 2008-07-05
帖子:1691
精华:3

可用积分:2342
信誉积分:100
专家积分:1 (本版)

来自:成都
状态:...保密...

[资料] [站内短信] [Blog]


顶部
37楼 发表于 2008-5-7 19:35 


QUOTE:
原帖由 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] 臭蛋[0]

__________________________________


C调 ---- C语言
都是最喜欢的
CU可用积分兑换Linux/Unix精品图书 |《Ubuntu标准教程》书评获奖名单公布
duanius
风云使者



UID:471810
注册:2006-10-1
最后登录: 2008-07-05
帖子:407
精华:1

可用积分:363
信誉积分:100
专家积分:0 (本版)

状态:...保密...

[资料] [站内短信] [Blog]


顶部
38楼 发表于 2008-5-7 20:03 
所以说叫你不要谦虚了  你一小白  我就大白了。。。
我这里有个大白问题 :  原来刚才说的mmap不是映射内存阿。。  我以为字符驱动里分配一块内存映射出去就是映射内存了 (不会因为用户态用描述符打开这个字符设备所以就是文件映射了吧) 那啥叫映射内存阿



您对本贴的看法:鲜花[0] 臭蛋[0]
CU可用积分兑换Linux/Unix精品图书 |《Ubuntu标准教程》书评获奖名单公布
zx_wing   帅哥 (骑着猪的青蛙)
大天使
学徒



UID:499746
注册:2006-12-4
最后登录: 2008-07-05
帖子:1691
精华:3

可用积分:2342
信誉积分:100
专家积分:1 (本版)

来自:成都
状态:...保密...

[资料] [站内短信] [Blog]


顶部
39楼 发表于 2008-5-7 20:11 


QUOTE:
原帖由 duanius 于 2008-5-7 20:03 发表
所以说叫你不要谦虚了  你一小白  我就大白了。。。
我这里有个大白问题 :  原来刚才说的mmap不是映射内存阿。。  我以为字符驱动里分配一块内存映射出去就是映射内存了 (不会因为用户态用描述符打开这个字符 ...

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



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________


C调 ---- C语言
都是最喜欢的
CU可用积分兑换Linux/Unix精品图书 |《Ubuntu标准教程》书评获奖名单公布
duanius
风云使者



UID:471810
注册:2006-10-1
最后登录: 2008-07-05
帖子:407
精华:1

可用积分:363
信誉积分:100
专家积分:0 (本版)

状态:...保密...

[资料] [站内短信] [Blog]


顶部
40楼 发表于 2008-5-7 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  锁了两次  不知道能不能说明问题



您对本贴的看法:鲜花[0] 臭蛋[0]
CU可用积分兑换Linux/Unix精品图书 |《Ubuntu标准教程》书评获奖名单公布

首页 » CU论坛 » Linux » 汇总贴列表 » 内核源码 »

 


Copyright © 2001-2008 ChinaUnix.net All Rights Reserved     联系我们:

感谢所有关心和支持过ChinaUnix的朋友们    转载本站内容请注明原作者名及出处

京ICP证041476号


清除 Cookies - Linux时代 - Archiver - WAP - TOP

Processed in 0.045437 second(s), 5 queries , Gzip enabled