Linux kernel 如何从内核模块读/写LAPIC寄存器?

Linux kernel 如何从内核模块读/写LAPIC寄存器?,linux-kernel,intel,apic,Linux Kernel,Intel,Apic,我正在尝试禁用所有中断。大多数都很简单,但我对不可屏蔽中断(NMI)有问题。 要禁用它们,我想操作本地APIC中的LVT寄存器。 目前我正在一个内核模块内进行测试,因为这是环境,最终的代码应该运行 如何读取/写入APIC的内存映射寄存器 我已经读了很多文章,每个人都建议这个程序。 我还尝试直接访问*映射指针,它在相同的结果中解析 我实现了正确地址的查找,而不是foo()函数。但是根据英特尔手册和我的个人检查,APIC总是被映射到物理地址0xFEE00000,这很有趣,因为我也在一个有2GB内存的

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

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

我已经读了很多文章,每个人都建议这个程序。 我还尝试直接访问*映射指针,它在相同的结果中解析

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

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

地址0xFEE0020应输出本地APIC ID,该ID可能不是0xFFFFFF。

我还尝试读取0xFEE00030,它应该输出LAPIC版本。

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

可通过向启动选项添加
nox2apic
来禁用此功能