映射到内存中的本地APIC寄存器只包含1

时间:2017-11-13 10:37:29

标签: c linux linux-kernel x86

我试图为Linux内核模块编写一些代码,这些代码可以在x86上读取和写入本地APIC。我使用下面的代码片段从中断命令寄存器中读取:

printk(KERN_ERR "APIC %p %d", (int32_t *)(APIC_BASE + 0x300), 
                              *(volatile int32_t *)(APIC_BASE + 0x300));

这是输出,永远不会改变:

APIC ffffffffff5f5300 -1

由于我打印出一个带符号的32位整数,-1表示我读取的32位都是1。这是意料之外的,因为(根据我的理解)第11位(目标模式位)需要为0才能写入本地APIC发送IPI。

我做错了吗?我需要采取任何初始化步骤吗?

1 个答案:

答案 0 :(得分:2)

事实证明我的电脑配备了更新的x2APIC,而不是xAPIC。 x2APIC使用MSR发送IPI而不是内存映射寄存器,这是xAPIC使用的。因此,我在APIC_BASE读取的内存并不代表本地APIC的状态。

我将重写我的代码以使用MSR,但我能够通过设置我的x2APIC来使用xAPIC的接口来测试我现有的代码(即使用内存映射寄存器)。这可以通过设置nox2apic内核参数来完成。