Linux内核中断处理程序互斥保护?

2024-04-03

我是否需要保护我的中断处理程序被同一中断多次调用?

鉴于以下代码,我不确定应该进行的系统调用。我在当前的实现中遇到了罕见的随机死锁:-

void interrupt_handler(void)
{
    down_interruptible(&sem);  // or use a lock here ?

    clear_intr(); // clear interrupt source on H/W

    wake_up_interruptible(...);

    up(&sem); // unlock?

    return IRQ_HANDLED;
}

void set/clear_intr()
{
    spin_lock_irq(&lock);
    RMW(x); // set/clear a bit by read/modify/write the H/W interrupt routing register
    spin_unlock_irq(&lock);
}

void read()
{
    set_intr();  // same as clear_intr, but sets a bit
    wait_event_interruptible(...);
}
  1. Should interrupt_handler:down_interruptible be spin_lock_irq / spin_lock_irqsave / local_irq_disable?
  2. Should set/clear_intr:spin_lock_irq be spin_lock_irqsave / local_irq_disable?
  3. 它(硬件 -> 内核 -> 驱动程序处理程序)能否继续生成/获取中断直到其被清除?可以吗interrupt_handler在里面时不断接到电话吗?
  4. 如果当前实现的中断处理程序是可重入的,那么它会阻塞在down_interruptible?

来自LDD3:-

must be 可重入的——它必须能够同时在多个上下文中运行。


编辑1)经过一些很好的帮助后,建议是:-

  1. remove down_interruptible从内部interrupt_handler
  2. Move spin_lock_irq外部设置/清除方法(不需要spin_lock_irqsave你说?)我实在看不出这样做有什么好处?!

Code :-

void interrupt_handler(void)
{
    read_reg(y); // eg of other stuff in the handler

    spin_lock_irq(&lock);

    clear_intr(); // clear interrupt source on H/W

    spin_unlock_irq(&lock);

    wake_up_interruptible(...);

    return IRQ_HANDLED;
}

void set/clear_intr()
{
    RMW(x);
}

void read()
{
    error_checks(); // eg of some other stuff in the read method

    spin_lock_irq(&lock);

    set_intr();  // same as clear_intr, but sets a bit

    spin_unlock_irq(&lock);

    wait_event_interruptible(...);

    // more code here...
}

编辑2)阅读更多SO帖子后:阅读为什么在中断上下文中执行的内核代码/线程无法休眠? https://stackoverflow.com/q/1053572/119790链接到罗伯特·洛夫斯article http://www.linuxjournal.com/article/6916,我读到了这个:

一些中断处理程序(已知 Linux 作为快速中断处理程序)运行 所有中断都在本地 处理器已禁用。这样做是为了 确保中断处理程序运行 不间断,尽快 可能的。更何况,全部中断 处理程序以其当前运行 所有中断线均禁用 处理器。这确保了两个 相同的中断处理程序 中断线不运行 同时。它还可以防止设备 驱动程序编写者不必处理 递归中断,这使情况变得复杂 编程。

我启用了快速中断(SA_INTERRUPT)!所以不需要互斥/锁/信号量/旋转/等待/睡眠/等等!


不要在中断上下文中使用信号量,使用spin_lock_irqsave反而。引用LDD3:

如果你有一个自旋锁,可以 由运行在(硬件 或软件)中断上下文,你 必须使用 spin_lock 的一种形式 禁用中断。正在做 否则可能导致系统死锁, 迟早。如果您不访问 你的锁在硬件中断中 处理程序,但您可以通过软件来完成 中断(在代码中运行完 tasklet,例如,涵盖的主题 在第 7 章中),您可以使用 spin_lock_bh 以安全地避免死锁 同时仍然允许硬件 需要服务的中断。

至于第2点,让你的set_intr and clear_intr要求调用者锁定自旋锁,否则你会发现你的代码死锁。再次来自LDD3:

为了使您的锁定正常工作, 你必须写一些函数 假设他们的来电者有 已经获取了相关的锁。 通常,只有你内部的、静态的 函数可以这样写; 从外部调用的函数必须 显式处理锁定。当你 编写内部函数,使 关于锁定的假设,自己做 (以及与您一起工作的任何其他人 代码)一个忙并记录这些 明确的假设。它可以是非常 几个月后很难再回来 弄清楚你是否需要持有 锁定以调用特定函数或 不是。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux内核中断处理程序互斥保护? 的相关文章

  • 使用 gatttool 或 bluepy BLE 订阅通知

    我正在使用 bluepy 编写一个程序 用于监听蓝牙设备发送的特征 我还可以使用任何库或语言 唯一的限制是在 Linux 上运行 而不是在移动环境中运行 似乎仅在移动设备中广泛使用 没有人在桌面上使用 BLE 使用 bluepy 我注册了委
  • 在Linux伪终端中执行从一个终端发送到另一个终端的字符串

    假设我有一个终端 其中 tty 的输出是 dev pts 2 我想从另一个终端向第一个终端发送命令并执行它 使用 echo ls gt dev pts 2 仅在第一个终端中打印 ls 有没有办法执行字符串 不 终端不执行命令 它们只是数据的
  • Nasm 打印到下一行

    我用 nasm Assembly 编写了以下程序 section text global start start Input variables mov edx inLen mov ecx inMsg mov ebx 1 mov eax 4
  • bash双括号问题

    我对 bash 脚本非常陌生 在使用双括号时遇到了问题 我似乎无法让它们在 Ubuntu Server 11 10 中工作 我的下面的脚本位于 if test sh 中 bin bash if 14 14 then echo FOO fi
  • 在64位操作系统上以32位模式和64位模式编译ioctl函数的执行有什么不同?

    我有 64 位 Enterprise SuSE 11 我有一个应用程序 它打开 HIDRAW 设备并在其上操作 ioctl 函数以从该设备获取原始信息 如下所示 struct hidraw devinfo devinfo int fd op
  • 在键盘热插拔上加载模块

    我正在尝试学习如何为 Linux 系统编写模块和驱动程序 类似于this https unix stackexchange com questions 120839 usb kernel module does not load on de
  • Bash 中 $() 和 () 之间的区别

    当我打字时ls l echo file 支架的输出 这只是简单的回显 被获取并传递到外部ls l命令 就等于简单的ls l file 当我打字时ls l echo file 我们有错误 因为不能嵌套 内部外部命令 有人可以帮助我理解之间的区
  • 有关 Linux 内存类型的问题

    关于Linux内存我有以下问题 我知道活动内存是最常访问的内存部分 但是有人可以解释一下 linux 如何考虑将内存位置用于活动内存或非活动内存 主动存储器由哪些部分组成 磁盘 文件缓存是否被视为活动内存的一部分 有什么区别Buffers
  • 尝试映射大页面 (1GB) 时 mmap 失败

    我做了什么 使用 root 启用大页 我的系统支持 1MB 大页 echo 20 gt proc sys vm nr hugepages 将大页文件系统挂载到 mnt hugepages mount t hugetlbfs nodev mn
  • 我在哪里可以学习如何使 C++ 程序与操作系统 (Linux) 交互

    我是一个 C 初学者 我想创建与操作系统交互的小程序 使用 Kubuntu Linux 到目前为止 我还没有找到任何教程或手册来让 C 与操作系统交互 在 PHP 中 我可以使用命令 exec 或反引号运算符来启动通常在控制台中执行的命令
  • 使用 sed 将 old-link-url 替换为 new-link-url

    我正在 bash 中编写一个脚本 将 old link url 替换为 new link url 我的问题是 sed 由于斜杠而无法替换 url 如果我只输入一些文字就可以了 my code sed e s old link new lin
  • 无法访问打开的/arch/x86/syscalls/syscall_32.tbl

    当我在切换到内核后编写此命令时 当我编译它时 它没有显示任何列表 是否有其他命令可以打开列表 open arch x86 syscalls syscall 32 tbl Bug 先删除 文件路径中的字符 应该是relative http e
  • 原生 Linux 应用程序可像 ResHacker 一样编辑 Win32 PE

    我想运行自动修改 dll服务 用户提交特定的 dll 我在服务器上修改它 然后用户可以下载 dll的修改版本 是否有任何本机 Linux 应用程序提供常见的 Win32 PE 修改功能 例如图标 字符串 加速器 对话等 至少提供命令行或脚本
  • 在中断时获取 current->pid

    我正在Linux调度程序上写一些东西 我需要知道在我的中断到来之前哪个进程正在运行 当前的结构可用吗 如果我在中断处理程序中执行 current gt pid 我是否可以获得我中断的进程的 pid 你可以 current gt pid存在并
  • 编写多个mysql脚本

    是否可以在复合脚本中包含其他 mysql 脚本 理想情况下 我不想为包含的脚本创建存储过程 对于较大的项目 我想分层维护几个较小的脚本 然后根据需要组合它们 但现在 我很乐意学习如何包含其他脚本 source是一个内置命令 您可以在 MyS
  • gdb 错误 - 文件不是可执行格式:无法识别文件格式

    我正在尝试使用 gdb 调试某个名为 xdf 的程序 但是当我运行 gdb xdf 时 出现以下错误 home nealtitusthomas X ray astronomy heasoft 6 24 x86 64 pc linux gnu
  • Xenomai 中的周期性线程实时失败

    我正在创建一个周期性线程 它在模拟输出上输出方波信号 我正在使用 Xenomai API 中的 Posix Skin 和 Analogy 我使用示波器测试了代码的实时性能 并查看了方波信号 频率为 1kHz 的延迟 我应该实现 250us
  • 如何仅将整个嵌套目录中的头文件复制到另一个目录,在复制到新文件夹后保持相同的层次结构

    我有一个目录 其中有很多头文件 h 和其他 o 和 c 文件以及其他文件 这个目录里面有很多嵌套的目录 我只想将头文件复制到一个单独的目录 并在新目录中保留相同的结构 cp rf oldDirectory newDirectory将复制所有
  • 如何在 Linux x86_64 上模拟 iret

    我正在编写一个基于 Intel VT 的调试器 由于当 NMI Exiting 1 时 iret 指令在 vmx guest 中的性能发生了变化 所以我应该自己处理vmx主机中的NMI 否则 guest会出现nmi可重入错误 我查了英特尔手
  • 使用命令行将 MediaWiki 维基文本格式转换为 HTML

    我倾向于编写大量文档 因此 MediaWiki 格式对我来说很容易理解 而且比编写传统 HTML 节省了我很多时间 然而 我也写了一篇博客 发现一直从键盘切换到鼠标来输入正确的 HTML 标签会增加很多时间 我希望能够使用 Mediawik

随机推荐

  • 仅当变量为空时才分配变量

    在 Ruby 上有这样的东西 var value 基本上 这意味着 var将被分配 value 除非 var尚未分配 例如 如果 var is nil 我正在 Kotlin 上寻找相同的东西 但到目前为止 最接近的是 elvis 运算符 有
  • 为什么 Jekyll Remote_theme 的 `_config` 文件中的站点变量不可访问?

    According to this https jekyllrb com docs themes pre configuring theme gems40 Jekyll will read in a config yml at the ro
  • python -m:查找模块规范时出错

    根据 python 文档 m标志应该执行以下操作 在 sys path 中搜索指定模块并执行其内容 main module 当我简单地运行我的脚本时python命令 一切正常 由于我现在想从更高级别导入某些内容 因此我必须使用以下命令运行脚
  • Elasticsearch:在关闭数据节点之前撤出所有数据?

    有没有办法告诉节点删除其所有数据 将其分散回其他节点 以便我可以将其关闭 并且在其关闭后不处理重新平衡 重新复制 如果每个分片有 2 个副本 并且删除了一个节点 则某些分片现在只有 1 个实时副本 必须重新复制 如果可以的话 我宁愿在任何一
  • C# 文件创建 - 如何授予 IUSR DELETE?

    我有一个用 C 编写的控制台程序 它在用户 foo 下运行 该程序创建一个文件 在某些情况下 在 IUSR 下运行的 Web 应用程序需要能够删除控制台应用程序创建的文件 我想在创建文件时向 IUSR 授予 DELETE 或任何等效的操作
  • 在 Unity 2D 中拖动对象

    我正在寻找 Unity 2D 的对象拖动脚本 我在网上找到了一个很好的方法 但它似乎只能在Unity 3D中工作 这对我来说不好 因为我正在制作 2D 游戏 而且它不会以这种方式与 墙 发生碰撞 我尝试将其重写为 2D 但使用向量时遇到了错
  • -1.#IND000 在 Visual Studio 调试窗口中意味着什么?

    在Visual Studio 2010监视窗口中 我发现变量的值变成了 1 IND000 这是什么意思 IND 是 Windows 系统中 NaN Not a Number 的表示 IND 不确定形式 主要是非法运算的结果 例如除以零或无穷
  • 在 drupal 中为自定义块创建自定义模板文件

    创建自定义 tpl 文件来为自定义块设置主题的 drupal 方法是什么 具体来说 我尝试以编程方式创建一个块 然后找到一种方法将视图代码与模块 php 代码分开 如果它是一个页面 Drupal theme 将是实现这一目标的非常有效的方法
  • HRegionServer 显示“错误告诉主机我们已经启动”。显示套接字异常:参数无效

    我正在尝试在 3 台 centos 机器上创建一个 hbase 集群 Hadoop v 2 8 0 已启动并在我配置的 HBase v 1 2 5 上运行 Hbase 启动正常 它启动了 HMaster 和区域服务器 但仍然在区域服务器和
  • 各个队列是否可以有死信队列

    目前 我的 ActiveMQ 服务器中有一个名为hello world 每当消息处理失败时 ActiveMQ 都会创建一个名为的默认目录ActiveMQ DLQ 是否可以将该名称更改为类似的名称hello world DLQ 原因是我将来可
  • 将 NPM 包与 Rust 和 Webassemble 结合使用

    有没有办法在 Rust 代码中使用 npm 包和 webassemble 现在使用此模板中已存在的 webpack wasm tool wasm pack plugin 和 wasm bindgen 箱 https github com r
  • 有没有办法重定向到 register_shutdown_function 中的错误页面?

    我试图找到一种干净的方法来处理致命和关键错误 即没有输出缓冲 并且我读到在 register shutdown function 中使用 HTTP 标头是不可能的 问题是 当发生严重错误 例如 服务不可用 时 我想重定向到通用静态错误页面
  • Android Studio 创建新项目时卡住

    安装 Android Studio 并更新到 0 5 9 后 当我尝试创建一个新项目时 在浏览完所有菜单后 我卡在带有进度条的屏幕上 上面写着 正在构建 project name Gradle 项目信息 我让它在那里静置了近 10 分钟 什
  • 复制赋值运算符应该通过常量引用传递还是通过值传递?

    在 C 11 之前 复制赋值运算符始终应通过 const 引用传递 如下所示 template
  • 为什么 TTime 比较会产生意外结果?

    我观察到一些关于EncodeDateTime and EncodeTime方法 我正在寻求一些解释 procedure SomeTestCase var time TTime dateTime TDateTime begin time En
  • 在 PHP 中使用一个站点用于多个域

    我有一个网站完全为一个客户工作 现在我有更多的客户想要为他们复制相同的内容 有什么办法可以使用这个网站作为基本网站 因为我计划从该域访问这个网站并提供每个客户的数据库 我正在使用 PHP 和 MYSQL 感谢您的支持 在此过程中我也感谢您的
  • 服务参考返回值大小问题

    我有一个返回对象列表的 Web 服务方法List
  • 如何在 WPF DependencyProperty 检索上放置断点?

    如何创建 WPF 时触发的断点检索我的自定义 DependencyProperty 的值是多少 我第一次写这个问题很糟糕 https stackoverflow com questions 57417213 why is my breakp
  • 使用 imshow() 时,图像未在 Google Colab 中显示

    我正在开发一个需要 OpenCV 函数来绘制图像的项目 我正在尝试在 Google Colab 中使用以下代码显示图像 但输出中没有显示任何内容 有人能帮我解决这个问题吗 pylab notebook import cv2 testim i
  • Linux内核中断处理程序互斥保护?

    我是否需要保护我的中断处理程序被同一中断多次调用 鉴于以下代码 我不确定应该进行的系统调用 我在当前的实现中遇到了罕见的随机死锁 void interrupt handler void down interruptible sem or u