当前位置: 首页 > 知识库问答 >
问题:

设备驱动程序中的中断处理

终彬郁
2023-03-14

我写了一个简单的字符驱动程序,并要求在gpio引脚上的IRQ,并为它编写了一个处理程序。

err=request_irq(irq,irq_handler,IRQF_SHARED|IRQF_TRIGGER_RISING,INTERRUPT_DEVICE_NAME,raspi_gpio_devp);

静态irqreturn_tirq_handler(int irq, space*arg);

现在从理论上我知道,在中断时,中断控制器会告诉处理器调用do_IRQ(),这将检查IDT并调用我的中断处理程序。

内核如何知道中断处理程序是针对这个特定的设备文件

我还知道中断处理程序不会在任何进程上下文中运行。但假设我正在访问在处理程序范围外声明的任何变量,一个静态全局标志=0,在处理程序中,我使标志=1,指示发生了中断。该变量位于流程上下文中。所以我很困惑这个处理程序如何不在任何流程上下文中修改流程上下文中的变量。

谢谢

共有3个答案

商业
2023-03-14

以下是回答你的问题:-

内核如何知道中断处理程序是针对这个特定的

>

对于设备驱动程序的实例化,必须在设备树条目中提及相同的中断号。

设备驱动程序常用的探测函数解析设备树数据结构,读取IRQ号,并使用register_irq函数注册处理程序。

如果单个IRQ号/行有多个设备,则可以在IRQ处理程序中使用IRQ状态寄存器(如果映射在相同的VM空间下,则针对不同的设备)来区分。

蓝飞
2023-03-14

内核不知道中断属于哪个设备。单个中断可以在多个设备之间共享。以前这很常见。由于中断控制器中中断支持的改进和消息信号中断的引入,这种情况变得不那么严重了。您的驱动程序必须确定中断是否来自您的设备(即您的设备是否需要服务)。

您可以通过提供的“void*arg”为中断处理程序提供上下文。这永远不应该是特定于进程的上下文,因为进程可能会退出,留下悬空的指针(即引用已释放和/或可能为其他目的重新分配的内存)。

全局变量不是“在流程上下文中”。它是在每一个上下文中——或者如果你愿意的话,没有上下文。当您听到“不在进程上下文中”时,这意味着几件事:(1)您不能阻止/睡眠(因为您将使哪个进程处于睡眠状态?)(2)您不能对用户空间虚拟地址进行任何引用(因为这些引用指向什么?)(3)您不能对“当前任务”进行引用(因为没有或不知道)。

通常,驱动程序的中断处理程序将数据推送或拉入“驱动程序全局”数据区,驱动程序的进程上下文端可以从该数据区/向该数据区传输数据。

丁淇
2023-03-14

内核不知道这个特定的中断是针对特定设备的。

它唯一知道的是它必须调用irq\u handler,并将raspi\u gpio\u devp作为参数。(如下所示:irq\u处理程序(irq、raspi\u gpio\u devp))。

如果您的irq线路是共享的,您应该检查您的设备是否生成了irq。代码:

int irq_handler(int irq, void* dev_id) {
    struct raspi_gpio_dev *raspi_gpio_devp = (struct raspi_gpio_dev *) dev_id;
    if (!my_gpio_irq_occured(raspi_gpio_devp))
        return IRQ_NONE;
    /* do stuff here */
    return IRQ_HANDLED;
}

中断处理程序在中断上下文中运行。但是您可以访问在中断范围之外声明的静态变量。

通常,中断处理程序所做的是:

  • 检查中断状态
  • 从硬件中检索信息并将其存储在某处(例如缓冲区/fifo)
  • wake\u up()等待该信息的内核进程

如果你真的想对中断处理的做和不做有信心,最好的阅读内容是什么是内核的进程。

罗伯特·洛夫(Robert Love)的《Linux内核开发》(Linux Kernel Development)是一本关于这方面的好书。

 类似资料:
  • 更新时间:2019-04-16 19:04:41 各种不同的设备在不同的操作系统使用时,可能需要单独安装对应的驱动程序。为了方便用户,Hacklab提供了支持的部分开发板串口驱动程序下载及安装信息,请根据使用的开发板和PC OS下载对应的驱动程序。 串口芯片驱动 CP210x 下载地址 使用该串口驱动的开发板包括: ST Nucleo F412ZG esp32devkitc(Board类型可选择E

  • 问题内容: 谁能解释我, 什么啊 这有什么用途? 如何使用? 为什么我不能定义与之功能相同的新功能? 问题答案: 一个,表示“输入- 输出控制”是一种特定于设备的系统调用。Linux(300-400)中只有几个系统调用,不足以表示设备可能具有的所有独特功能。因此,驱动程序可以定义一个ioctl,它允许用户空间应用程序向其发送订单。但是,ioctl并不是很灵活,并且会变得有些混乱(数十个“魔术数字”

  • 问题内容: 如何使用打开,关闭,ioctl等功能为i2c设备制作字符设备?最近两周我一直在寻找有关它的信息,找不到任何有效的方法。我在Essential LinuxDevice Drivers中找到了一些信息,但是它是针对2.6内核编写的,我使用3.4.79(我正尝试在cubian distr上为cubieboard2编写此驱动程序),因此本书有许多不推荐使用的功能,我试图在那里写我的驱动程序,但

  • 操作系统其中一个目的就是向用户掩盖系统硬件设备的特殊性。例如,虚拟文件系统呈现了安装的文件系统的一个统一的试图,而和底层的物理设备无关。本章描述 Linux 核心是如何管理系统中的物理设备的。 CPU 不是系统中唯一的智能设备,每一个物理设备都由它自己的硬件控制器。键盘、鼠标和串行口由 SuperIO 芯片控制, IDE 磁盘由 IDE 控制器控制, SCSI 磁盘由 SCSI 控制器控制,等等。

  • Device Drivers 设备驱动程序 Generic Driver Options 驱动程序通用选项.[提示]Linux Kernel Driver DataBase网 站是搜索驱动程序与硬件型号对应关系的绝佳网站.如果你不知道某个驱动(例如"CONFIG_INTEL_IOATDMA")究竟对应着哪些型号的硬件, 那么可以直接根据该驱动选项的首字母(本例是"I")进入对应的索引页去查找到该驱

  • Valentino Vaschetto 和 Wylie Stilwell. 10.1. 概述 本章介绍了编写ISA设备驱动程序相关的一些问题。这儿展示的伪代码 相当详细,很容易让人联想到真正的代码,不过这依然仅仅是伪代码。 它避免了与所讨论的主题无关的细节。真实的例子可以在实际驱动程序的 源代码中找到。ep和aha 更是信息的好来源。 10.2. 基本信息 典型的ISA驱动程序需要以下包含文件: