X86 关于IO-APIC 82093AA

X86 关于IO-APIC 82093AA,x86,apic,X86,Apic,我想在我的加载程序代码中编程IO-APIC和本地APIC,该代码在BIOS之后运行 我阅读了i82093AA数据表,发现寄存器基址是由PIIX3的APICBASE寄存器定义的。如何读取“PIIX3 APICBASE”寄存器 据我所知,IO-APIC寄存器基默认为0xFEC00000,但BIOS可能会更改它。因此,我想找到一种方法来正确地获取基数。如果您使用的是内置APIC,那么实际上一切都非常简单。您所需要做的就是读取包含APICBASE的特定于型号的寄存器。这里是一个基本的列表 要读取MSR,

我想在我的加载程序代码中编程IO-APIC和本地APIC,该代码在BIOS之后运行

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


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

如果您使用的是内置APIC,那么实际上一切都非常简单。您所需要做的就是读取包含
APICBASE
的特定于型号的寄存器。这里是一个基本的列表

要读取MSR,请使用
rdmsr
指令(特权)

在谈到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-Kbyte地址粒度(即,可能高达 64个IOAPIC可以是内存空间中的统一地址)。这个 默认值00h提供了IOAPIC单位在 地址
0xFEC00000
0xFEC00010

在驱动程序上,为此类数据实际连接PCI可能会有所帮助


我在互联网上找到的许多信息来源都使用固定的
0xFEC00000
,并不关心它是否不同。但正如PIIX3文档所述,
0xFEC00000
保证为默认值,您无需进一步考虑。

为什么不使用本地APIC?我认为IO和本地APIC都需要编程。我正在使用内置APIC。我已经阅读了Intel64&IA-32软件开发人员手册第10章第3A卷。大部分文字都是关于本地APIC的,我找不到任何东西来说明如何配置IO-APIC!此外,我在本章中找不到任何与IO-APIC相关的寄存器。我认为对于内置APIC,IO-APIC也应该是逻辑内置的。对吗?IO-APIC内置APIC是否与wikipedia中的i82093AA完全相同?英特尔APIC系统中有两个组件,本地APIC(LAPIC)和I/O APIC。系统中的每个CPU中都有一个LAPIC。在第一次实现中,LAPIC是一个离散电路,即82489DX,但此后它被集成到Intel处理器中。系统中的每个外围总线通常有一个I/O APIC。你可以编写一个或另一个程序。
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