我正在做一个需要翻译的项目qemu-guest
物理地址到主机虚拟/物理地址。
我正在使用 VMI(虚拟机自省)来自省 qemu 进程(KVM VM)并读取存储在 virtio 环缓冲区描述符中的来宾物理地址。因此,我正在寻找一种简单的方法来将 qemu 物理地址转换为主机端的主机虚拟地址。 (即,从 qemu 进程中提取尽可能少的信息)。
我在网上看到,在以前的版本中,qemu将物理RAM基数存储在变量中phys_ram_base
,这样就可以得到主机虚拟地址:
host_virtual = phys_ram_base + guest_physical_address
在较新版本的 qemu 中是否可能出现类似情况(例如,我如何获得 qemu 物理基地址 - 前者phys_ram_base
?)
我必须解决同样的问题:将客户虚拟地址转换为主机物理地址。我的方法如下:
步骤1(本机):虚拟地址到物理地址
- 我写了一个程序
vaddr2paddr
它采用进程 ID (PID) 和虚拟地址,然后返回关联的物理地址。
- 该程序使用
/proc/<pid>/pagemap
确定程序的物理地址
- 我从博客文章中导出了代码将虚拟地址转换为用户空间中的物理地址 https://shanetully.com/2014/12/translating-virtual-addresses-to-physcial-addresses-in-user-space/和dwks/页面地图 https://github.com/dwks/pagemap tool.
- 我在我的本机主机上使用一个简单的测试程序彻底测试了这个脚本,该程序分配一个缓冲区并打印虚拟地址,然后等待输入,同时我运行我的
vaddr2paddr
脚本,然后使用检查devmem2
工具(或与xxd
in /dev/mem
通过加载devmem-完全访问 https://github.com/ozgunawesome/devmem-full-access内核模块)我之前写入的数据是否确实存在
步骤 2 (VM):客户虚拟地址到主机物理地址
- 我运行相同的测试程序,在我的虚拟机中分配缓冲区并向其中写入一些数据
- 我执行
vaddr2paddr
与分配的缓冲区的来宾虚拟地址一起获取来宾物理地址(gpa
)
- On the native host, I determine the largest memory region of the qemu process by parsing
/dev/<pid>/maps
which shows the allocated virtual memory regions of a process. In my case, the VM had 2 GB of memory and I found an area that was roughly 2 GB (all others were significantly smaller). I then take the start address of that area (vm_start_address
)
- 为此,我编写了一个简单的 Python 脚本,但网络上也有现有代码,例如,ouadev/proc_maps_parser https://github.com/ouadev/proc_maps_parser
- 现在我们可以通过以下方式计算分配的缓冲区的主机物理地址:
hpa = vm_start_address + gpa
- 再次,我验证使用
devmem2
工具写入的数据是否是计算出来的hpa
注意:此方法需要sudo
访问/proc/<pid>/pagemap
并且/proc/<pid>/maps
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)