我想在我的加载程序代码中对 IO-APIC 和 Local-APIC 进行编程,代码在 BIOS 之后运行。
我阅读了 i82093AA 数据表,发现寄存器基数是由 PIIX3 的 APICBASE 寄存器定义的。如何读取“PIIX3 APICBASE”寄存器?
据我所知,IO-APIC 寄存器库默认为 0xFEC00000,但 BIOS 可能会更改它。所以我想找到一种正确获得基地的方法。
如果您使用的是内置 APIC,那么一切实际上都非常简单。您需要做的就是读取包含APICBASE
. 这是MSR的基本列表。
要读取 MSR,请使用rdmsr
指令(特权)。
mov ecx, 0x1B ; ECX=register address
xor eax, eax ; value of unimplemented bits in MSR will turn undefined when moved to
xor edx, edx ; EDX:EAX, so I set everything to 0
rdmsr
; EDX:EAX now contains APICBASE
在谈到 PIIX3 外部 APIC 时,来自 PIIX3 文档:
APICBASE—APIC 基址重定位寄存器(功能 0)
地址偏移: 80h
默认值: 00h
属性:读/写该寄存器提供 APIC 基地址的修饰符。APIC 映射到内存空间中的
0xFEC0xy00
(0xFEC0xy10
,x=0-F
)位置y=0/4/8/C
。的值y
由位 [1,0] 定义,而 的值x
由位 [5:2] 定义。因此,重定位寄存器提供了 1 KB 地址粒度(即,可能多达 64 个 IOAPIC 可以是内存空间中的统一地址)。默认值 00h 提供 IOAPIC 单元在地址0xFEC00000
和的映射0xFEC00010
。
查看实际为此类数据连接 PCI 的驱动程序可能会有所帮助。
我在互联网上看到的许多来源都是固定0xFEC00000
的,并不关心它是否会有所不同。但正如 PIIX3 文档所说,0xFEC00000
它是保证默认值,您不必进一步考虑它。