Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C-从内核模块写入物理内存_C_Memory_Module_Kernel_Interrupt - Fatal编程技术网

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

C-从内核模块写入物理内存,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 =

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

首先,我应该通过诸如“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)

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


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

直接从Linux
ioremap.c

如果您iounmap和ioremap一个区域,其他CPU将看不到这一点 更改,直到下一次上下文切换。同时,如果 中断出现在另一个需要新CPU的CPU上 要引用的ioremap区域,CPU将引用旧的 地区


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

您是否尝试过在中断之外调用
ioremap
?例如,在模块初始化代码中?@JoachimPileborg相同的代码在模块初始化中工作良好!然而,我在中断处理程序中需要这段代码。设备是否在物理地址空间中不断移动?那么为什么不能只建立一次必要的虚拟到物理映射,并且只执行
p[0]=0在ISR?亲爱的同事,我遇到了完全相同的问题,如果能在这里解释更多,我将很高兴!+。