【问题标题】:Hoe does a bare metal hypervisor and the operating system it hosts cooridinate on system calls?裸机管理程序和它托管的操作系统是否协调系统调用?
【发布时间】:2019-08-03 23:28:49
【问题描述】:

我已经阅读了大量有关裸机虚拟机管理程序的内容,但从未完全了解它们与托管的操作系统交互的方式。

假设您在裸机上安装了 Unix。在用户模式下,您无法触摸或影响操作系统内部。你通过一个被困的系统调用来完成工作,将机器设置为内核模式,然后为你完成工作。例如,在 C 中,您可能会 malloc() 一堆,然后最终用完最初分配的内存。如果内存对我有用,malloc - 当它知道内存不足时 - 必须对我认为是 break() 的系统调用。一旦进入内核模式,您的进程的页表可以扩展,然后它返回并且 malloc() 具有所需的额外内存(或类似的东西)。

但是,如果您在裸机虚拟机管理程序之上安装 Unix,这实际上是如何发生的?看起来,管理程序必须具有整个系统的实际页表(甚至跨操作系统)。因此,当对 Unix 进行系统调用时,Unix 不能处于内核模式,否则它可能会与同时运行的其他操作系统混淆。另一方面,如果它在用户模式下运行,实现 break 的代码如何让管理程序知道它需要更多内存而不重写 Unix 代码?

【问题讨论】:

    标签: hypervisor


    【解决方案1】:

    在大多数架构中,除了主管之外,还添加了另一个级别,并且主管有所下降。内核认为自己可以控制机器,但这是虚拟机管理程序制造的假象。

    在 ARM 中,用户模式为 0,系统为 1,管理程序为 2。英特尔有点短视(喘气),用户为 3,主管为 0,因此管理程序是一种 -1。显然它不是 -1,但这是他们为此处理构建的极其丑陋的界面的便捷简写。

    在大多数架构中,管理程序会安装一组额外的页表,这些页表会在访客的页表之后生效。因此,您的 unix 内核认为它是在 1M 物理上加载的,可能位于任意地址,并且您的 unix 内核认为在页面边界处连续的每个地址都可能分散在大量实际(总线)地址上。

    即使您的架构不允许额外级别的页表,管理程序也可以直接“捕获和模拟”来宾构建的页表,并以完全透明的方式维护实际集。然而,向更长的流水线持续移动会增加每个陷阱的成本,因此非常感谢额外的级别页表。

    所以,您的 UNIX 认为它自己拥有全部 8M 内存;然而它不知道的是,一个鬼鬼祟祟的管理程序可能会将 8M 分页到一个非常大的软盘驱动器,并且只给它一个微不足道的 640K 真实 RAM。所有正常的 unix-y 东西都可以正常工作,除了它可能有一种非常迷幻的时间感,其中时间在交替的阶段变慢和加速,因为它们的管理程序试图假装 250 毫秒的软盘访问在一个时间内完成60nsec DRAM 访问。

    这就是管理程序变得困难的地方。

    【讨论】:

    • 优秀。我不知道一些现代芯片实现了多级特权系统。这有点回到未来:历史上 DEC 的 VAX/VMS 有 4 个权限级别,因此可以很容易地执行此类操作,因为可以为每个权限级别指定陷阱。但我同意你的观点:如果不是操作系统故障,而是通过仔细“重新编码”动态系统调用,它总是可以执行的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-17
    • 2019-06-25
    • 2011-08-11
    • 1970-01-01
    • 2016-07-12
    相关资源
    最近更新 更多