x86 平台中的 KVM 影子页表处理

2024-04-29

据我了解,在没有硬件支持来宾虚拟到主机物理地址转换的处理器上,KVM 使用影子页表。

当来宾操作系统修改其页表时,会构建和更新影子页表。硬件中有没有专门的指令(以x86为参考)来修改页表?除非有特殊说明,否则不会对VMM 造成陷阱。 Linux内核在软件中维护的页表不就是另一种数据结构吗?为什么需要特殊说明来更新它?

Thanks!


我使用 KVM 之外的另一个 VMM,所以我不知道 KVM 的详细信息,但所有 VMM 的原理都是相同的。它的工作方式是有两组页表。

除了用于页表基地址的特殊寄存器[以及其他寄存器中与一般配置处理器有关的一些随机位,但这通常是“一次性”设置]之外,没有特殊的指令来管理页表。页表只是用常规指令写入的内存位 - 如果您确实想要的话,您可以进行加法、减法和/或乘法等操作[除非您绝对知道自己在做什么,否则它很可能会导致问题! ],但典型的操作是“mov”(存储)或“xchg”(交换)操作。

第一个页表是操作系统实际写入的页表。 VMM 将其设置为只读内存,因此每当对其进行写入时,处理器都会出现页面错误。由于 KVM 在处理器中使用硬件虚拟化扩展(AMD 处理器上的 SVM 或 Intel 处理器上的 VMX),因此页面错误由 VMM(本例中为 KVM)捕获,其中检查写入操作以查看它是否是“页面” -table write”,如果是这样,它会被转换为第二个影子页表 - 这就是 VMM 让 VM 相信内存从 0 开始并达到 1GB 的方式,但实际上我们已经获取了一堆页面将 1GB 内存拼凑在一起,看起来就像是一组平坦、连续的页面。当然,由于 VMM 对 VM 内的操作系统“撒谎”,我们不能让操作系统写入它的真实页表,因为它不知道写入其中的“真实”页表值。 [但是我们确实还需要让操作系统拥有自己的页表,以防它从页表中读取数据,并且当它不是操作系统实际期望的内容时完全感到困惑]。

处理器“真实 CR3”由 VMM 设置,并指向影子页表。

VMM 将捕获 CR3(页表基地址)写入,以便它可以跟踪页表所在的位置(并跟踪要使用哪个“真正的 CR3”)。然而,VMM 不需要知道 CR3 的读取,因此通常允许它们直接在 VM 中发生而不拦截它。

处理器中 VMM 扩展的全部意义在于支持这种特殊指令的拦截,同时仍然将 VM 中的大多数特权指令作为“常规”指令运行 - 例如,您不会想要跳入VMM 每次写入标志寄存器以启用/禁用中断等 - 让这发生在 VM 中,就好像它是一个真正的硬件一样。但有些寄存器是 VMM 可以控制的关键寄存器。

显然,当页表有硬件支持时,就会有两层页表。一个将“0-1GB”翻译为“分散在各处”,另一个是操作系统维护的实际页表。在这种情况下,无需拦截任何页表写入、页错误或任何 CR3 更新 - 操作系统可以在底层页表映射的允许内存部分内执行其喜欢的操作,如果 VM 超出允许的部分,VMM 会将其捕获为“VMM 页表错误”。这当然会让整个事情变得更有效率。

我希望这是有道理的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

x86 平台中的 KVM 影子页表处理 的相关文章

  • touch命令在一个目录下创建多个文件(不同名称)

    我想制作一个在 bash 中创建目录和文件结构的脚本 我尝试过这样的事情 mkdir p 1 2 touch 1 2 a b c a b c 应该是在一个命令或其他命令中创建的文件 但由于某种原因 结构是这样的 current folder
  • 如何用X11复制到剪贴板?

    使用 OS X 上的框架 我可以使用以下命令将 PNG 复制到粘贴板 在 C 中 显然我可以将 NSPasteboard 与 Cocoa 一起使用 include
  • 构建 makefile 依赖/继承树

    如果我解释得不好或者问了一些明显的问题 我很抱歉 但我是 Linux 内核的新手 而且有点深入 我们有一个嵌入式 Linux 系统 它附带一个 文档非常糟糕的 SDK 其中包含数百个文件夹stuff 大多数文件夹包含rules make m
  • 在 LINUX 上使用 Python 连接到 OLAP 多维数据集

    我知道如何在 Windows 上使用 Python 连接到 MS OLAP 多维数据集 嗯 至少有一种方法 通常我使用 win32py 包并调用 COM 对象进行连接 import win32com client connection wi
  • Linux 中热插拔设备时检测设备是否存在

    我正在运行 SPIcode http lxr free electrons com source drivers spi spi omap2 mcspi c在熊猫板上 我想知道其中的哪个功能code http lxr free electr
  • Inotify linux 监视子目录

    是否可以以这种模式监视目录 storage data usernames Download gt storage data Download 我需要监视每个用户的下载文件夹中是否进行了更改 也许我需要创建所有路径的列表 将其放入数组中 并在
  • 动态更改 eBPF 映射大小

    在内核中 eBPF 映射可以定义为 struct bpf map def SEC maps my map type BPF MAP TYPE HASH key size sizeof uint32 t value size sizeof s
  • 按字节数对向量进行混洗

    有什么办法可以左移 v 0 gt v 1 a m128i by n字节 其中n仅在运行时才知道 我目前仅限于 AVX1 但如果 AVX2 512 使这变得更容易 我非常感兴趣 I found mm bslli si128 m128i imm
  • Linux shell 脚本:十六进制数字到二进制字符串

    我正在 shell 脚本中寻找一些简单的方法来将十六进制数字转换为 0 和 1 字符的序列 Example 5F gt 01011111 是否有任何命令或简单的方法来完成它 或者我应该为其编写一些开关 echo ibase 16 obase
  • linux x86 汇编语言 sys_read 调用的第一个参数应为 0 (stdin)

    我正在编写一个简单的汇编程序来从标准输入读取 如 scanf 这是我的代码 section bss num resb 5 section txt global start start mov eax 3 sys read mov ebx 0
  • Bash 方法的返回值总是模 256

    我有一个 bash 脚本方法 它返回输入值 然而 返回值始终是模 256 的值 我用 google 搜索了一段时间 发现this http www tldp org LDP abs html exitcodes html文章说它总是以 25
  • C 程序从连接到系统的 USB 设备读取数据

    我正在尝试从连接到系统 USB 端口的 USB 设备 例如随身碟 获取数据 在这里 我可以打开设备文件并读取一些随机原始数据 但我想获取像 minicom teraterm 这样的数据 请让我知道我可以使用哪些方法和库来成功完成此操作以及如
  • 如何在特定 systemd 服务重新启动时触发自定义脚本运行

    我想知道如何安排自定义脚本在重新启动服务时运行 我的用例是 每当重新启动 Tomcat 服务时 我都必须运行多个命令 我想知道是否有一种方法可以编写脚本并安排它在重新启动 Tomcat 服务时运行 我已将 tomcat 脚本设置为 syst
  • 同步 I/O 是否会使线程繁忙?

    假设我正在同步 I O 套接字上执行 I O 该套接字已准备好read or write手术 这意味着调用线程不会在操作上被阻塞 无论非阻塞 SOCK NONBLOCK 套接字的阻塞性质 但以下事情我不清楚 实际转移何时发生 当套接字标记为
  • 没有可用的符号表信息

    我正在测试第三方的库 它崩溃了 当我想查看崩溃的原因时 我的 gdb 告诉我没有可用的调试符号 Program received signal SIGSEGV Segmentation fault Switching to Thread 0
  • SONAR - 使用 Cobertura 测量代码覆盖率

    我正在使用声纳来测量代码质量 我不知道的一件事是使用 Cobertura 测量代码覆盖率的步骤 我按照以下步骤操作http cobertura sourceforge net anttaskreference html http cober
  • 信号处理程序有单独的堆栈吗?

    信号处理程序是否有单独的堆栈 就像每个线程都有单独的堆栈一样 这是在 Linux C 环境中 来自 Linux 手册页signal 7 http kernel org doc man pages online pages man7 sign
  • PHP 致命错误:未找到“MongoClient”类

    我有一个使用 Apache 的网站 代码如下 当我尝试访问它时 我在 error log 中收到错误 PHP Fatal Error Class MongoClient not found 以下是可能错误的设置 但我认为没有错误 php i
  • 如何制作和应用SVN补丁?

    我想制作一个SVN类型的补丁文件httpd conf这样我就可以轻松地将其应用到其他主机上 If I do cd root diff Naur etc httpd conf httpd conf original etc httpd con
  • 是否可以在VM内使用VMX CPU指令?

    VM guest 内部的进程是否有可能使用 VMX AMD V VT x CPU 指令 然后由外部 VMM 处理而不是直接在 CPU 上处理 Edit 假设外部VM使用VMX本身来管理其虚拟客户机 即它在Ring 1中运行 如果可能的话 是

随机推荐