抢占的中断处理程序会发生什么?

2024-02-01

即使在一些写得很好的内核书籍中,我也找不到以下问题的正确答案:

  1. 他们说 ISR 无法休眠,因为它无法重新调度 ISR,因为它没有与任何进程连接,那么当更高优先级的中断抢占正在执行的中断时会发生什么?中断的 ISR 不会再次重新调度(执行)?如果是,如何以及由谁来完成这项工作?

  2. 很多时候我们会禁用中断(例如:1.在临界区2.当执行快速中断时,它将禁用当前处理器中的所有中断),那么当中断被禁用时,正在发生的中断会发生什么?他们只是被丢弃了?或者将被存储在某个地方以供以后执行?如果是,在哪里以及如何?

  3. 当 ISR 正在执行时,它将禁用当前 IRQ 行中的中断以避免重入(防止同一行上的另一个 ISR 被执行),但为什么呢?如果 ISR 是可重入的,会出现什么问题?

*ISR=中断服务程序

*他们=书的作者


中断通过首先保存当前 CPU 状态并强制程序计数器 (PC) 跳转到中断向量表的位置来捕获从用户空间到内核的执行。然后,该表提供指向保存当前进程状态并将中断 ID 映射到 ISR 开头的内核函数(序列)的指针。当 ISR 期间发生更高优先级的中断时,会发生相同的事件序列,只不过正在运行的 ISR 和传入中断均由同一(内核)进程处理,因此没有进程进入睡眠状态。

如果禁用的话,新的中断当然会被忽略。但是,如果在处理器正在处理更高优先级的中断时启用中断,则该中断可能会处于挂起状态。

ISR 是内核空间内的函数调用,需要分配自己的堆栈。如果抢占次数过多,可重入中断可能会导致堆栈溢出。大多数内核(包括 Linux 和 Windows)都有固定的堆栈大小。

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

抢占的中断处理程序会发生什么? 的相关文章

  • ftrace:仅打印trace_printk()的输出

    是否可以只转储trace printk 输出于trace文件 我的意思是过滤掉函数跟踪器 或任何其他跟踪器 中的所有函数 一般来说 您可以在选项目录中关闭选项 sys kernel debug tracing options Use ls显
  • 为什么这段代码会死锁?

    我在可加载模块中创建了 2 个 Linux 内核线程 并将它们绑定到在双核 Android 设备上运行的单独 CPU 内核 运行几次后 我注意到设备重新启动并重置了硬件看门狗定时器 我一直在解决这个问题 什么可能导致僵局 基本上 我需要做的
  • 当 mov 指令导致页面错误并且在 x86 上禁用中断时会发生什么?

    我最近在自定义 Linux 内核 2 6 31 5 x86 驱动程序中遇到一个问题 其中 copy to user 会定期不将任何字节复制到用户空间 它将返回传递给它的字节数 表明它没有复制任何内容 经过代码检查 我们发现代码在调用 cop
  • 检测从内核扩展的文件复制

    我正在尝试构建 POC 该 POC 可以使用 fileop 范围回调来识别来自基于 kauth 的内核扩展的文件复制活动 但是 复制文件似乎涉及两个单独的身份验证操作 从中打开 src 文件并创建新文件 我的目标相当简单 在填充数据后检测新
  • java替代Thread.stop()来中断特定调用

    我正在寻找一种方法来告诉这个调用 大约需要 20 120 秒 final Area image final AffineTransform transform new AffineTransform transform scale imag
  • 我应该如何以非 root 身份读取 Linux 上的 Intel PCI 非核心性能计数器?

    我想要一个库 允许对 Linux 可执行文件的关键部分进行 自我分析 就像人们可以使用一个部分计时一样获取当日时间 http linux die net man 2 gettimeofday or RDTSC http www strchr
  • 这些工作队列标志意味着什么?

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

    我有一个在 RHEL6 x 64 位 上运行的多线程进程 我发现当我尝试启动该进程时 该进程挂起并且大多数线程 同一进程的 崩溃 有些线程等待线程之间的共享内存被创建 我可以看到所有的共享内存都没有被创建 但是当我使用 strace 时 进
  • 内核模块未加载(但 insmod 返回 0)

    我必须向现有设备 mips arch 添加一些功能 我已经尝试了几个 SDK 目前我取得了一些进展 但是 insmod 返回 0 成功 并且 lsmod 显示它们 但是 printk 和 create proc entry 都不起作用 但我
  • C 标准库函数与系统调用。哪个是“open()”?

    I know fopen 在C标准库中 所以我绝对可以调用fopen C 程序中的函数 我感到困惑的是为什么我可以打电话给open 功能也一样 open 应该是系统调用 所以它不是标准库中的C函数 因为我能够成功地调用open 函数 我调用
  • Thread.interrupt() 和 Thread.interrupted() 到底是如何工作的? [复制]

    这个问题在这里已经有答案了 从设置线程状态的角度来看 我不清楚这两种方法 Java 文档说 Thread interrupt 设置线程中断状态标志 调用 Thread interrupted 方法给出线程的状态并清除该标志 当这在实际场景中
  • 未找到 DEADLINE 调度策略

    我想在 C 中实现 DEADLINE 调度策略 我知道该功能已实现Linux 3 14 10我正在使用 Ubuntu 14 04Linux 3 17 0 031700 lowlatency 201410060605 SMP PREEMPT这
  • Windows 内核中可能的最大文件名长度

    我想知道 什么是longestWindows 内核允许的可能名称长度 例如 我知道内核使用UNICODE STRING结构来保存所有对象路径 并且由于宽字符字符串的字节长度存储在USHORT 允许最大路径长度为 2 15 1 个字符 有没有
  • 已编译 LKM 的互换性

    是否可以使用可加载内核模块 编译为3 0 8 mod unload ARMv5 我自制的内核 在具有版本的内核中3 0 31 gd5a18e0 SMP preempt mod unload ARMv7 安卓股票内核 该模块本身几乎不包含任何
  • 警告:Windows 调试器中的 [something] 与 [something] 重叠是什么意思?

    我正在为 uni 项目的一部分编辑 Windows Research Kernel WRK 有时当我启动运行我的内核的虚拟机时 Windows 调试器会显示如下内容 WARNING rdpdr overlaps raspptp baa740
  • linux新手关于嵌入式linux设备驱动的问题

    最近在研究linux驱动 正如我读过的那些文章所说 设备驱动程序模块很可能会根据内核的需要自动加载 因此我想知道内核如何确定为特定设备 声卡 I2C spi 设备 等 我也无法彻底想象内核如何在启动时检测每个硬件设备 与嵌入式linux相关
  • Linux 内核使用的设备树文件 (dtb) 可视化工具? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个可以图形化表示Linux内核中使用的硬件设备树的工具 我正在尝试了解特定 Arm 芯片组
  • 简单内核无法在 GRUB 中启动

    我正在学习一些操作系统开发的知识OSDev org http osdev org 我有一个内核 我正在尝试使用 qemu 在 GRUB Legacy 0 97 中启动 但是 当我输入kernel 200 9 我收到消息 Multiboot
  • ioctl 命令的用户权限检查

    我正在实现 char 驱动程序 Linux 并且我的驱动程序中有某些 IOCTL 命令仅需要由 ADMIN 执行 我的问题是如何在 ioctl 命令实现下检查用户权限并限制非特权用户访问 IOCTL 您可以使用bool capable in
  • Linux 中 m 标志和 o 标志将存储在哪里

    我想知道最近收到的路由器通告的 m 标志和 o 标志的值 从内核源代码中我知道存储了 m 标志和 o 标志 Remember the managed otherconf flags from most recently received R

随机推荐