我试图破译如何使用/ proc/pid/pagemap来获取给定页面集的物理地址.假设从/ proc/pid/maps,我得到对应堆的虚拟地址afa2d000-afa42000.我的问题是如何使用此信息遍历页面映射文件,并找到对应于地址afa2d000-afa42000的物理页面框架.
/ proc/pid/pagemap条目采用二进制格式.有没有工具可以帮助解析这个文件?
具有4级页表的虚拟内存映射:
0000000000000000 - 00007fffffffffff (=47 bits) user space, different per mm
ffff800000000000 - ffff80ffffffffff (=40 bits) guard hole
ffff880000000000 - ffffc7ffffffffff (=64 TB) direct mapping of all phys. memory
ffffc80000000000 - ffffc8ffffffffff (=40 bits) hole
ffffc90000000000 - ffffe8ffffffffff (=45 bits) vmalloc/ioremap space
ffffe90000000000 - ffffe9ffffffffff (=40 bits) hole
ffffea0000000000 - ffffeaffffffffff (=40 bits) virtual memory map (1TB)
ffffffff80000000 - ffffffffa0000000 (=512 MB) kernel text mapping, from phys 0
ffffffffa0000000 - fffffffffff00000 (=1536 MB) module mapping space
Run Code Online (Sandbox Code Playgroud)
我知道内核尝试直接将物理地址映射到从PAGE_OFFSET直接映射区域开始的虚拟地址
ffff880000000000 …Run Code Online (Sandbox Code Playgroud)