翻了翻这些概念 越看越乱 简单的总结下 等达人拍砖
先贴下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 编辑 ]