裸机管理程序和它承载的操作系统是否协调系统调用?
Hoe does a bare metal hypervisor and the operating system it hosts cooridinate on system calls?
我已经阅读了大量关于裸机管理程序的文章,但从未完全了解它们与托管的 OS 交互的方式。
假设您在裸机上安装了 Unix 本身。在用户模式下,您不能触摸或影响 OS 内部结构。您通过陷入困境的系统调用来完成工作,将机器设置为内核模式,然后为您完成工作。例如,在 C 中,您可能会 malloc() 一堆,然后最终 运行 超出最初分配的内存。如果我没记错的话,malloc——当它知道内存不足时——必须对我认为是 break() 的系统进行调用。一旦进入内核模式,您的进程的页面 table 可以扩展,然后它 returns 和 malloc() 具有所需的额外内存(或类似的东西)。
但是如果您在裸机管理程序之上安装 Unix,这实际上是如何发生的?看起来,管理程序必须具有整个系统的实际页面 tables(甚至跨越 OSs)。因此,当对 Unix 进行系统调用时,Unix 不能处于内核模式,否则它可能会同时与其他 OSs 运行ning 混淆。另一方面,如果它在用户模式下 运行ning,那么在不重写 Unix 代码的情况下,实现 break 的代码将如何让管理程序知道它需要更多内存?
在大多数体系结构中,除了监督者之外还添加了另一个级别,而监督者则有所降级。内核认为自己控制着机器,但这是管理程序制造的错觉。
在 ARM 中,用户模式为 0,系统为 1,管理程序为 2。英特尔有点目光短浅(gasp),将用户设置为 3,管理程序设置为 0,因此管理程序是一种 -1。显然它不是 -1,但对于他们为此处理构建的极其丑陋的界面来说,这是一个方便的 shorthand。
在大多数体系结构中,虚拟机监控程序会安装一组额外的页面 tables,这些页面在来宾的页面 tables 之后生效。因此,您的 unix 内核认为它以 1M 物理加载,可以位于任意地址,并且您的 unix 内核认为在页面边界处连续的每个地址都可能分散在大量实际(总线)地址上。
即使您的体系结构不允许额外级别的页面 table,管理程序也可以直接 "trap & emulate" 访客构建的页面 table ,并以完全透明的方式维护一个实际的集合。然而,向更长管道的持续运动增加了每个陷阱的成本,因此非常感谢额外的级别页面 table。
因此,您的 UNIX 认为它拥有所有 8M 内存;然而它并不知道,一个偷偷摸摸的虚拟机管理程序可能会将这 8M 分页到一个非常大的软盘驱动器,并且只给它微不足道的 640K 实际 RAM。所有正常的 unix-y 东西都可以正常工作,除了它可能有一种非常迷幻的时间感,时间在交替阶段变慢和加速,因为它们的管理程序试图假装 250 毫秒的软盘访问在60 纳秒内存访问。
这就是管理程序变得困难的地方。
我已经阅读了大量关于裸机管理程序的文章,但从未完全了解它们与托管的 OS 交互的方式。
假设您在裸机上安装了 Unix 本身。在用户模式下,您不能触摸或影响 OS 内部结构。您通过陷入困境的系统调用来完成工作,将机器设置为内核模式,然后为您完成工作。例如,在 C 中,您可能会 malloc() 一堆,然后最终 运行 超出最初分配的内存。如果我没记错的话,malloc——当它知道内存不足时——必须对我认为是 break() 的系统进行调用。一旦进入内核模式,您的进程的页面 table 可以扩展,然后它 returns 和 malloc() 具有所需的额外内存(或类似的东西)。
但是如果您在裸机管理程序之上安装 Unix,这实际上是如何发生的?看起来,管理程序必须具有整个系统的实际页面 tables(甚至跨越 OSs)。因此,当对 Unix 进行系统调用时,Unix 不能处于内核模式,否则它可能会同时与其他 OSs 运行ning 混淆。另一方面,如果它在用户模式下 运行ning,那么在不重写 Unix 代码的情况下,实现 break 的代码将如何让管理程序知道它需要更多内存?
在大多数体系结构中,除了监督者之外还添加了另一个级别,而监督者则有所降级。内核认为自己控制着机器,但这是管理程序制造的错觉。
在 ARM 中,用户模式为 0,系统为 1,管理程序为 2。英特尔有点目光短浅(gasp),将用户设置为 3,管理程序设置为 0,因此管理程序是一种 -1。显然它不是 -1,但对于他们为此处理构建的极其丑陋的界面来说,这是一个方便的 shorthand。
在大多数体系结构中,虚拟机监控程序会安装一组额外的页面 tables,这些页面在来宾的页面 tables 之后生效。因此,您的 unix 内核认为它以 1M 物理加载,可以位于任意地址,并且您的 unix 内核认为在页面边界处连续的每个地址都可能分散在大量实际(总线)地址上。
即使您的体系结构不允许额外级别的页面 table,管理程序也可以直接 "trap & emulate" 访客构建的页面 table ,并以完全透明的方式维护一个实际的集合。然而,向更长管道的持续运动增加了每个陷阱的成本,因此非常感谢额外的级别页面 table。
因此,您的 UNIX 认为它拥有所有 8M 内存;然而它并不知道,一个偷偷摸摸的虚拟机管理程序可能会将这 8M 分页到一个非常大的软盘驱动器,并且只给它微不足道的 640K 实际 RAM。所有正常的 unix-y 东西都可以正常工作,除了它可能有一种非常迷幻的时间感,时间在交替阶段变慢和加速,因为它们的管理程序试图假装 250 毫秒的软盘访问在60 纳秒内存访问。
这就是管理程序变得困难的地方。