QEMU 中的本地 APIC 地址在哪里?
Where are local APIC addresses in QEMU?
根据Intel的文档,FEE0 0000H
到FEE0 03F0H
是本地APIC的范围。然而,从 QEMU 控制台检查它,我只能在那里找到值 0:
(qemu) x/128b 0xfee00000
fee00000: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
fee00008: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
fee00010: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
fee00018: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
fee00020: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
fee00028: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
fee00030: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
fee00038: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
fee00040: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
fee00048: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
fee00050: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
fee00058: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
fee00060: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
fee00068: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
fee00070: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
fee00078: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
我检查了 128 个字节以查看是否有任何不同于 0 的内容。至少,FEE0 0030H
应该包含一个不同的值,因为它是 APIC 版本所在的位置。
分页被禁用,因此没有虚拟内存;只是身体:
(qemu) info mem
PG disabled
但是,info lapic
命令报告实际初始值:
(qemu) info lapic
dumping local APIC state for CPU 0
LVT0 0x00008700 active-hi level ExtINT (vec 0)
LVT1 0x00008400 active-hi level NMI
LVTPC 0x00010000 active-hi edge masked Fixed (vec 0)
LVTERR 0x00010000 active-hi edge masked Fixed (vec 0)
LVTTHMR 0x00010000 active-hi edge masked Fixed (vec 0)
LVTT 0x00030010 active-hi edge masked periodic Fixed (vec 16)
Timer DCR=0x2 (divide by 8) initial_count = 4096
SPIV 0x000001ff APIC enabled, focus=off, spurious vec 255
ICR 0x000c4610 physical edge assert all
ICR2 0x00000000
ESR 0x00000000
ISR (none)
IRR (none)
那么,这些值在哪里?
设备已模拟。当 vCPU 读取或写入这些地址时,它们由模拟的 APIC 处理。当 GDB/the QEMU 控制台执行时,它可能不会通过该模拟器进行路由(模拟读取可以更改状态)。很可能,gdb/the QEMU 控制台只是被路由到 QEMU 的 RAM 表示,它不包括 APIC。
默认为 FEE0 0000H 到 FEE0 03F0H 但它占用了整个 4KiB 页面。前 16 个字节保留给 APIC ID 为 0 的内核的 MSI 中断(如果它位于 MSI 范围内,则这是必需的)。其他 255 个内核的 MSI 中断位于页面边界的起始处,每个 1 页,直至并包括 FEEF F000H。可以在每个逻辑核心上调整 LAPIC,因为每个逻辑核心都有 IA32_APIC_BASE_MSR。
根据Intel的文档,FEE0 0000H
到FEE0 03F0H
是本地APIC的范围。然而,从 QEMU 控制台检查它,我只能在那里找到值 0:
(qemu) x/128b 0xfee00000
fee00000: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
fee00008: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
fee00010: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
fee00018: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
fee00020: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
fee00028: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
fee00030: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
fee00038: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
fee00040: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
fee00048: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
fee00050: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
fee00058: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
fee00060: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
fee00068: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
fee00070: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
fee00078: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
我检查了 128 个字节以查看是否有任何不同于 0 的内容。至少,FEE0 0030H
应该包含一个不同的值,因为它是 APIC 版本所在的位置。
分页被禁用,因此没有虚拟内存;只是身体:
(qemu) info mem
PG disabled
但是,info lapic
命令报告实际初始值:
(qemu) info lapic
dumping local APIC state for CPU 0
LVT0 0x00008700 active-hi level ExtINT (vec 0)
LVT1 0x00008400 active-hi level NMI
LVTPC 0x00010000 active-hi edge masked Fixed (vec 0)
LVTERR 0x00010000 active-hi edge masked Fixed (vec 0)
LVTTHMR 0x00010000 active-hi edge masked Fixed (vec 0)
LVTT 0x00030010 active-hi edge masked periodic Fixed (vec 16)
Timer DCR=0x2 (divide by 8) initial_count = 4096
SPIV 0x000001ff APIC enabled, focus=off, spurious vec 255
ICR 0x000c4610 physical edge assert all
ICR2 0x00000000
ESR 0x00000000
ISR (none)
IRR (none)
那么,这些值在哪里?
设备已模拟。当 vCPU 读取或写入这些地址时,它们由模拟的 APIC 处理。当 GDB/the QEMU 控制台执行时,它可能不会通过该模拟器进行路由(模拟读取可以更改状态)。很可能,gdb/the QEMU 控制台只是被路由到 QEMU 的 RAM 表示,它不包括 APIC。
默认为 FEE0 0000H 到 FEE0 03F0H 但它占用了整个 4KiB 页面。前 16 个字节保留给 APIC ID 为 0 的内核的 MSI 中断(如果它位于 MSI 范围内,则这是必需的)。其他 255 个内核的 MSI 中断位于页面边界的起始处,每个 1 页,直至并包括 FEEF F000H。可以在每个逻辑核心上调整 LAPIC,因为每个逻辑核心都有 IA32_APIC_BASE_MSR。