8

カーネルモジュールでは、物理メモリのアドレスに「ゼロ」を書き込んで割り込みを処理する必要があります。

まず、「mmap」のような関数でメモリを割り当てる必要がありますが、カーネルモジュール用です。たとえば、ioremap。

static irqreturn_t int068_interrupt(int irq, void *dev_id)
{
    unsigned int *p;
    unsigned int address;
    unsigned int memsize;

    address = 0x12345678;
    memsize = 1024;

    p = ioremap(address, memsize);
    p[0]=0;

    printk("Interrupt was handled\n");

    return IRQ_HANDLED;
}

ただし、割り込みが発生し、割り込みハンドラーがカーネルの処理を開始すると、カーネルがクラッシュします(mm / vmalloc.c:numberoflineのカーネルバグ)

ioremapの使用法に問題があるようです。または、別の「mmapのカーネル代替」を使用する必要があります。

この問題を回避する方法を教えてください。

4

1 に答える 1

4

Linuxから直接ioremap.c

リージョンをiounmapおよびioremapすると、他のCPUは次のコンテキストスイッチまでこの変更を認識しません。一方、(たとえば)他のCPUの1つで割り込みが発生し、新しいioremapされた領域を参照する必要がある場合、CPUは古い領域を参照します。

ioremapこれは、割り込みサービスルーチン内での呼び出しを避けるように強く求めています。

于 2013-03-06T14:37:29.817 に答える