我正在尝试禁用所有中断。它们中的大多数都很容易,但我对不可屏蔽中断 (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。