加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

内存管理 – 帮助Linux中的APIC功能

发布时间:2020-12-13 22:51:03 所属栏目:Linux 来源:网络整理
导读:我正在尝试使用2.6.32.40 linux内核中的本地APIC函数,但我遇到了一些问题.我想尝试向系统上的所有处理器发送不可屏蔽中断(NMI)(我使用的是Intel i7 Q740).首先,我阅读了与APIC功能相关的英特尔软件开发人员手册第3卷中的文档.它声明可以通过使用位于地址0xFE
我正在尝试使用2.6.32.40 linux内核中的本地APIC函数,但我遇到了一些问题.我想尝试向系统上的所有处理器发送不可屏蔽中断(NMI)(我使用的是Intel i7 Q740).首先,我阅读了与APIC功能相关的英特尔软件开发人员手册第3卷中的文档.它声明可以通过使用位于地址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 ICRn");

    *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);

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

fee00000-fee00fff : reserved

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

static inline void __default_local_send_IPI_allbutself(int vector)

但内核仍在抛出“无法处理分页请求”的消息并崩溃.有没有人有什么建议?为什么此内存范围标记为“保留”且未标记为由本地APIC使用?提前致谢.

解决方法

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

您应该使用内部内核函数.为此,您应该包含< asm / apic.h>并使用:

apic->send_IPI_allbutself(vector);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读