从内核模块写入物理内存
在内核模块中,我需要通过向物理内存的地址写入“0”来处理中断。
首先,我应该通过像“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 handledn");
return IRQ_HANDLED;
}
但是,当中断发生时,内核崩溃,中断处理程序开始处理它(内核BUG在mm / vmalloc.c:numberofline)
看来我的ioremap的使用有问题,或者我应该使用另一个“mmap的内核替代品”
请告诉我,如何解决这个问题?
直接从Linux ioremap.c
:
如果你映射和映射一个区域,其他CPU将不会看到这个变化,直到他们的下一个上下文切换。 与此同时,(例如)如果其他CPU中的一个需要引用新的ioremap'd区域,则CPU将引用旧区域。
这严格要求在中断服务程序中避免ioremap
调用。
上一篇: Write to physical memory from kernel module
下一篇: Determine if an element in an iframe is visible on the screen