pagemap的解读
(2013-10-18 14:53:22)
标签:
pagemap原理解读procmapsit |
分类: Android技术 |
pagemap是linux中一组新的接口集合,他通过读取/proc中的文件允许用户态的程序检查页表以及相关的信息。
如果这个page是在swap状态,然后PFN包含一个编码的交换文件号码,再将页的offset值写入swap中。没有映射的页就返回一个null
PFN。这样就可以精确判断一个page是映射的或是swap的,并且可以比较不同进程间的映射页。
我们可以利用/proc/pid/maps去判断内存中哪块区域是被映射的,然后通过llseek就可以跳过没有映射的区域。
它主要有3个组成部分:
(1)/proc/pid/pagemap:这个文件允许一个用户态的进程查看到每个虚拟页映射到的物理页,每一个虚拟页都包含了一个64位的值,信息如下:
Bits 0-54: page frame number(PFN) if present
Bits 0-4: swap type if swapped
Bits 5-54: swap offset if swapped
Bits 55-60:page shift
Bit 61: reserved ofr future use
Bit 62: page swapped
Bit 63: page present
(2)/proc/kpagecount:这个文件包含一个64位值,该值表示每个page被映射的次数,通过PFN索引。
(3)/proc/kpageflags:这个文件包含每一个page的64位的标记集,通过PFN索引。
通过pagemap查看一个进程的内存使用情况的一般步骤如下:
(1)读取/proc/pid/maps文件确定内存空间的哪个部分被映射;
(2)选择你感兴趣的maps,比如全部、一部分或者堆栈什么的;
(3)打开/proc/pid/pagemap,定位到你准备去检查的pages;
(4)通过pagemap读取每一个page的64位值;
(5)打开/proc/kpagecount以及/proc/kpageflags。对于每一个PFN你只要去读,定位到文件中的那个入口,然后读取你想要的数据。