免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2492 | 回复: 5
打印 上一主题 下一主题

[内存管理] address_space page inode 的疑惑 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-02-20 03:54 |只看该作者 |倒序浏览
1.对于page中 (address_space) 成员mapping, if low bit clear, points to inode address_space, or NULL. If page mapped as anonymous memory, low bit is set, and it points to anon_vma object.
意思是第0位为1,mapping就指向 anon_vma。但是mapping是一个指针,他的值是一个地址,怎么保证这一点?

2.  mm.h中的一段代码
  1. static inline struct address_space *page_mapping(struct page *page)
  2. {
  3.         struct address_space *mapping = page->mapping;

  4.         VM_BUG_ON(PageSlab(page));
  5.         if (unlikely(PageSwapCache(page)))
  6.                 mapping = &swapper_space;
  7.         else if ((unsigned long)mapping & PAGE_MAPPING_ANON)
  8.                 mapping = NULL;
  9.         return mapping;
  10. }
复制代码
可以看到page中的mapping 要么指向 swapper_space, 要么是NULL, 要么是address_space.

我想做的是对于一个page结构,找到他是属于哪个inode的。所以我在ksm中加入了一些代码。
page中的mapping 指向 address_space, address_space有个host指针指向inode. 我是按照这个思路来的。
对于page中的mapping 我也做了如上两种判断。
if (unlikely(PageSwapCache(page)))
...printk...
else if ((unsigned long)page->mapping & PAGE_MAPPING_ANON)
...printk...
else
...通过page->mapping->host得到inode...

从输出结果来看,大部分page都是属于第二个分支里的。第一个分支也有。
就是没有一个能到达最后一个分支的。

原来以为address_space 中的flags 或者page里的flags会有标记他们是否属于某个inode的。检查了一下貌似没有。

请问该怎么解决。谢谢!!!
或者怎么样从page获得其所属的inode。

论坛徽章:
0
2 [报告]
发表于 2013-02-20 10:08 |只看该作者
include/linux/mm.h

int page_to_nid(struct page *page)

其他的细节参见同一个头文件,上面关于NODE_NOT_IN_PAGE_FLAGS的判断的定义,以及page->flags的定义和分情况分段说明。


论坛徽章:
0
3 [报告]
发表于 2013-02-21 00:00 |只看该作者
回复 2# 灌水菜鸟


    谢谢你的帮助。 但是你说的那个node 不是我说的那个inode。~~~

论坛徽章:
0
4 [报告]
发表于 2013-02-22 13:06 |只看该作者
回复 1# xiongweixie


    使用page_mapping()是没错的,用得到file cache page 的inode,(page_mapping())->host 应该就ok了。
    没有走到后面的分支,应该是你所使用到page本身就是swap or anon mapping 的page,没有测到 file cache。KSM没有接触过,但document里面有这么一段话:
18 KSM only merges anonymous (private) pages, never pagecache (file) pages.
19 KSM's merged pages were originally locked into kernel memory, but can now
20 be swapped out just like other user pages (but sharing is broken when they
21 are swapped back in: ksmd must rediscover their identity and merge again).

     在ksm里面好像并没有考虑filecache page。如果对 file cache, anon mapping & swapcache page 中,mapping处理有疑问,可以写个简单到module去分别看下不同type的page mapping。

论坛徽章:
0
5 [报告]
发表于 2013-02-22 13:12 |只看该作者
回复 4# George_lz


    从最简单的理解,file cache page 和 swap page均有自己的后援设备,而anon则没有,因此,page为swap page时,mapping 为全局的 swapper_space, 而为普通的file cache时,则指向file inode的mapping,一样的anon不存在file,因此mapping为NULL

论坛徽章:
0
6 [报告]
发表于 2013-02-23 20:11 |只看该作者
本帖最后由 hwangmif 于 2013-02-24 08:03 编辑

问:意思是第0位为1,mapping就指向 anon_vma。但是mapping是一个指针,他的值是一个地址,怎么保证这一点?

答:anon_vma或者是address_space的地址是对齐4的,也就是说最后面的两位其实是没有用的。

回复 1# xiongweixie


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP