在内核模块中,我需要通过向物理内存的地址写入“零”来处理中断。
首先,我应该通过像“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的内核替代品”
请告诉我,如何解决这个问题?
答案 0 :(得分:4)
直接来自Linux ioremap.c
:
如果你iounmap和ioremap一个区域,其他CPU将不会看到这个 改变直到下一个上下文切换。同时,(例如)如果是 中断进入其中一个需要新的CPU ioremap'd区域被引用,CPU将引用旧的 区域。
这要求避免在中断服务程序中调用ioremap
。