c - 访问模块中的 IRQ 描述数组并显示操作名称

标签 c linux-kernel kernel linux-device-driver irq

我正在用 C 编写一个内核模块,它正在努力访问 IRQ 描述数组元素并显示这些元素的所有操作名称。

一开始,我认为这个irq_desc 数组就像一个宏,但编译后我明白了它不是。然后我使用了 for_each_irq_desc(irq, desc) 函数。但这次它返回了一个警告:

警告:“irq_to_desc”[/home/samet/Masaüstü/Assignment3/Ass-1.ko] 未定义!

在这个警告之后,我尝试将模块插入到内核中,但这次弹出了一条错误消息:

insmod: error inserting './Ass-1.ko': -1 Unknown symbol in module

在此之后,我包含了我认为与此过程相关的所有头文件,但没有任何改变。

因为它很短,我附上代码:

#include <linux/module.h>   
#include <linux/kernel.h>   
#include <linux/init.h>     
#include <linux/sched.h>    
#include <linux/irq.h>
#include <linux/irqdesc.h>
#include <linux/irqnr.h>

struct task_struct* p;
struct irq_desc* irqElement;
int irq, desc;

static int __init ass_1_init(void)
{
    printk(KERN_INFO "Ass-1 module is starting...\n");

    for_each_process(p){printk("%d\t%s\n", p->pid, p->comm);}

    for_each_irq_desc(irq, irqElement){printk("%p\n", irqElement);}

    return 0;
}

static void __exit ass_1_exit(void)
{
    printk(KERN_INFO "Ass-1 module is finishing...\n");
}

module_init(ass_1_init);
module_exit(ass_1_exit); 

最佳答案

我觉得你真的高估了我的能力。这是我的第一个 hello world 内核模块。但如果有的话,经验告诉我程序员为王。如果您想要什么,请定义它。

内核头文件不想将 irq 暴露给模块,这很清楚,所以我敢打赌这不会得到支持,这通常可能是个坏主意。但我们不关心这个。我们是黑客!

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>     
#include <linux/sched.h>    
#include <linux/irq.h>
#include <linux/irqnr.h>
#include <linux/irqdesc.h>

#define irq_to_desc(irq)        (&irq_desc[irq])
#define nr_irqs NR_IRQS
struct irq_desc irq_desc[NR_IRQS];

struct irq_desc *irqElement;
int irq;
int init_module(void)
{
    printk(KERN_INFO "I HAZ MODULE\n");
    for_each_irq_desc(irq, irqElement){printk("%p\n", irqElement);}
    return 0;
}

void cleanup_module(void)
{
    printk(KERN_INFO "BAI MODULE!!!1\n");
}

关于c - 访问模块中的 IRQ 描述数组并显示操作名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10058594/

相关文章:

C 函数中的 Const 声明和实现

c - Linux 内核调试打印输出?

linux - 在运行时获取 Linux 内核函数的结束地址

c - 错误 : stray '\302' in program

java - OpenCL 构建错误

c - 如果不断增加访问内存超过 malloc() 分配的大小,linux glibc 中会发生什么

c - 在不使用 realloc 的情况下在 C 中增长数组?

linux-kernel - 在虚拟服务器上运行 docker - 可能与否?

c - 如何验证给定散列和公钥的数字签名?

linux - 如何使用 devm_regulator_get 处理错误