我在C中编写一个内核模块,它正在努力访问IRQ描述数组元素并显示这些元素的所有动作名称。
一开始,我认为这个irq_desc数组就像一个宏,但是在编译之后,我知道它不是。然后我使用了for_each_irq_desc(irq,desc)函数。但这次它发出警告:
警告:“irq_to_desc”[/home/samet/Masaüstü/Assignment3/Ass-1.ko]未定义!
并且在此警告之后,我尝试将模块insmod到内核中,这次弹出一条错误消息:
insmod:插入'./Ass-1.ko'时出错:-1模块中的未知符号
之后我包含了我认为与此过程相关的所有头文件,但没有任何改变。
由于它很短,我附上代码:
#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);
答案 0 :(得分:-1)
我认为你真的高估了我的能力。这是我的第一个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");
}