【发布时间】:2013-02-21 07:03:02
【问题描述】:
在内核模块中,我需要通过向物理内存地址写入“零”来处理中断。
首先,我应该通过诸如“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 处的内核BUG)
我对 ioremap 的使用似乎有问题,或者我应该使用另一个“内核替代 mmap”
请告诉我,如何解决这个问题?
【问题讨论】:
-
您是否尝试过在中断外部调用
ioremap?例如。在模块初始化代码中? -
@JoachimPileborg 相同的代码在模块初始化中运行良好! O_O 但是,我在中断处理程序中需要这段代码
-
设备是否一直在物理地址空间中移动???
-
那你为什么不能只建立一次必要的虚拟到物理映射,并且只在 ISR 中做
p[0]=0;? -
亲爱的同事,我遇到了完全相同的问题,如果能在这里解释更多,我会很高兴!
标签: c memory module kernel interrupt