C - 从内核模块写入物理内存

时间:2013-03-06 13:07:52

标签: c memory module kernel interrupt

在内核模块中,我需要通过向物理内存的地址写入“零”来处理中断。

首先,我应该通过像“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;
}

然而,当中断到来并且中断处理程序开始处理它时,内核崩溃 (内核BUG at mm / vmalloc.c:numberofline)

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

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

1 个答案:

答案 0 :(得分:4)

直接来自Linux ioremap.c

  

如果你iounmap和ioremap一个区域,其他CPU将不会看到这个   改变直到下一个上下文切换。同时,(例如)如果是   中断进入其中一个需要新的CPU   ioremap'd区域被引用,CPU将引用旧的   区域。

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