在arm中进行虚拟化时,向多个来宾发送TTBR0/1 wrt的状态

在arm中进行虚拟化时,向多个来宾发送TTBR0/1 wrt的状态,arm,cortex-a,Arm,Cortex A,TTBR0/1是由PL1操作系统编程的CP15寄存器。现在,如果PL1 OS1编程TTBR0,然后在同一内核上调度PL1 OS2,PL1 OS2会看到TTBR0/1的值并设置OS1吗 我确信有某种方式可以保持理智,以下是真的吗 在来宾之间切换时,虚拟机监控程序在来宾上下文中保存所有cp15 REG,并在切换来宾之前进行后续恢复 如果是,那么虚拟机监控程序是否会很耗时,因为cp15注册表的列表会很长您可以阅读ARMv7 AR体系结构参考手册中的寄存器说明-可从下载注册 总之,是-TTBR0/TTB

TTBR0/1是由PL1操作系统编程的CP15寄存器。现在,如果PL1 OS1编程TTBR0,然后在同一内核上调度PL1 OS2,PL1 OS2会看到TTBR0/1的值并设置OS1吗

我确信有某种方式可以保持理智,以下是真的吗

在来宾之间切换时,虚拟机监控程序在来宾上下文中保存所有cp15 REG,并在切换来宾之前进行后续恢复


如果是,那么虚拟机监控程序是否会很耗时,因为cp15注册表的列表会很长

您可以阅读ARMv7 AR体系结构参考手册中的寄存器说明-可从下载注册

总之,是-TTBR0/TTBR1仅存在于一个副本(每个副本)中,在切换来宾时由虚拟机监控程序更新。虚拟机监控程序本身有VTTBR供自己使用。当然,这是唯一可以接待无限数量客人的方法。(AArch64模型有些不同,但相同的基本事实仍然成立。)

显然,这是一项成本高昂的操作,而且不是更换客人所需的唯一操作,因此您当然不想太频繁地这样做。但是需要保存的寄存器列表可能比您想象的要短


您可以看到KVM的实际实现。

如果您可以对托管操作系统进行一些假设,则可以减少操作。例如,许多操作系统不使用
FIQ
,有些操作系统可能根本不使用MMU。您必须对TrustZone执行大致相同的操作。我认为您可以使用TrustZone从来宾操作系统物理锁定FIQ,并避免FIQ银行保存/恢复。这可能会导致来宾操作系统崩溃或驱动程序死锁。@unixsmurf-ok,所以我认为需要保存cp15regs列表。我想如果换回同一位客人,这个名单将是最小的。我正在编写一个基于POC微核的虚拟机监控程序,其中一个特权客户机处理共享的h/w,该客户机应始终在核心0上运行,现在如果有两个核心仅支持两个普通客户机,则需要在它们之间进行调度切换