进程如何以编程方式连接到中断?

进程如何以编程方式连接到中断?

我知道中断是发送到内核请求处理的信号。在某些情况下,我们有一个物理设备,例如带有驱动程序的键盘,该驱动程序将进程与中断(按下按键)连接起来。但是计时器或其他没有物理设备的东西呢?也许我对这一切的想法是错误的,如果有人纠正我,我会很高兴。

答案1

从一个角度来看:在 Linux 系统下运行的任何代码(包括微代码)或多或少都是某些硬件中断的直接结果。

从相反的角度来看:没有硬件中断会立即运行除内核在其硬件中断处理程序中的内部烹饪之外的任何其他内容。这有趣的部分(从用户态的角度理解)将是推迟供某个内核线程稍后处理。

是什么负责选择应该选择哪个线程来运行? : 调度程序!

这是对您的问题的可能理解的第一个答案:调度程序是将进程链接到中断的组件,因为:

  • 它最终将启动内核线程(ksoftirqd或任何IRQ专用的ktrhead是系统启动的IRQ线程)来处理不同的部分,这些部分会顺便标记一些待处理的事件,
  • 然后它最终将启动正在等待该特定事件的休眠任务。

答案2

从用户空间来看,中断在道德上相当于一个信号。进程可以设置信号处理程序,其功能与中断处理程序极其相似。大多数定时器都是通过 SIGALARM 来处理的。从历史上看, sleep() 可以通过警报或等待的系统调用来实现。

一些键盘 I/O 通过信号进行处理。例如,ctrl-c生成SIGINT(2),但大多数键盘I/O并不是这样完成的。

大多数设备(例如键盘)都作为文件进行处理。通常,进程要么通过 read() 调用等待 I/O 完成(并且基本上进入睡眠状态,直到内核调度程序看到 I/O 已完成并将其唤醒),要么轮询打开的文件以查找设备在做其他事情之间,或者它给内核一个文件列表并调用 poll() 或类似的东西来等待其中一个完成 I/O 或超时到期。

此外,键盘(技术上是 tty)I/O 可以使用 termios 库进行专门处理,该库可以调整内核缓冲用户输入的方式,以便 read() 返回完整的行或单个字符或字符块超时。 (termios 和 stty 还可以调整或禁用生成 3-4 个键盘可生成信号的按键。)

有多种类似的机制可以在流程中进行交互。信号可以中断 poll(),并且像 poll() 和 read() 这样的系统调用可以在信号处理程序之后中断或恢复。

相关内容