0

我正在尝试禁用所有中断。它们中的大多数都很容易,但我对不可屏蔽中断 (NMI) 有疑问。要禁用它们,我想在本地 APIC 中操作 LVT 寄存器。目前我正在内核模块中进行测试,因为那是环境,最终代码应该运行。

如何读取/写入 APIC 的内存映射寄存器?

我已经阅读了很多文章,每个人都建议这个程序。我还尝试直接访问 *mapped 指针,结果相同。

而不是 foo() 函数,我实现了正确地址的查找。但是根据英特尔手册和我个人的检查,APIC 总是被映射到物理地址 0xFEE00000,这很有趣,因为我还在具有 2 GB RAM 的虚拟机上尝试了该程序。

phys_addr_t apic_base_phys = foo(); // fee00000
void __iomem *mapped = ioremap(apic_base_phys + 0x20, 0x4);

if(mapped == NULL){
    printk(KERN_INFO "nullpointer\n");
} else {
    uint32_t value = ioread32(mapped);
    printk(KERN_INFO "Value: %x\n", value); // 0xffffffff
}

iounmap(mapped);

输出:

[ 1329.743182] apic_base_phys: fee00000
[ 1329.743198] Value: ffffffff

地址 0xFEE00020 应该输出本地 APIC ID,可能不是 0xFFFFFFFF。
我还尝试读取应该输出 LAPIC 版本的 0xFEE00030。

4

1 回答 1

1

我自己得到了解决方案:在我的系统上运行更新的 x2APIC。这使用了不同的传输模式。

这可以通过添加nox2apic到引导选项来禁用。

于 2019-04-17T07:02:28.887 回答