可以在执行时修改中断处理程序代码吗?

Can an interrupt handler code be modifyed at execution time?

答案是 "no" 可能是个愚蠢的问题,但这在理论上可行吗?我想知道为什么不呢?

我不知道为什么...

"interrupt handlers"有几种不同的类型。

首先,硬件 IRQ 处理程序在 OS 加载驱动程序等时被修改。

第二,软件中断处理程序,用于调用现代 OSes 中的 OS 级服务。

那些是有硬件支持的(在整个计算机上,或在处理器内)。

第三种没有硬件支持,是 "signal handlers"(在 UNIX 中),它们基本上是 OS 级别并且与 OS 事件相关。

它们之间的共同概念是响应是可编程的。这个想法是你知道你希望你的 software/OS 如何响应它们,所以你添加必要的代码来服务它们。从这个意义上说,它们是 "modifiable at runtime".

但是这些事情是有规定的。首先,您不想浪费太多时间来处理它们,因为无论您对它们做什么,都可以防止在处理它们时发生其他中断(相同或较低优先级)。 (例如,您不希望在处理完第一个中断之前处理一个中断并为相同的事情获得另一个中断,因为中断处理程序可以执行其他情况下需要锁定的操作(加载和例如,增加环形队列上的当前或最后一个指针)并且如果它重新进入会破坏状态。)

因此,通常中断处理程序只做他们需要做的最少的事情,并为软件设置一个标志,以识别一旦退出中断模式就需要对其进行处理。

历史上,DOS 和其他未受保护的 OSes 允许软件随意修改中断 tables。当理解中断应该如何工作的人对它们进行编程时,这很有效,但也很容易用它们完全搞砸系统的状态。这就是为什么现代的、受保护的 OSes 通常不允许用户软件修改中断 tables。 (如果你 运行 作为驱动程序处于内核模式,你可以这样做,但这仍然不是一个好主意。)

但是,UNIX 允许用户软件更改其进程的信号处理程序。这通常是为了允许(例如)SIGHUP 告诉 Apache 重新加载其配置文件。

修改 OS 使用的中断 table 修改系统上所有软件 运行 的 table。这通常不是用户 运行 安全 OS 特别想要的东西,如果他们想保持系统的安全性的话。