2

我想在我的加载程序代码中对 IO-APIC 和 Local-APIC 进行编程,代码在 BIOS 之后运行。

我阅读了 i82093AA 数据表,发现寄存器基数是由 PIIX3 的 APICBASE 寄存器定义的。如何读取“PIIX3 APICBASE”寄存器?

据我所知,IO-APIC 寄存器库默认为 0xFEC00000,但 BIOS 可能会更改它。所以我想找到一种正确获得基地的方法。

4

1 回答 1

3

如果您使用的是内置 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它是保证默认值,您不必进一步考虑它。

于 2014-07-18T16:17:39.153 回答