Memory management Linux中APIC函数的帮助

Memory management Linux中APIC函数的帮助,memory-management,linux-kernel,interrupt,apic,Memory Management,Linux Kernel,Interrupt,Apic,我试图在2.6.32.40 linux内核中使用本地APIC函数,但我遇到了一些问题。我想尝试向系统上的所有处理器发送不可屏蔽中断(NMI)(我使用的是Intel i7 Q740)。首先,我阅读了《英特尔软件开发人员手册》第3卷中与APIC函数相关的文档。它指出,可以通过使用地址0xFEE00300处的中断命令寄存器(ICR)将中断广播到所有处理器。因此,我使用以下init函数编写了一个内核模块,以尝试写入此寄存器: #include <linux/init.h> #include

我试图在2.6.32.40 linux内核中使用本地APIC函数,但我遇到了一些问题。我想尝试向系统上的所有处理器发送不可屏蔽中断(NMI)(我使用的是Intel i7 Q740)。首先,我阅读了《英特尔软件开发人员手册》第3卷中与APIC函数相关的文档。它指出,可以通过使用地址0xFEE00300处的中断命令寄存器(ICR)将中断广播到所有处理器。因此,我使用以下init函数编写了一个内核模块,以尝试写入此寄存器:

#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>

MODULE_LICENSE("GPL");

#define SUCCESS 0
#define ICR_ADDRESS 0xFEE00300
#define ICR_PROGRAM 0x000C4C89

static int icr_init(void){

    int * ICR = (int *)ICR_ADDRESS;

    printk(KERN_ALERT "Programing ICR\n");

    *ICR = ICR_PROGRAM;

    return SUCCESS;
}

static void icr_exit(void){
    printk(KERN_ALERT "Removing ICR Programing module removed");
}

module_init(icr_init);
module_exit(icr_exit);
我还尝试使用以下功能:

static inline void __default_local_send_IPI_allbutself(int vector)

但是内核仍然抛出“无法处理分页请求”消息并崩溃。有人有什么建议吗?为什么此内存范围标记为“保留”,而未标记为本地APIC正在使用?提前感谢。

APIC地址是一个物理内存地址,但您试图以线性内存地址的形式访问它-这就是第一种方法不起作用的原因。内存被标记为“保留”正是因为它属于APIC,而不是真正的内存

您应该使用内部内核函数。为此,您应包括
,并使用:

apic->send_IPI_allbutself(vector);

这个函数和我遇到的问题是一样的:静态内联void\uuuu default\u local\u send\uipi\u allbutself(int vector)我得到内核消息:BUG:无法在ffffffffffffff5fb300处理内核分页请求实际上,我已经解决了这个问题。这个问题源于我缺乏信息。我在Xen虚拟机监控程序的域0中运行此代码。Xen阻止了对系统内存的写入(我犯了一个愚蠢的错误)。@John:你的第一个方法在裸机上仍然会失败。
apic->send_IPI_allbutself(vector);