【问题标题】:Help with APIC functions in LinuxLinux 中 APIC 函数的帮助
【发布时间】:2011-08-08 15:59:20
【问题描述】:

我正在尝试使用 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);

但是,当我安装此模块时,内核崩溃并抱怨无法处理@地址 00000000fee00300 的分页请求。在 /proc/iomem 下查看,我看到此地址位于标记为“保留”的范围内

fee00000-fee00fff : reserved

我也试过使用下面的函数:

static inline void __default_local_send_IPI_allbutself(int vector)

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

【问题讨论】:

    标签: memory-management linux-kernel interrupt apic


    【解决方案1】:

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

    您应该使用内部内核函数。为此,您应该包含 &lt;asm/apic.h&gt; 并使用:

    apic->send_IPI_allbutself(vector);
    

    【讨论】:

    • 我在使用这个函数时遇到了同样的问题:static inline void __default_local_send_IPI_allbutself(int vector) 我收到内核消息:BUG:无法在 FFFFFFFFFF5fb300 处理内核分页请求
    • 其实我已经解决了这个问题。问题源于我缺乏信息。我在 Xen 管理程序的 domain0 中运行此代码。 Xen 阻止了对系统内存的写入(我的愚蠢错误)。
    • @John:您的第一种方法在裸机上仍然会失败。
    猜你喜欢
    • 2017-11-15
    • 2014-05-09
    • 2011-03-13
    • 2010-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    相关资源
    最近更新 更多