中断处理程序中的 ioread32 导致内核恐慌

问题描述 投票:0回答:0

晚安,

我正在尝试为共享 IRQ 线路编写一些 IRQ 处理程序。

本质上我只需要从设备内存中读取一些内存字即可。

为此,我使用

mem = ioremap_nocache(addr, 8);
(我只需要 8 个字节)。然后从处理程序调用。

irqreturn_t do_sample_irq() {
    int val;
    val = ioread32(mem); // I know this is only 4 Bytes, but it is ok.
    printk(KERN_INFO, "%k\n.");
    return (irqreturn_t) IRQ_HANDLED;
}
irqreturn_t sample_irq_handler() {
    irqreturn_t ret;
    spin_lock_irq(&lock);
    ret = do_sample_irq();
    spin_unlock_irq(&lock);
    return ret;
}

然后,每当我插入模块时,都会立即出现内核恐慌:内核不同步:致命异常中断上下文。

我的猜测是我没有使用正确的同步技术,但我无法设计什么(开发内核模块任务中的新功能)。

发生了什么事?

c linux-kernel kernel embedded-linux
© www.soinside.com 2019 - 2024. All rights reserved.