C-从内核模块写入物理内存
在内核模块中,我需要通过向物理内存地址写入“零”来处理中断 首先,我应该通过诸如“mmap”之类的函数分配内存,但对于内核模块;例如,ioremapC-从内核模块写入物理内存,c,memory,module,kernel,interrupt,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 =
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)
看来我的ioremap使用有问题,或者我应该使用另一个“mmap的内核替代品”
请告诉我,如何解决这个问题?直接从Linux
ioremap.c
:
如果您iounmap和ioremap一个区域,其他CPU将看不到这一点
更改,直到下一次上下文切换。同时,如果
中断出现在另一个需要新CPU的CPU上
要引用的ioremap区域,CPU将引用旧的
地区
这要求避免在中断服务例程中调用
ioremap
。您是否尝试过在中断之外调用ioremap
?例如,在模块初始化代码中?@JoachimPileborg相同的代码在模块初始化中工作良好!然而,我在中断处理程序中需要这段代码。设备是否在物理地址空间中不断移动?那么为什么不能只建立一次必要的虚拟到物理映射,并且只执行p[0]=0代码>在ISR?亲爱的同事,我遇到了完全相同的问题,如果能在这里解释更多,我将很高兴!+。