Qemu-KVM:将访客物理地址转换为主机虚拟/主机物理地址

2024-02-14

我正在做一个需要翻译的项目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(使用前将#替换为@)

Qemu-KVM:将访客物理地址转换为主机虚拟/主机物理地址 的相关文章

随机推荐

  • 如何将嵌入式 Youtube 播放器静音?

    我正在尝试 Youtube 播放器 但我无法让它默认静音 function onPlayerReady player playVideo Mute player mute player setVolume 0 如何从一开始就将其静音 Fid
  • 模拟类方法中的函数

    我想在 Django 项目中测试类方法时模拟在类方法中调用的函数 考虑以下结构 应用程序 utils py def func return resp outcome is a HTTPResponse object 应用程序 模型 py f
  • 如何让 BindingSource 知道其 DataSource 的变化?

    我有一个 someBindingSource DataSource someDataSource 我也这样做 someDataSource foo foo does new对于具有不同数据的另一个数据源 我认为每次数据源更改时都进行分配是不
  • 中断等待用户输入的线程,然后退出应用程序

    我有两个线程正在运行 userInputThread等待用户从命令行输入并interrupterThread试图打断userInputThread启动后1秒 显然你不能中断被阻塞的线程System in 另一个答案建议关闭System in
  • 将 Git Repo 转换为 Darcs

    我想将 git 存储库移至 darcs 我无法找到解释如何执行此操作的文档或项目 看起来大多数用户都想走另一条路 此外 能够从 darcs 控制 git repo 会很酷 git fast export http git scm com d
  • 在两个类之间共享变量

    我在 1 个项目中有两个不同的 cs 窗口 每个人都运行我程序的不同部分 但现在我需要在Form cs中使用mainwindow cs的变量 i 这个变量一直在变化 我该怎么做 主窗口 CS namespace samples using
  • Apache 反向代理 Unix 套接字

    我正在尝试使用 unix 套接字在 Apache 2 4 7 中设置 ProxyPass 到 puma 服务器的 Rails 应用程序 我不断收到 500 内部错误 当我检查 apache 日志时 我收到以下消息 没有协议处理程序对 URL
  • Zend 框架:headTitle()->append() 问题

    有谁遇到这个问题吗 在我的layout phtml 中我有 然后在index phtml中我有 我希望 当我转到索引操作时 标题应该是 控制应用程序 客户端列表 但我有 客户端列表控制应用程序 到底是怎么回事 我怎样才能解决这个问题 hea
  • 如何更改 appengine 应用程序的所有者(将其移动/出售给新公司)

    我开发了一个 AppEngine 应用程序 并将其转移到另一家公司 并且我想在转移到另一家公司完成后从该应用程序中删除我自己的个人访问权限 我转移所有权的第一步是邀请其他人作为具有 所有者 角色的管理员 但是 转移后 在管理 权限控制台中我
  • @RestController 和 @RequestMapping 注解所采用的参数之间的区别?

    里面的参数是什么意思 RestController path 做 它不设置基本路径吗 RequestMapping path 有什么不同 RestController base path 取自Spring文档 https docs spri
  • 如何使用VSCode集成终端进行调试?

    当我在 VS code 上调试时 它会打印到 gnome 终端 有时这使得很难同时跟踪代码和终端 是否可以打印到集成终端而不是外部终端 要告诉 VS Code 使用集成终端进行调试 您必须在启动配置中指定它 vscode launch js
  • 为什么 uint64_t 无法正确显示 pow(2, 64) - 1 ?

    我试图理解为什么uint64 t类型无法显示pow 2 64 1适当地 cplusplus标准是199711L 我检查了pow C 98 标准下的函数是 double pow double base double exponent floa
  • “调用 0x80482f0 ”?只需要澄清 x86 程序集中“hello world”程序中的一行代码

    call 0x80482f0
  • Flutter - 是否可以在不使用 FutureBuilder 的情况下从 Future 中提取数据?

    我正在读取用户提供的输入 在本例中为邮政编码 TextField我需要检查数据库的有效性 但是 我需要在提交按钮 aRaisedButton在这种情况下 onPressed 拉姆达函数 在大多数编程语言中 这是一项相当简单的任务 然而 我在
  • 快速文件上传到 Google Drive API

    我可以成功地将上传的图像保存在公共上传文件夹中并集成 google Drive api 但它似乎正在上传一个空文件 我应该从 req files 数据中将什么内容放入 Google Drive API 的 body 参数中 name cou
  • 如何在注入代码中使用GM_xmlhttpRequest?

    我正在编写一个注入网页的用户脚本 该脚本从网络服务器读取一些数据 我想将消息发送到侦听应用程序以对数据做出反应 现在 我所做的就是尝试向我的监听应用程序发送一个字符串命令 看看我是否可以读取它 我的代码在注入之前可以工作 但之后我收到 未定
  • 记住一个函数,以便当我在 Python 中重新运行该文件时它不会被重置

    我经常在 Python 中进行交互式工作 其中涉及一些我不想经常重复的昂贵操作 我通常运行我经常处理的任何 Python 文件 如果我写 import functools32 functools32 lru cache def square
  • EJB3 + JEE6:什么是持久计时器?

    我即将使用新的 EJB3 TimerService 作为 Java EE 6 的一部分 并且像往常一样 JavaDoc 的简洁性给我留下了深刻的印象 你知道它的作用是什么吗persistent的财产TimerConfig object Ja
  • 获取 Emacs Lisp 中的 VC 根

    在 Emacs Lisp 函数中 我想知道任意文件夹的 VC 根目录 如果在源代码控制下 就像 vc print root log 那样 我试图从 VC 文件 文件夹外部执行此操作 尽管创建一个临时缓冲区来执行此操作就可以了 我目前通过 m
  • Qemu-KVM:将访客物理地址转换为主机虚拟/主机物理地址

    我正在做一个需要翻译的项目qemu guest物理地址到主机虚拟 物理地址 我正在使用 VMI 虚拟机自省 来自省 qemu 进程 KVM VM 并读取存储在 virtio 环缓冲区描述符中的来宾物理地址 因此 我正在寻找一种简单的方法来将