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:nu​​mberofline 处的内核错误)

我对 ioremap 的使用似乎有问题,或者我应该使用另一个“mmap 的内核替代品”

请告诉我,如何解决这个问题?

4

1 回答 1

4

直接从 Linux ioremap.c

如果您 iounmap 和 ioremap 一个区域,其他 CPU 在下一次上下文切换之前不会看到此更改。同时,(例如)如果中断进入需要引用新 ioremap 区域的其他 CPU 之一,则 CPU 将引用旧区域。

这明显要求避免ioremap在中断服务程序中调用。

于 2013-03-06T14:37:29.817 回答