为什么在中断上下文中执行的内核代码/线程无法休眠?

2024-01-15

我正在阅读罗伯特·洛夫(Robert Love)撰写的以下文章

http://www.linuxjournal.com/article/6916 http://www.linuxjournal.com/article/6916

说的是

“...让我们讨论一下工作队列在进程上下文中运行的事实。这与其他下半部机制形成对比,这些机制都在中断上下文中运行。在中断上下文中运行的代码无法休眠或阻塞,因为中断上下文没有用于重新调度的后备进程。因此,因为中断处理程序不与进程关联,所以调度程序没有任何东西可以进入睡眠状态,更重要的是,调度程序没有任何东西可以唤醒......”

我不明白。 AFAIK,内核中的调度器是O(1),即通过位图实现的。那么是什么阻止调度程序将中断上下文置于睡眠状态并获取下一个可调度进程并将控制权传递给它呢?


那么是什么阻止调度程序将中断上下文置于睡眠状态并获取下一个可调度进程并将控制权传递给它呢?

问题是中断上下文不是一个进程,因此不能进入睡眠状态。

当中断发生时,处理器将寄存器保存到堆栈上并跳转到中断服务程序的开头。这意味着当中断处理程序运行时,它在中断发生时正在执行的进程的上下文中运行。中断正在该进程的堆栈上执行,当中断处理程序完成时,该进程将恢复执行。

如果您尝试在中断处理程序中休眠或阻塞,那么您不仅会停止中断处理程序,还会停止它中断的进程。这可能很危险,因为中断处理程序无法知道被中断的进程正在做什么,或者即使挂起该进程是否安全。

可能出现问题的一个简单情况是中断处理程序与其中断的进程之间出现死锁。

  1. Process1进入内核模式。
  2. Process1获得LockA.
  3. 发生中断。
  4. ISR 开始执行使用Process1的堆栈。
  5. ISR 试图获取LockA.
  6. ISR调用sleep等待LockA即将面世。

此时,你陷入了僵局。Process1在 ISR 完成其堆栈之前,无法恢复执行。但 ISR 被阻塞等待Process1释放LockA.

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

为什么在中断上下文中执行的内核代码/线程无法休眠? 的相关文章

  • 如何更改 Linux 内核交换守护进程 (kswapd) 超时?

    我想通过使用闪存 SSD 等快速设备作为交换设备来减少 kswapd 超时以提高性能 您可以更改以下行为kswapd通过2种方式 通过Proc文件系统 From IBM 开发者工作坊 http www ibm com developerwo
  • tcp_max_syn_backlog 和 somaxconn 有什么区别?

    我一直在阅读一些关于 Linux 上的 TCP 实现的文章 我很困惑 它们之间有什么区别net ipv4 tcp max syn backlog and net core somaxconn和backlog作为参数传递给listen 系统调
  • 加载linux内核的基地址

    我对内核如何加载到内存有一些疑问 检查后 proc kallsyms我能够找到内核中各种符号的地址 cat proc kallsyms head n 10 00000000 t vectors start 80008240 T asm do
  • 加载内核模块时出现未知符号

    我需要帮助理解为什么在插入模块时出现错误 我努力了this http www linuxforums org forum kernel 56497 unkown symbol module error while insmodding bu
  • 为什么函数 printk() 不使用逗号来分隔参数?

    一个例子printk call printk KERN INFO Log message n 也许这个问题更多地是关于C的 因为我之前从未见过C中的函数可以不用逗号分隔参数 这是如何运作的 编译器如何处理这些信息 由于日志级别是一个整数 而
  • Linux Slab 分配器和缓存性能

    来自指南理解Linux内核第三版 第 8 2 10 章 板坯着色 从第 2 章我们知道 同一个硬件缓存行映射许多不同的 RAM 块 在这个 在本章中 我们还看到相同大小的对象最终存储在缓存中的相同偏移量处 不同板内具有相同偏移量的对象将以相
  • Linux用户空间线程、内核线程、轻量级进程

    我对所有这些实体以及它们在 Linux 中如何互连感到有点困惑 Unix 内部原理 一书指出lightweight process LWP 是内核支持的用户线程 并且该内核看不到进程内的线程 对于 Linux 来说仍然如此吗 据我了解 用户
  • 调试严重的 SIGILL 崩溃:文本段损坏

    我们的系统是基于 PowerPC 的运行 Linux 的嵌入式系统 我们遇到了随机的 SIGILL 崩溃 这种情况在各种应用程序中都会出现 崩溃的根本原因是将要执行的指令归零 这表明内存中的文本段已损坏 由于文本段是以只读方式加载的 因此应
  • 套接字对和一对无名管道有什么区别吗?

    我不仅想知道用户端的差异 还想知道 Linux 内核实现中的差异 共同部分 管道是单向的 因此需要两个管道才能进行双向通信 而套接字对是双向的 管道始终是面向流的 而套接字对可以是面向数据报的 套接字对正常AF UNIX套接字 这意味着辅助
  • 无法访问打开的/arch/x86/syscalls/syscall_32.tbl

    当我在切换到内核后编写此命令时 当我编译它时 它没有显示任何列表 是否有其他命令可以打开列表 open arch x86 syscalls syscall 32 tbl Bug 先删除 文件路径中的字符 应该是relative http e
  • ARM 系统调用的接口是什么?它在 Linux 内核中的何处定义?

    我读过有关 Linux 中的系统调用的内容 并且到处都给出了有关 x86 架构的描述 0x80中断和SYSENTER 但我无法追踪 ARM 架构中系统调用的文件和进程 任何人都可以帮忙吗 我知道的几个相关文件是 arch arm kerne
  • 从内核空间中的块设备读取

    我正在编写一个内核模块 需要从现有的块设备执行读取 dev 东西 有谁知道有任何其他模块可以执行这些操作 我可以用作参考吗 欢迎任何指点 Linux 2 6 30 如果你真的绝对必须那么使用filp open filp close vfs
  • modinfo srcversion:如何从我的源生成此版本?

    我有一个 Linux 模块的编译版本 然后我有大约 20 多个其源代码的变体 由于各种愚蠢的错误 我已经不知道哪个版本的源代码是我用来制作模块的实际版本了 我注意到modinfo
  • 这个反斜杠在这段汇编代码中起什么作用?

    我不确定这些推线有什么区别 修剪下来来自 Linux 的 x86 entry calling h https github com torvalds linux blob 241e39004581475b2802cd63c111fec43b
  • 同步 I/O 是否会使线程繁忙?

    假设我正在同步 I O 套接字上执行 I O 该套接字已准备好read or write手术 这意味着调用线程不会在操作上被阻塞 无论非阻塞 SOCK NONBLOCK 套接字的阻塞性质 但以下事情我不清楚 实际转移何时发生 当套接字标记为
  • 内存调试:如何获取 Linux 用户空间/内核空间中的锁定页面信息

    有什么方法可以获取Linux用户空间 内核空间中的锁定页面 虚拟内存页面 信息 我想了解详细信息 例如 谁锁定了页面 有多少页被锁定 进程名称 谁锁定了页面 还让我了解内核空间和用户空间的内存调试技术 对于内存中的每个页面 都会为其分配标志
  • 树莓派的设备树驱动内核

    我想用设备树驱动的 Linux 内核启动树莓派 有什么特别的事情要做吗 谁能指出为树莓派设置基于设备树的内核启动需要什么 我可能需要有树莓派内核源代码 其中设备驱动程序应与设备树兼容 如果是这样 我在哪里可以找到 Raspberry Pi
  • 设备树不匹配:.probe 从未被调用

    我无法理解设备树的工作原理 或者具体来说为什么该驱动程序无法初始化 这是在 android 版本 3 10 的 rockchip 供应商内核中 驱动程序 看门狗 rk29 wdt c 为了可读性而减少 static const struct
  • 在ubuntu内核中启用cgroup cpu实时运行时

    我正在尝试在 Ubuntu 18 04 上运行的 docker 容器中使用实时调度 我已经按照给定的方法安装了实时内核here https stackoverflow com questions 51669724 install rt li
  • 这些工作队列标志意味着什么?

    在研究工作队列时 我遇到了内核中定义的工作队列标志和常量 我有以下我无法理解的疑问 这里的排水和救援到底是什么意思 WQ DRAINING 1 lt lt 6 internal workqueue is draining WQ RESCUE

随机推荐