我试图在2.6.32.40 linux内核中使用本地APIC函数,但我遇到了一些问题。我想尝试向我系统上的所有处理器发送一个不可屏蔽的中断(NMI) (我使用的是英特尔i7 Q740)。首先,我阅读了Intel软件开发人员手册第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);但是,当我入侵这个模块时,内核会崩溃,并抱怨无法处理分页请求@ address 00000000F00300。在/proc/iomem下面查看,我发现这个地址在一个标有“保留”的范围内。
fee00000-fee00fff : reserved我还尝试使用以下函数:
static inline void __default_local_send_IPI_allbutself(int vector)但是内核仍然抛出“无法处理分页请求”的消息并崩溃。有人有什么建议吗?为什么这个内存范围被标记为“保留”而不是标记为被本地APIC使用?提前谢谢。
发布于 2011-08-11 07:13:45
APIC地址是一个物理内存地址,但是您试图将它作为线性内存地址访问--这就是第一种方法无法工作的原因。内存被标记为“保留”,正是因为它属于APIC,而不是真正的内存。
您应该使用内部内核函数。要做到这一点,您应该包括<asm/apic.h>并使用:
apic->send_IPI_allbutself(vector);https://stackoverflow.com/questions/6984916
复制相似问题