【问题标题】:C - Write to physical memory from kernel moduleC - 从内核模块写入物理内存
【发布时间】: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:nu​​mberofline 处的内核BUG)

我对 ioremap 的使用似乎有问题,或者我应该使用另一个“内核替代 mmap”

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

【问题讨论】:

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

标签: c memory module kernel interrupt


【解决方案1】:

直接来自 Linux ioremap.c:

如果你 iounmap 和 ioremap 一个区域,其他 CPU 不会看到这个 更改直到他们的下一次上下文切换。同时,(例如)如果一个 中断来自需要新的其他 CPU 之一 ioremap'd 要引用的区域,CPU 将引用旧的 地区。

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

猜你喜欢
  • 2021-07-20
  • 1970-01-01
  • 2011-12-15
  • 1970-01-01
  • 1970-01-01
  • 2011-12-15
  • 2011-11-29
  • 1970-01-01
  • 2011-12-03
相关资源
最近更新 更多