我试图为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。
我做错了吗?我需要采取任何初始化步骤吗?
答案 0 :(得分:2)
事实证明我的电脑配备了更新的x2APIC,而不是xAPIC。 x2APIC使用MSR发送IPI而不是内存映射寄存器,这是xAPIC使用的。因此,我在APIC_BASE
读取的内存并不代表本地APIC的状态。
我将重写我的代码以使用MSR,但我能够通过设置我的x2APIC来使用xAPIC的接口来测试我现有的代码(即使用内存映射寄存器)。这可以通过设置nox2apic
内核参数来完成。