gpt4 book ai didi

memory-management - Linux 中 APIC 函数的帮助

转载 作者:行者123 更新时间:2023-12-01 17:30:55 24 4
gpt4 key购买 nike

我正在尝试使用 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 使用?提前致谢。

最佳答案

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

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

apic->send_IPI_allbutself(vector);

关于memory-management - Linux 中 APIC 函数的帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6984916/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com