名词解释:
1.PGD:Page.PUD:PageUpper.PMD:Page.PTE:PageTableEntry
测试程序:
本测试程序建立了一个场景,复印了一个显存映射文件的虚拟地址,一个全局变量寻地址,一个栈内变量的虚拟地址和一个在堆上动态分配变量的虚拟地址。接出来,我们使用qemu启动内核和,之后运行这个测试程序,看一下MMU是怎样从这几个地址的虚拟地址找到其化学地址的。
获取:
1)使用qemu启动系统
内核使用的是6.3,打开了选项,上述test.c早已编译好,放在了的/test/mm目录下。
2)运行测试程序
其中,显存映射文件变量的虚拟地址为,全局变量的虚拟地址为,栈内变量的虚拟地址为,堆内变量的虚拟地址为。
在64位操作系统中,无论是还是ARM64,都使用48bit的虚拟地址,同时都将虚拟显存地址空间分为内核地址空间和用户地址空间两个部份,内核地址空间的地址都已开头,用户地址空间以开头,所以上述几个虚拟地址都是用户空间的地址,属于a.out这个进程。
不仅a.out复印的信息以外,我们还可以通过maps来看一下a.out进程显存映射的基本情况:
从这个图中,可以看出a.out代码段,堆栈,全局变量,动态链接库等映射的虚拟地址空间的范围、比如,栈的虚拟地址范围为“-”,栈内变量的虚拟地址恰好在这个区间内,还有堆的虚拟范围为“03000”物理地址查询方法,堆内变量的虚拟地址也处于这个区间内。
3)获取
接出来我们使用qemu的dump-guest-功能将虚拟机中的显存dump下来,用于后续剖析a.out虚拟地址和化学地址的映射关系.我们在用qemu启动虚拟机的时侯,使用了-参数
这样的话,在qemu虚拟机里,可以使用ctrla+c步入qemu的控制台。

之后运行命令“dump-guest--pdump-file-name”,这样虚拟机的数学显存就被dump到指定文件里了。
4)从中获取信息
我们使用crash来对dump文件进行剖析,首先我们使用crash打开dump文件,同时,也须要将内核的elf文件作为参数。
步入crash命令行以后,首先使用vm命令看一下a.out显存使用的大致情况:
可以看出,与/proc/80/maps信息基本相同。据悉,我们还得到了更多的信息,例如a.out在内核中的地址是,pgd的地址是,我们使用crash命令来查看一下,瞧瞧信息是不是对的上。
接出来我们看下a.out里四个变量的信息:-addr:显存映射文件虚拟地址g-addr:全局变量虚拟地址stack-addr:栈内变量虚拟地址heap-addr:堆内变量虚拟地址
【文章福利】小编推荐自己的Linux内核技术交流群:【】整理了一些个人认为比较好的学习书籍、视频资料共享在群文件上面,有须要的可以自行添加哦!!!(含视频教程、电子书、实战项目及代码)
零声白金VIP体验卡(含基础构架/高性能储存//QT/音视频/Linux内核)课程:
1)首先我们使用vtop看一下-addr:的信息:
从里面信息可以看出所对应的数学地址是,我们之前听到过a.out的pgd的数学地址是,这么中的0x7f8就是虚拟地址所对应的PUD的地址在PGD中的偏斜量,也就是说+7f8这个地址上面,储存着PUD页表的化学地址,从上述信息来看,PUD的化学地址为,前面的0x67为该页面的页表属性。以上就是对“PGD:=>”这一行信息的剖析。
接出来“PUD:=>”,PUD的化学地址是,878为PMD的索引,所以,对这一行的剖析就是在+878这个地址显存放着PMD的地址,即,067位页面属性。“PMD:=>”也类似,PMD的化学地址是,4f8是PTE的索引,所以,对这一行的剖析就是在+4f8这个地址显存放着PTE的地址,即,067位页面属性。“PTE:=>”,这一行正式找到所处化学地址页面的基地址,也就是pagetable的基地址,即,前面的025是页面属性。

至此找到了它对应的数学地址,一般,最后12bit是虚拟地址在数学地址4k页面内的偏斜量,并且显存映射文件的地址,显存映射通过mmap将内核的页面映射到用户进程的页表中,是4k对齐,所以最后12bit为0.
我们还可以通过内核提供的pageowner功能来这个页面分配的过程。首先估算的PFN,即右移12bit,得到28ba,十补码为10426:
之后回到qemu虚拟机中,进行如下操作:
可以看见PFN位10426这个页面分配的过程。
2)接出来我们再看全局变量“g-addr:”,操作基本相同。
从上述信息可以看出,PGD的地址是,但是PUD的地址就储存在的第0个索引内,也就是+0,PUD的地址为。PUD的第0个索引内放着PMD的地址,为,PMD的+010储存着PTE的地址,PTE的+640的地址储存着所对应的数学地址的页面的基地址,再加上的12bit页内偏斜地址2f0,所以对应的数学地址是。通过pageowner查看分配过程:
3)接出来我们再看“stack-addr:”
从上述信息可以看出,PGD的地址是,但是PUD的地址就储存在的第7f8个索引内,也就是+7f8,PUD的地址为。PUD的第fc0个索引内放着PMD的地址,为,PMD的+0e8储存着PTE的地址,PTE的+470的地址储存着所对应的数学地址的页面的基地址,再加上的12bit页内偏斜地址f1c,所以对应的数学地址是。通过pageowner查看分配过程:
4)接出来我们看堆内的变量“heap-addr:”
从上述信息可以看出,PGD的地址是,但是PUD的地址就储存在的第0个索引内,也就是+0物理地址查询方法,PUD的地址为。PUD的第0个索引内放着PMD的地址,为,PMD的+040储存着PTE的地址,PTE的+910的地址储存着所对应的数学地址的页面的基地址,再加上的12bit页内偏斜地址6f0,所以对应的数学地址是。通过pageowner查看分配过程:
总的来讲,剖析vtop的复印信息须要了解,储存PGD,PUD,PMD,PTE的显存都是4k对齐,也就是最后12bit为0,vtop复印的信息一般就是页面基地址加上索引,4k对齐的页面在显存管理中,最后12bit会用于描述该页面的属性,如067,025等,对应这样的组合。
