系统虚拟化:了解 IO 虚拟化和虚拟机管理程序的作用 [关闭]

2024-04-13

我想对I/O虚拟化有一个正确的理解。上下文是纯/全虚拟化,而不是半虚拟化。

我的理解是,虚拟机管理程序虚拟化硬件并向每个沙盒应用程序提供虚拟资源。每个沙箱都认为它正在访问底层硬件,但实际上并非如此。相反,由虚拟机管理程序执行所有访问。我需要更好地理解这一方面。

假设芯片有一个硬件定时器,供操作系统内核用作滴答定时器。假设有 2 个虚拟机(例如 Windows 和 Linux)在虚拟机管理程序上运行。

所有虚拟机均未修改其源代码。所以他们继续吐出直接对定时器资源进行编程的指令。

虚拟机管理程序在这里到底扮演什么角色?如何真正阻止这两个操作系统访问真实内容?


经过一番阅读后,我已经达到了一定程度的理解,描述如下:

https://stackoverflow.com/a/13045437/1163200 https://stackoverflow.com/a/13045437/1163200

我在这里完整地复制它:

这是试图回答我自己的问题。

系统虚拟化:了解 IO 虚拟化和管理程序的作用 https://stackoverflow.com/questions/12995768/system-virtualization-understanding-io-virtualization-and-role-of-hypervisor

虚拟化

虚拟化作为一个概念,使多个/不同的应用程序能够在同一底层硬件上共存,而无需相互了解。

例如,Windows、Linux、Symbian 等成熟的操作系统及其应用程序可以在同一平台上共存。所有计算资源都被虚拟化。

这意味着上述机器都无法访问物理资源。唯一可以访问物理资源的实体是称为虚拟机监视器(又名虚拟机管理程序)的程序。

现在这很重要。请仔细阅读并重新阅读。

虚拟机管理程序为上述每台机器提供虚拟化环境。由于这些机器访问的不是物理硬件而是虚拟化硬件,因此它们被称为虚拟机。

例如,Windows 内核可能想要启动一个物理计时器(系统资源)。假设定时器是内存映射 IO。 Windows 内核在定时器地址上发出一系列加载/存储指令。在非虚拟化环境中,这些加载/存储将导致定时器硬件的编程。

然而,在虚拟化环境中,这些基于加载/存储的物理资源访问将导致陷阱/故障。该陷阱由虚拟机管理程序处理。虚拟机管理程序知道 Windows 尝试对计时器进行编程。管理程序维护每个虚拟机的计时器数据结构。在这种情况下,管理程序会更新它为 Windows 创建的计时器数据结构。然后它对实时计时器进行编程。定时器产生的任何中断首先由管理程序处理。更新虚拟机的数据结构并调用虚拟机的中断服务程序。

长话短说,Windows 做了它在非虚拟化环境中会做的所有事情。在这种情况下,其操作导致的不是真实的系统资源被更新,而是虚拟资源(上面的数据结构)被更新。

因此,所有虚拟机都认为它们正在访问底层硬件;事实上,他们不知道的是,对物理硬件的所有访问都是通过虚拟机管理程序进行调解的。

上面描述的一切都是完全/经典虚拟化。大多数现代 CPU 都不适合经典虚拟化。陷阱/故障并不适用于所有指令。因此,现代设备上的虚拟机管理程序很容易被绕过。

这就是半虚拟化应运而生的地方。虚拟机源代码中的敏感指令被对 Hypervisor 的调用所取代。上面的加载/存储片段可以替换为诸如以下的调用

Hypervisor_Service(Timer Start, Windows, 10ms); 

仿真

仿真是与虚拟化相关的主题。想象一下这样一个场景:最初为 ARM 编译的程序在 ATMEL CPU 上运行。 ATMEL CPU 运行仿真程序,该程序解释每个 ARM 指令并仿真 ATMEL 平台上的必要操作。因此模拟器提供了一个虚拟化环境。

在这种情况下,系统资源的虚拟化不是通过陷阱和执行模型来执行的。

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

系统虚拟化:了解 IO 虚拟化和虚拟机管理程序的作用 [关闭] 的相关文章

  • 从 Mac 访问 Parallels Windows localhost [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我使用 Windows 7 操作系统作为开发平台 在 Mac Parallels Desktop 5 上运行 我想从 Mac 端访问 Wi
  • 如何在 Qt 中获取输出 system() 命令?

    我在 Qt 中使用 system 命令 我想获得输出并将其显示给用户 我的命令是 system echo rootPass toAscii su root c yum y install packageName toAscii 当我在 QP
  • 将 IVSHMEM 与 libvirt virt-manager 结合使用

    Using ivshmem in qemu需要执行以下步骤 在主机中启动 ivshmem 服务器 ivshmem server这将创建一个unix域套接字 tmp ivshmem socket 使用以下命令行选项启动 qemu charde
  • 如何在perl系统函数中同时使用管道并防止shell扩展?

    如果将多个参数传递给 perl 的系统函数 则 shell 扩展将不起作用 COMMAND perl e my s system echo s RESULT 如果该命令作为一个参数传递 则扩展将起作用 COMMAND perl e my s
  • 将纯数据 Docker 容器从一台机器移动到另一台机器的正确方法

    我有一个数据库 Docker 容器 它将其数据写入另一个仅数据容器 纯数据容器有一个存储数据库数据的卷 是否有一种 docker 方式将这个纯数据容器从一台机器迁移到另一台机器 我读到了有关 docker save 和 docker loa
  • 如何用C++读取系统信息?

    我正在尝试使用 C 获取 Linux 系统上的操作系统版本 硬盘空间 可用磁盘空间以及已安装 RAM 等信息 我知道我可以使用system 运行不同的 Linux 命令并捕获它们的输出 这就是我目前正在做的 但我想知道是否有更好的方法 C
  • 如何在 OS X C 代码中创建异步计时器?

    所以这个问题实际上是 为什么 time h 在 OS X 和 Linux 上不一样 但是 我已经接受了这些分歧 为了在 Unix 系统上创建计时器 我遵循了本教程http www helsinki fi atk unix dec manua
  • 多个环境中的 Azure 云服务项目配置(.csdef 和 .cscfg)

    目前我们有一个开发云服务 acme dev service 和一个生产云服务 acme prod service 我们解决方案中当前的设置有一个名为 acme application 的云服务项目 它使用 cscfg 和 csdef 文件的
  • 如何将VM选项添加到jar文件中?

    我需要添加 Djava security policy myPolicyFile这样我的 RMI jar 就可以工作了 或者还有其他方法可以运行吗 如果你想在有人使用启动你的 jar 时添加 Djava jar 这是不可能的 因为不可能在
  • popen vs system:popen 和 system 一样邪恶吗?

    popen 缓冲输出 而系统则不缓冲 这是唯一的区别吗 据我所知 popen 和 system 都通过 shell 运行命令 然而 popen 是evil http www cplusplus com forum articles 1115
  • Mac:执行 Vagrant 使用的 CLI“VBoxManage”时出现错误

    我正在使用 aerospike 并使用 vagrant virtual box 安装它 安装后 当我尝试启动虚拟机时 出现以下错误 执行时出现错误VBoxManage Vagrant 使用的 CLI 用于控制 VirtualBox 命令和
  • 未在虚拟机内分配外部 IP

    我正在尝试设置几个 Centos 6 虚拟机 我为它们分配了静态 IP 但运行 ifconfig 时 我看不到外部 IP 只看到内部 IP Google 不允许这种功能吗 除了Anderson所说的之外 这是从实例本身查询外部IP的命令 c
  • 带分组的 WPF DataGrid 虚拟化

    我正在使用来自 CodePlex 的 WPF DataGrid http wpf codeplex com 我需要让虚拟化与分组一起使用 This question https stackoverflow com questions 110
  • 如何打开给定文件的用户系统首选编辑器?

    我试图弄清楚如何打开给定文件的系统首选编辑器 假设我们有一个用 Java 编写的文件管理器 用户转到文件夹并查看文件列表 并且 例如 有一个文件Icon jpg 用户双击文件名 文件将在系统的首选编辑器 即 Gimp 中打开 主要问题是 如
  • 使用Intent打开系统应用程序

    我正在尝试制作一个简单的应用程序 当用户从主屏幕或应用程序抽屉单击时 该应用程序会将用户发送到特定的 系统安装的 应用程序 系统设置 日历 浏览器等 例如 我目前尝试在启动应用程序时打开系统设置 就像设置快捷方式一样 可以按照我想要的方式实
  • Java 系统范围的键盘快捷键

    有没有任何方法或库可以获取系统范围 全局 键盘快捷键 在 Java 应用程序中执行操作 我是 JIntellitype 的作者 我可以告诉您一个事实 这必须在 DLL 中本地完成 并从 Java JNI 调用 就像 JIntellitype
  • 在我的服务器上运行其他人代码(沙箱)的安全方法?

    我想制作一个在本地运行其他人的代码的网络服务 当然 我想限制他们的代码对某个 沙箱 目录的访问 这样他们就无法连接到我服务器的其他部分 数据库 主网络服务器等 最好的方法是什么 运行VMware Virtualbox 我猜它已经尽可能安全了
  • 通过 RDP 的 Azure VM 仅显示黑屏和 cmd

    我有一个 Azure 虚拟机 当我通过 RDP 登录时 我只能看到黑屏 并且 CMD 控制台已打开 难道没有探索者吗 VM OS spec Operating system Windows Publisher MicrosoftWindow
  • 获取进程段的开始和结束 C/C++

    我需要获取以下进程段的开始和结束地址 代码 数据 堆栈 环境 我了解它如何位于内存中 但不知道如何使用 api 调用或其他方式获取它 我找到了如何使用此代码开始某些片段 include
  • 缺少库 com.sun.tools.attach

    我尝试跟随本教程 http dhruba name 2010 02 07 creation dynamic loading and instrumentation with javaagents 但我在进口方面遇到问题 I got The

随机推荐