QEMU和KVM在虚拟机I/O中扮演什么角色?

2024-01-21

我发现 QEMU 和 KVM 之间的界限非常模糊。我发现有人说虚拟机是qemu进程,而另一些人说是kvm进程。究竟是什么? 而QEMU和KVM在虚拟机I/O中扮演什么角色呢?比如一个vm做PIO/MMIO的时候,是qemu还是kvm会把它困住,转成硬件操作。还是双方都有责任?


KVM:Linux 内核中的代码,为用户空间提供友好的接口以使用 CPU 虚拟化。这包括用户空间可以调用“创建 CPU”、“运行 CPU”等的函数。对于完整的虚拟机,您需要有一些可以使用它的用户空间代码。这通常是 QEMU,或者更简单的“kvmtool”;一些大型云提供商有自己的自定义用户空间代码。

QEMU:模拟虚拟硬件,包括磁盘、内存、CPU、串行端口、图形和其他设备。还提供用于执行启动、停止和迁移等操作的机制(UI 和一些可编程接口)。 QEMU 支持多种不同的“加速器”模式来处理 CPU 模拟:

  • TCG:纯仿真——在任何地方都可以工作,但速度很慢
  • KVM:使用 Linux 内核的 KVM API 来允许使用主机 CPU 硬件虚拟化支持运行来宾代码
  • hax:与KVM类似,但使用Intel HAXM代码,可在Windows主机上运行

从实现的角度来看,KVM 和 QEMU 之间的界限非常清晰——KVM 是主机内核的一部分,而 QEMU 是一个单独的用户空间程序。对于用户来说,您通常不必关心边界在哪里,因为这是一个实现细节。

回答有关 MMIO 发生情况的问题:

  • 访客进行 MMIO 访问
  • 这被硬件捕获到主机内核
  • 然后,主机内核 (KVM) 可能会模拟此 MMIO 访问本身,因为出于性能原因,在内核中实现了一些设备。这通常仅适用于中断控制器,也许还适用于 iommu。
  • 否则,KVM 将 MMIO 访问报告回用户空间(即 QEMU、kvmtool 等)
  • 然后,用户空间可以使用其设备模拟代码来处理访问
  • 然后用户空间将结果(例如返回读取的数据)返回给内核
  • 内核根据需要更新vcpu的寄存器状态以完成指令的模拟
  • 然后内核按照以下指令恢复 VM 的执行
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QEMU和KVM在虚拟机I/O中扮演什么角色? 的相关文章

  • Xvfb 冻结初始化 GLX 扩展

    我正在尝试运行无头 Xvfb 服务器来捕获 Amazon EC2 micro 上的屏幕截图 但它在 GLX 上陷入了困境 我使用此脚本安装了 GLX Xvfb 和所有库 https gist github com joekiller 414
  • Bash:检查是否给出了参数(例如是否有参数“-a”?)

    我有一个脚本 它应该接受 2 个参数 s 和 d 如果未给出 d 参数 我想删除我的调试文件 与 s 相同 如何检查 1 或 2 是否为 s 或 d 舒尔有两个参数 我可以做到 蛮力 if test 1 d test 2 d then rm
  • 如何告诉 mex 链接到 /usr/lib 中的 libstdc++.so.6 而不是 MATLAB 目录中的 libstdc++.so.6?

    现在 MATLAB 2012a 中的 mex 仅正式支持 gcc 4 4 6 但我想使用 gcc 4 7 风险自负 现在如果我直接用 mex 编译一些东西 它会抱怨 usr lib gcc i686 linux gnu 4 7 cc1plu
  • 将 qemu 监视器与 Android 模拟器一起使用

    我正在尝试使用 qemu 中的 pmemsave 命令从 Android 系统获取内存转储 但在访问 qemu 监视器界面时遇到一些问题 我使用以下命令启动模拟器 emulator avd test verbose qemu monitor
  • 如何在 Vim 中突出显示 Bash 脚本?

    我的 Vim 编辑器自动突出显示 PHP 文件 vim file php HTML 文件 vim file html 等等 但是当我输入 vim file在里面写一个Bash脚本 它不会突出显示它 我如何告诉 Vim 将其突出显示为 Bas
  • 如何通过 makefile 在 Linux 上安装程序? [复制]

    这个问题在这里已经有答案了 可能的重复 Linux Unix make install 应该包含什么 https stackoverflow com questions 528399 what should linux unix make
  • 在 Travis-CI 中启动 Vagrant VM

    如何使用 Vagrant 启动 Virtualbox 虚拟机特拉维斯 CI https travis ci org 我知道有时不支持在虚拟机内启动虚拟机 但也有报道成功 https www lewuathe com travisci vag
  • 使用脚本检查 git 分支是否领先于另一个分支

    I have branch1 and branch2我想要某种 git branch1 isahead branch2 这将显示如果branch1已承诺branch2没有 也可能指定这些提交 我无法检查差异原因branch2 is在之前br
  • 在 scapy 中通过物理环回发送数据包

    我最近发现了 Scapy 它看起来很棒 我正在尝试查看 NIC 上物理环回模块 存根上的简单流量 但是 Scapy sniff 没有给出任何结果 我正在做的发送数据包是 payload data 10 snf sniff filter ic
  • 如何从 Bash 命令行在后台 Vim 打开另一个文件?

    我正在从使用 Gvim 过渡到使用控制台 Vim 我在 Vim 中打开一个文件 然后暂停 Vim 在命令行上运行一些命令 然后想返回到 Vim Ctrl Z 在正常模式下 暂停 Vim 并返回到控制台 fg可用于将焦点返回到 Vim job
  • MySQL 与 PHP 的连接无法正常工作

    这是我的情况 我正在尝试使用 Apache 服务器上的 PHP 文件连接到 MySQL 数据库 现在 当我从终端运行 PHP 时 我的 PHP 可以连接到 MySQL 数据库 使用 php f file php 但是当我从网页执行它时 它只
  • “git add”返回“致命:外部存储库”错误

    我刚刚进入 git 的奇妙世界 我必须提交我对程序所做的一系列更改 位于名为的目录中 var www myapp 我创建了一个新目录 home mylogin gitclone 从这个目录中 我做了一个git clone针对公共回购 我能够
  • 在 x86 汇编语言中获取文件大小的简单方法

    假设我已经在汇编中打开了一个文件 并且在寄存器 eax 中有该文件的文件句柄 我将如何获取文件的大小 以便为其分配足够的缓冲区空间 我在这里研究了另一个讨论 建议使用sys fstat 28 系统调用来获取文件统计信息但无法实现它 My a
  • 如何从 C++ 程序中重新启动 Linux?

    我有一个 Qt 4 GUI 我需要在下拉菜单中提供一个选项 允许用户选择重新启动计算机 我意识到这对于以其他方式重新启动计算机的能力来说似乎是多余的 但选择需要保留在那里 我尝试使用 system 来调用以下内容 suid root she
  • ssh 连接超时

    我无法在 git 中 ssh 到 github bitbucket 或 gitlab 我通常会收到以下错误消息 如何避免它 输出 ssh T email protected cdn cgi l email protection i ssh
  • 在内核代码中查找函数的最佳方法[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我开始浏览内核代码 遇到的一件事是如何跟踪函数调用 结构定义等 有没有一种好的方法可以快速跳转到函数定义并退出 我尝试过 Source N
  • 为什么 Linux 原始套接字的 RX 环大小限制为 4GB?

    背景 我试图mmap 我的原始套接字的 RX 环形缓冲区64 bitLinux 应用程序 我的环由 4096 个块组成 每个块大小为 1MB 总共 4GB 请注意 每个 1MB 块中可以有许多帧 如果您好奇 请参阅此文档了解背景信息 htt
  • 执行命令而不将其保留在历史记录中[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 在进行软件开发时 经常需要在命令行命令中包含机密信息 典型示例是将项目部署到服务器的凭据设置为环境变量 当我不想将某些命令存储在命令历史记
  • Linux 中 m 标志和 o 标志将存储在哪里

    我想知道最近收到的路由器通告的 m 标志和 o 标志的值 从内核源代码中我知道存储了 m 标志和 o 标志 Remember the managed otherconf flags from most recently received R
  • SSH,运行进程然后忽略输出

    我有一个命令可以使用 SSH 并在 SSH 后运行脚本 该脚本运行一个二进制文件 脚本完成后 我可以输入任意键 本地终端将恢复到正常状态 但是 由于该进程仍在我通过 SSH 连接的计算机中运行 因此任何时候它都会登录到stdout我在本地终

随机推荐

  • 使“ls”命令将“a”排序在“B”之前(与a->b->A->B)

    我正在尝试找到一种方法以不区分大小写的方式打印 ls 命令的结果 目前 ls 命令的结果是 Apple Boy Chart Dock apples boys charts docks 我想要的是这样的 Apple apples Boy bo
  • Swagger UI 错误地以小写形式显示 XML 请求的属性

    我有一个使用 Swagger 的基本 NET 6 Web API 项目 并且有一个应该接受 JSON 和 XML 的虚拟 HttpPost 端点 据我所知 JSON 的模型绑定不区分大小写 但 XML 则不然 这就是我的问题 在 Progr
  • 如何通过Python从chrome获取URL [重复]

    这个问题在这里已经有答案了 我想分析哪些网站在当前选项卡中打开 即使它也使用 python 3 打开下一个选项卡 请任何人提供链接或任何建议我如何才能得到它 我想将其输入 python 控制台 例如 如果我打开新的网址 它应该打印到控制台
  • Url.Action 如何工作 Asp.net MVC?

    这与我问过的另一个问题有些相关 但我想为什么不单独问它 如果我要在视图中放置类似以下内容 td img src alt td 应该显示这个吗 td img src User mvc DisplayImage id U00915441 alt
  • CSS3 中的滑动动画

    我目前正在开发一个用 HTML 5 CSS3 和 jQuery 编写的移动应用程序框架 对于 屏幕 的标记 我有以下布局 div class page div div class page div 我目前正在使用 jQuery 来检测第一个
  • 使用 pandas xlsxwriter 模块使用条件格式格式化整行

    我正在使用 pandas xlsxwriter 模块创建 Excel 报告 下面是相同的代码片段 number rows len df index df is dataframe writer pd ExcelWriter Report 1
  • Files#delete(Path) 和 File#delete() 之间的区别

    我正在使用带有 java 7 update 6 的 Windows 7 并发现这种奇怪的 至少对我来说 行为 我有两个文件E delete1 txt and E delete2 txt两者都是只读文件 当我尝试删除如下文件时 它会被删除而没
  • 从年月(yyyy-MM)到年月(yyyy-MMMM)[重复]

    这个问题在这里已经有答案了 我有一个变量 YearMonth date 里面站立的地方 2016 07 例如 我希望它仍然是 YearMonth 但是 2016 july 注意 没有 分隔符 或者更好的是 2016 luglio 即意大利语
  • 我可以使用 firebase 作为 flutter 桌面应用程序的后端吗?如果是这样怎么办?

    我正在使用 flutter 构建一个桌面应用程序 我可以使用 firebase 作为后端吗 如果是这样怎么办 如果您查看 Firebase 文档可用的插件 https firebase google com docs flutter set
  • 将支持 bean 作为参数传递给 Facelet include

    我有一个可以在不同应用程序中使用的 Facelet 我不是要复制它 而是重复使用它 我需要传递将管理视图的支持 bean 作为参数 因为某些逻辑可能会根据使用它的应用程序而有所不同 我不想使用复合组件 而只是包含 Facelet 并指定哪个
  • Dojo,如何在 DIV 上执行 onclick 事件

    互联网上有一个淡出示例 http docs dojocampus org dojo fadeOut t tundra http docs dojocampus org dojo fadeOut t tundra 但我想做一些不同的事情 我希
  • 返回 PHP 多维数组中最后一个数组的元素

    如何在 PHP 中动态显示最后一个数组中的元素 例如 Array 0 gt Array id gt 6 user id gt 8 category path gt Sport 1 gt Array id gt 8 user id gt 8
  • syscall_thread_switch iOS 8.3 竞赛 - CocoaLumberjack bug?如何调试这个?

    我在我的应用程序中遇到了竞争条件 每当我暂停调试时 所有或除 1 个线程之外的所有线程都会卡在 syscall thread switch 上 它在模拟器上重现得更频繁 在 iPad Air 上也是如此 CocoaLumberjack 的
  • 从 Hibernate 4.3.6 迁移到 Hibernate 5

    我有一个旧项目 我使用 Java API 中的 Date 我想将其更改为新的 Java 8 Date APILocalDateTime 我读到 Hibernate 5 之前的版本不支持新的 Java 8 Date API 我决定从 Hibe
  • 原生 Vim 随机数脚本

    我知道有多种方法可以获取随机数 例如从 shell 中 然而 我在 Android 手机上运行 vim 几乎没有编译 而且 它不必是严格随机的 关键是 在 Vim 中获取一系列相当好的随机数的有趣 简洁 快速 即使用 vim 原生函数 或简
  • MS Access 2010 运行时 - 连续形式中缺少鼠标右键单击上下文菜单

    我在 MS Access 2003 中编写了一个应用程序 我可以使用 Access 2010 运行该应用程序 但是当我仅使用 MS Access 2010 运行时打开同一个 2003 应用程序时 我无法再以连续形式使用鼠标右键单击 因为我可
  • 向下转型最佳实践 (C++)

    静态代码分析工具往往会大量谈论 将基类向下转换为派生类 我还发现了一些编码标准指南 其中提到不要这样做 所以我想知道什么是最佳实践方法 这是我的用例 我有一个 Base 接口 DerivedA DerivedB 类 然后是一个包含 Base
  • 如何在codeigniter中使用pdo?

    据我所知 PDO 支持最近已添加到 codeigniter 但我找不到任何有关如何实际使用它的文档或教程 谁能告诉我如何使用它 您可以编辑 application config database php并启用 PDO 驱动程序 db def
  • Java中Float的最大值?

    下列question https stackoverflow com questions 3884793 minimum values and double min value in java表示 Double 的最小值是 Double M
  • QEMU和KVM在虚拟机I/O中扮演什么角色?

    我发现 QEMU 和 KVM 之间的界限非常模糊 我发现有人说虚拟机是qemu进程 而另一些人说是kvm进程 究竟是什么 而QEMU和KVM在虚拟机I O中扮演什么角色呢 比如一个vm做PIO MMIO的时候 是qemu还是kvm会把它困住