我的理解是主机操作系统在启动时关联并锁定某些 CPU 操作码/指令,以便只有主机操作系统可以使用它们。此外,CPU 架构也支持这一点。
如果一个程序冒犯并试图使用这些指令,CPU 将陷入陷阱并将控制权交还给操作系统,这将终止该程序。因此,一个程序使用 Syscalls() 来做这些事情。
当您虚拟化操作系统时,它不会发出系统调用(),它只会执行特权指令。按理说它会被主机操作系统终止。
操作码是如何虚拟化的?
除了终止还有一个选择,那就是模拟和继续。
当硬件不支持但程序需要时,一些系统会模拟未对齐的加载和存储;类似于浮点指令和寄存器。因此,主机可以模拟一些事情,使其看起来像是硬件确实执行了该指令。仿真意味着更改程序的状态(根据需要更改 cpu 寄存器或内存),然后在错误指令后恢复程序。
处理页面错误的类似机制:加载、复制或以其他方式映射地址,然后继续程序——尽管对于这些,一旦页面可用,错误指令就会重新启动。
在那些环境中,特权指令和缺失指令故障(以硬件异常为例)至关重要,这样主机才能使用正确的语义进行仿真。硬件根据操作模式更改执行特权指令的行为,无论是用户还是管理员(或其他)。采取异常自动切换到另一种模式,从异常中恢复恢复原来的模式。
硬件方案可以帮助提高效率,例如,RISC V 为多个独立的特权级别定义了特定的指令和行为,因此可以允许某些特权操作而不会导致下一层出错。