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


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



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

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

状态:...保密...

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


顶部
21楼 发表于 2008-4-30 15:15 
了解 等接下来3天我研究完浩方 就开始研究这玩意  到时候向大家汇报



您对本贴的看法:鲜花[0] 臭蛋[0]
CU可用积分兑换Linux/Unix精品图书 |《Ubuntu标准教程》书评获奖名单公布 | 致电800-858-2903,了解DELL如何为你量身订制笔记本
duanius
风云使者



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

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

状态:...保密...

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


顶部
22楼 发表于 2008-5-4 22:16 
翻了翻这些概念  越看越乱  简单的总结下 等达人拍砖
先贴下ldd lkd ulk对这些概念的解释  虽然很短  但是我所能找到唯一相当算得的上绝对权威的声音了
ldd3 /ulk3对PG_locked PG_reserved的解释:
PG_locked:表示内存中的页面已经被锁住   /页面被锁定。例如I/O操作中涉及到的页
PG_reserved:禁止内存管理系统访问该页 / 页框留给内核代码或没有使用

lkd2 /ulk3对VM_locked VM_reserved的解释:
VM_locked:区域中的页面被锁定 /线性区中的页被锁定,且不能换出
VM_reserved:标志内存区域不能被换出,它也是在设备驱动程序进行映射时被设置 /线性区是特殊的(如它映射某个设备的I/O地址空间),因此它的页不能被交换出去

先看lock系列
VM_locked的意思相对简单  就是做了个mlock 确保用户空间的一块内存不被换出
PG_locked就有些麻烦 如同双巨头所言  被锁住不等于仅仅不被换出这么简单  功力有限 贴段老外的解释:
PG_locked is very different: it provides the caller with exclusive access
the page while its actual contents are being changed. It's also used as a
synchronisation point for adding to and removing from pagecache. It's
pretty much a pagecache concept rather than an MM concept.
-----------------
it means also that the page is under I/O (or uner some other operation that needs serialization like unmapping the page) which is quite a different concept from VM_LOCKED. a wait_on_page would deadlock on such a PG_locked page, while wait_on_page on a page of a mlocked vma doesn't normally deadlock.
貌似经常被人混用 而且哈工那篇论文为了锁页防止换出用的也是这个  但无奈说明这个的文章实在少 也搞不清官方对PG_locked的解释  反正我的大概理解就是不准换出 其他进程也不许碰

再看reserved系列
PG_reserved:顾名思义就是把页框设为保留  能被标上这个标记的内存块都比较特殊 比如代码段或者IO内存 被标上标记后最显著的特点就是完全不受MM管理 比如分配换页  所以不会存在被换出的可能  它也就是从不准换页的角度和lock系列很像  其实差的很远   不过自从2.6.15后这个标志就被取消了 所以也没研究的必要了
VM_reserved: PG_reserved被废掉后被广泛采用  和前者很像  也是做差不多的事情  但保守争议  比如说因为设定了该标志导致程序结束后页面释放不掉   或者其他方面的一些原因   引一段文字:
VM_RESERVED is a bit of a mystery, really and we've had some trouble over
the semantics of this vs PG_reserved. Presumably it's supposed to be like
PG_reserved, only for whole mmap regions. It may not work properly because
it gets damn little testing.
接下来的事情就比较狗血了 我也是没怎么仔细去研究 反正大概就是因为VM_RESERVED的一些问题  一个牛人重新定义了一个标志VM_UNPAGED去解决   但linus明显不喜欢这个主意  把人家写的踢掉自己又重定义了一个VM_PFNMAP 但他写的也有问题 为了摆平它 又引入了VM_INCOMPLETE@¥%@……
有兴趣的可以去看看http://lwn.net/Articles/161204/  
http://lwn.net/Articles/162860/   
反正对于这些争议多的  又是临时的东西我是不怎么敢去用   连PG_reserved这种教科书上必提的东西都能被废掉  其他的还是省省吧。。。 太乱了

所以说 reserved方法看来是都行不通了  估计就是locked方法   PG_locked是哈工用过的 应该也没问题吧  。。还要再想想   mlock或许也可以    在用户态先mlock然后内核态只要获取个物理地址就可以了?  不清楚   走走看吧。。。

ps  一个牛人说 ”PG_reserved exempts a page from normal refcounting“  啥叫refcounting。。。

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



您对本贴的看法:鲜花[0] 臭蛋[0]
CU可用积分兑换Linux/Unix精品图书 |《Ubuntu标准教程》书评获奖名单公布 | 致电800-858-2903,了解DELL如何为你量身订制笔记本
ciitc2008
禁止访问-侠客




UID:700883
注册:2008-5-5
最后登录: 2008-05-05
帖子:13
精华:0

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

状态:...离线...

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


顶部
23楼 发表于 2008-5-5 12:37 
好多IT技术资料,建议大家可以去看看:

*** 作者被禁止或删除 内容自动屏蔽 ***
motalelf
风云使者



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

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

状态:...离线...

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


顶部
24楼 发表于 2008-5-6 23:53 


QUOTE:
啥叫refcounting。。。

应该就是page的引用计数。

所谓页交换,只会交换LRU链中的page。
而LRU中的page概括分起来,大致两种,有名(既存在唯一的inode,index来标识这个page)和匿名(不存在唯一的inode,index)。
而匿名页中,或迟或早都将变成有名页,kswapd会给这些匿名页分配一个标识(代表swap设备的inode,代表swap设备中的一个index)。

所以页交换的过程,可以近似认为,只可能释放有名页。

(也存在释放匿名页的特殊情况,前提是这个匿名页非脏。造成非脏匿名页,大致原因三种:
1)进程的堆,栈,BSS段中,存在分配了却未曾写过的空间。既本来就是匿名页,而且从未被写;
2)page是有名页,属于某个文件。在mmap的过程中,这个文件被并发的truncate;
3)page是有名页,属于某个文件。但这个文件所在的文件系统卷,未经umount,直接被拔出U/软盘
不过页交换的过程中,只是不得已才处理这三种情况,和页交换的实现思路无关。应该可以认为,页交换只处理有名页。)


有名页的引用,大致可分三部分:
1)作为有名页,其存在一个固有的引用,既必然count>=1。只有再变匿名的时候,才--这个固有引用
2)各进程0~3G间,pgd->pmd->pte这套东西对这个page的引用。
3)其他地方对page的引用。比如sys_read,sys_write都在page->count的++与--之间进行;kupdate再回写文件的内容时,也是在page->count的++与--之间回写page的内容。

所以页交换的过程,归根结底,是将page从有名=>匿名的过程。一旦匿名,就可以减少固有引用,既page->count--。如果再无其他引用,则page -> count == 0,可以释放至buddy。

要想阻碍有名页被换出,要么即使在变匿名后,page仍然count>0;要么page上有特殊的标志。总结起来,三种可行的方法:

1)人为的page->count++,既保证page即使在变匿名后,仍然count>0,则kernel不会考虑交换出去这个页。

2)kswapd会轮询各mm_struct中,0~3G的vm_area,并解除pgd->pmd->pte对page的引用,然后page->count--。那只要在vm_struct中,记一个vm_lock,或其他类似的标志,然后令kswapd遇到这样的标志后,直接忽略本vm_struct,不解除这个vm_area内,各pgd->pmd->pte对page的引用,则pgd->pmd->pte永远保持对page的引用,由此,page即使变匿名,仍然count>0,则kernel不可能交换这个page。

3)在page中,记一个标志,另kernel在扫描LRU,进行页交换时,遇到有这个标志的page,则直接忽略。这个标志就是PG_Lock。





总结起来,PG_Lock是一种阻止page被交换出去的方法,但并不是唯一的方法。而且,阻止page被换出,远不能涵盖PG_Lock的含义。

我个人觉得,再很大程度上,PG_Lock的含义,与pagecache_lock等价。只不过一个可以睡眠,一个不可以睡眠。
PG_Lock,保证了page决不会被变匿名,不管是kswapd还是truncate。而pagecache_lock也起这个作用。只有在同时持有pagecache_lock和PG_Lock时,才有权力将page变匿名。
类似的还有inode中,icache_lock和I_Locked。只有在同时持有icache_lock和I_Free时,才能将inode释放到slab,而I_Free的含义,就是再也不能将inode记I_Locked。

而PG_Reserved,除了几个非常特殊的地方之外,绝大部分都是在start_kernel时产生,完事后,初始化buddy,只将未被记PG_Reserved的page,释放到buddy中。所以PG_Reserved的含义,估计是指本page不属于buddy的管理范畴。



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

__________________________________

三个代表,吾党所宗。
以杜八耻,以进八荣。
咨尔多士,为民先锋。
夙夜匪懈,和谐是从。
   
CU可用积分兑换Linux/Unix精品图书 |《Ubuntu标准教程》书评获奖名单公布 | 致电800-858-2903,了解DELL如何为你量身订制笔记本
duanius
风云使者



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

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

状态:...保密...

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


顶部
25楼 发表于 2008-5-7 10:19 
感谢牛人这么详尽的回答 虽然开始有些云里雾里  但后来也有些醍醐灌顶的感觉
我想你的意思是不是这样  只有有名页会被swapout 而这些有名页不会被swapout的条件就是假设它变成了匿名页  count仍然大于0  所以如果不想被换出  就人为的atomic_inc(&page->count); 这样使得这个有名页即使变成匿名页count也大于0 所以当它是有名页的时候 也不会被换出

很多地方还是没彻底理解
我理解有名页就是只有一个进程之类的在访问它   匿名也就是有多个或零个访问 也就是mm只交换出一个进程访问的页(不清楚是不是用进程来表示这个概念)
还有能否稍微解释下pagecache_lock或者pagecache的具体概念  ulk上查不到 google上也没什么解释



您对本贴的看法:鲜花[0] 臭蛋[0]
CU可用积分兑换Linux/Unix精品图书 |《Ubuntu标准教程》书评获奖名单公布 | 致电800-858-2903,了解DELL如何为你量身订制笔记本
motalelf
风云使者



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

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

状态:...离线...

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


顶部
26楼 发表于 2008-5-7 12:51 


QUOTE:
原帖由 duanius 于 2008-5-7 10:19 发表
我想你的意思是不是这样  只有有名页会被swapout 而这些有名页不会被swapout的条件就是假设它变成了匿名页  count仍然大于0  所以如果不想被换出  就人为的atomic_inc(&page->count); 这样使得这个有名页即使变成匿名页count也大于0 所以当它是有名页的时候 也不会被换出

是这样。
有可能0~3G间的pte暂时不再影射到这个page,既解除了pte对page的引用,但只要还有富余的count,就绝对不会被kswapd换出。

QUOTE:
我理解有名页就是只有一个进程之类的在访问它   匿名也就是有多个或零个访问 也就是mm只交换出一个进程访问的页(不清楚是不是用进程来表示这个概念)

有名页是我瞎遍的,不清楚应该叫什么;匿名页在kernel的注释中,一律称呼为anonymous page;

非anonymous的page,就是说这个内存中的4k,对应着某文件的某个4K,既可以用唯一的( inode,index)来标识这个page。
anonymous page相反,不对应任何文件,所以也无法用唯一的( inode,index)来标识。



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

__________________________________

三个代表,吾党所宗。
以杜八耻,以进八荣。
咨尔多士,为民先锋。
夙夜匪懈,和谐是从。
   
CU可用积分兑换Linux/Unix精品图书 |《Ubuntu标准教程》书评获奖名单公布 | 致电800-858-2903,了解DELL如何为你量身订制笔记本
zx_wing   帅哥 (骑着猪的青蛙)
大天使
学徒



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

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

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

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


顶部
27楼 发表于 2008-5-7 13:05 


QUOTE:
原帖由 motalelf 于 2008-5-7 12:51 发表


是这样。
有可能0~3G间的pte暂时不再影射到这个page,既解除了pte对page的引用,但只要还有富余的count,就绝对不会被kswapd换出。



有名页是我瞎遍的,不清楚应该叫什么;匿名页在kernel的注释中, ...

在内核中分配的页到底会不会swap出去?
内核用的页面在3G以上,既然不会被kswapd扫描到,就不应该被swap出去啊,那为什么又有要把页面lock住的的需求呢?



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

__________________________________


C调 ---- C语言
都是最喜欢的
CU可用积分兑换Linux/Unix精品图书 |《Ubuntu标准教程》书评获奖名单公布 | 致电800-858-2903,了解DELL如何为你量身订制笔记本
duanius
风云使者



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

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

状态:...保密...

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


顶部
28楼 发表于 2008-5-7 14:53 
我现在关心到底什么样的页有被swap出去的可能  以前好像从来没考虑过这个问题。。。
根据“怪叔叔”同志在本帖以及http://linux.chinaunix.net/bbs/thread-1000527-1-1.html中的回复
貌似是非内核中分配(至少是非alloc_page分配   那get_free_page应该也算。。。)且引用记数在解除引用时不大于0的非匿名页有被换出的可能



您对本贴的看法:鲜花[0] 臭蛋[0]
CU可用积分兑换Linux/Unix精品图书 |《Ubuntu标准教程》书评获奖名单公布 | 致电800-858-2903,了解DELL如何为你量身订制笔记本
duanius
风云使者



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

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

状态:...保密...

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


顶部
29楼 发表于 2008-5-7 14:56 


QUOTE:
原帖由 zx_wing 于 2008-5-7 13:05 发表

在内核中分配的页到底会不会swap出去?
内核用的页面在3G以上,既然不会被kswapd扫描到,就不应该被swap出去啊,那为什么又有要把页面lock住的的需求呢?

我也超级纳闷这个   还是他们觉得不锁下就不保险

虽然这贴已经走题   但还是想继续走题下去 把这个问题搞明白点



您对本贴的看法:鲜花[0] 臭蛋[0]
CU可用积分兑换Linux/Unix精品图书 |《Ubuntu标准教程》书评获奖名单公布 | 致电800-858-2903,了解DELL如何为你量身订制笔记本
motalelf
风云使者



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

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

状态:...离线...

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


顶部
30楼 发表于 2008-5-7 16:20 
kswapd有两个作用:
1)遍历各mm_struct的0~3G,解除pte对page的引用,从而使page->count降至尽可能的低,为swapout创造条件。

2)遍历LRU中的page,找出( 匿名后count==0) && ( 非脏) 的page,真正的释放这个page至buddy。



page是否影射到0~3G,与page是否在LRU,是两件无关的事情。

在sys_read/write时,只是将page添加至pagecache和LRU链,然后就进行读写。所以即使page仅被影射到3G~4G,也依然完全可能位于LRU中。

在sys_mmap2时,除了将page添加至pagecache和LRU链外,还在缺页时,将其影射至0~3G。这时候就需要先扫描0~3G,先解除pte对page的引用,才有可能释放至buddy。

kswapd的作用2),无视page被影射到那里,只要在LRU中,就判断是否能释放至buddy。



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

__________________________________

三个代表,吾党所宗。
以杜八耻,以进八荣。
咨尔多士,为民先锋。
夙夜匪懈,和谐是从。
   
CU可用积分兑换Linux/Unix精品图书 |《Ubuntu标准教程》书评获奖名单公布 | 致电800-858-2903,了解DELL如何为你量身订制笔记本

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

 


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

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

京ICP证041476号


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

Processed in 0.072317 second(s), 9 queries , Gzip enabled