2

IRQ記述配列要素にアクセスし、これらの要素のすべてのアクション名を表示するのに苦労しているCのカーネルモジュールをプログラミングしています。

最初は、このirq_desc配列はマクロのようなものだと思っていましたが、コンパイルした後、そうではないことがわかりました。次に、for_each_irq_desc(irq、desc)関数を使用しました。しかし、今回は警告を返しました:

警告: "irq_to_desc" [/home/samet/Masaüstü/Assignment3/Ass-1.ko]は未定義です!

この警告の後、今回はモジュールをカーネルに挿入しようとしましたが、エラーメッセージが表示されました。

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

1 に答える 1

-1

あなたは私の能力を本当に過大評価していると思います。これは私の最初のhelloworldカーネルモジュールです。しかし、どちらかといえば、経験から、プログラマーが王様であることがわかりました。何かが必要な場合は、それを定義します。

カーネルヘッダーは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");
}
于 2012-04-08T10:44:03.677 に答える