gpt4 book ai didi

linux - 了解 x2APIC 的虚拟 APIC 页面

转载 作者:太空狗 更新时间:2023-10-29 12:23:59 28 4
gpt4 key购买 nike

我正在编写一个 VMM,我正在尝试支持在 VMX 非根模式下运行的 guest 操作系统对 x2APIC 寄存器的虚拟访问。

我想从做一些简单的事情开始,例如从 guest 操作系统中读取本地 APIC ID。我已尝试在我的 VMM 中添加对此的支持,但我读取的值似乎不正确。

很遗憾,网上好像找不到很多关于虚拟APIC页面的资料。我已经通读了英特尔手册的第 29 章(APIC 虚拟化和虚拟中断),这就是我正在做的事情:

  1. 在基于辅助处理器的 VM 执行控件中,我将以下位设置为 1:(我将下面的位 9 设置为我最终想要支持发布的 IPI)

    1. SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE (位 4)
    2. SECONDARY_EXEC_APIC_REGISTER_VIRT (位 8)
    3. SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY (位 9)
  2. 在 MSR 位图中,我禁用了 0x802 的拦截, 即本地 APIC ID 寄存器。

  3. 在我的客户操作系统中,我使用 rdmsr阅读0x802 .

我在固定到不同内核的两个线程上执行步骤 3。他们都读取值 2621447225从寄存器。这似乎是不正确的,因为线程被固定到不同的内核,因此应该读取不同的本地 APIC ID(而且数字 2621447225 真的很大)。我做错了什么?

这里有一些额外的信息供您引用:

在 Intel 手册的第 29.5 节(虚拟化基于 MSR 的 APIC 访问)中,它说:

If “APIC-register virtualization” is 1 and ECX contains a value in the range 800H–8FFH, the instruction reads the 8 bytes from offset X on the virtual-APIC page into EDX:EAX, where X = (ECX & FFH) « 4. This occurs even if the local APIC is not in x2APIC mode (no general-protection fault occurs because the local APIC is not in x2APIC mode).

X offset 对我来说很有意义:MSR 地址 0x802将是 0x2当与 0xFF 进行 AND 运算时, 和 0x2将变为 0x20当左移 4 位时。 0x20如果您通过其内存映射寄存器访问 xAPIC,则它是物理 APIC 页面内的偏移量。然后读取 8 个字节(即 64 位),因此低 32 位是 x2APIC 的本地 APIC ID。

最佳答案

我在@prl 的帮助下解决了这个问题。我必须自己为每个内核分配一个虚拟 APIC 页面,然后使用其关联内核的本地 APIC ID 单独初始化每个页面。

然后我将页面的物理地址添加到 VMCS(在 Linux 内核中定义了一个名为 VIRTUAL_APIC_PAGE_ADDR 的常量,它包含 VMCS 中的偏移量)。我没有意识到我必须初始化页面,因为它不是自动完成的。

编辑:我在 Linux 上实现了一个支持 x2APIC 虚拟化的工作虚拟化系统并发布了中断处理,并在 this document 中写了关于这两个主题的文章.该文档应该相当简单,并且包含指向我的实现的链接。

关于linux - 了解 x2APIC 的虚拟 APIC 页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47950831/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com