我正在使用 QEMU/virt64 (armv8),我有一个与在 EL2 模式下运行的虚拟机管理程序的 IRQ 注入相关的问题。 首先,vGIC分配器地址是0x08000000,即与物理GIC相同,CPU接口地址是0x08040000,这是否正确? 当我用挂起的 IRQ(实际上只有一个,SGI #4)填充 LR 寄存器时,我用 HCR_VI 位设置 hcr_el2 寄存器以模拟 CPU IRQ 断言,当我切换到客户机(在 EL1 中运行)时,我按预期丢弃了异常,但我不断地从 GIC 读取 IRQ 1023...我的印象是我没有使用正确的地址(这些地址显然是通过第二个地址映射到虚拟机管理程序中的)舞台翻译)。
有什么想法吗?
GIC 内存映射组件的位置取决于平台。这意味着对于物理接口,它取决于机器,并且操作系统需要(a)知道它运行在什么硬件上并对它进行硬编码,或者(b)具有一些数据驱动机制(通常是 DTB 或 ACPI 表)告诉它正确的地址。
对于在虚拟机管理程序下运行的来宾,虚拟机管理程序可以将 GIC 内存映射部分的模拟映射到任何它喜欢的地方——它只需确保它和来宾对此达成一致。 (例如,虚拟机管理程序可能会对来宾认为它正在其上运行的已知硬件进行建模,或者它可能会与 VMM 进行安排,以确保来宾获得传递的 DTB/ACPI 信息,告诉它 GIC 内存映射组件的位置)。
对于像 KVM 这样的虚拟机管理程序,其中“虚拟机管理”部分位于用户空间中,KVM 提供了一个 API,以便 VMM 可以告诉它“将 VGIC 分配器放在这个地址”,因为 VMM 控制来宾看到的内存映射。
(这里你没有说你使用的是GICv2还是GICv3,但基本思想是相同的:来宾看到的GIC的一些位是由硬件提供的,一些必须由虚拟机管理程序模拟,虚拟机管理程序得到要选择它们在来宾内存映射中的位置,虚拟机管理程序和来宾需要就该内存映射达成一致,就像他们需要就 UART 所在位置和 RAM 所在位置达成一致一样。)