中断和DMA,后台发生了什么?

Interrupt and DMA, what happens in the background?

我正在尝试了解系统如何处理中断,以及如果系统中集成了 DMA,它将如何工作。

我就把目前理解到的说一下吧,我说的对不对,希望大家多多反馈。

为了让系统捕捉到某些设备执行的 I/O 操作,系统使用了所谓的中断。 系统为给定的操作设置中断(我们感兴趣的是,例如在键盘上打字),一旦执行了操作,系统就会捕获它。

现在我有些疑惑,一旦我们捕捉到中断,后台会发生什么?间接费用是多少? CPU 需要设置什么?有上下文切换吗?中断处理程序如何工作?

CPU必须做一些工作才能处理中断,它是否读取寄存器并在内存中写入"message",以便用户看到它?

如果我们有一个 DMA,相反,一旦 CPU 捕捉到中断,它就不需要处理设备的内存访问,因此它可以执行其他事情,直到 DMA 中断 CPU 告诉他传输已完成并且 CPU 可以安全地关闭处理?

如您所见,有些事情我需要澄清一下。我将衷心感谢您的帮助。我知道所有这些问题的答案都可以写在一本书中,但我所需要的只是知道事物之间的联系,对幕后发生的事情有直觉,以便更容易地推理它。

中断由称为中断服务例程 (ISR) 的东西处理。这些是由内核实现并向硬件注册的功能。每种类型的中断都在一个单独的处理程序中注册。

当硬件接收到中断时,它会停止执行任何 运行 进程(在该处理器上),将进程的状态(寄存器、标志、段)压入堆栈并执行 ISR .

除了保存上下文,硬件还做了一件更重要的事情。它将处理器上下文更改为特权模式(下环)。这当然是在处理器已经不在 Ring 0 中并且 ISR 需要特权操作的情况下。中断描述符Table(IDT)中有一个标志,它告诉处理器它是用户模式异常还是特权模式异常。

由于这些 ISR 是由内核编写的,因此它们是可信的。这些 ISR 执行任何需要的操作,例如在键盘中断的情况下,它将字节读取移动到前台进程的输入流中。

ISR 完成后(由 X86 上的 iret 指令发出信号),程序的状态被弹出,进程继续执行。

是的,这可以被认为是上下文切换,但实际上不是,因为没有加载其他进程。它可以被认为是暂停,直到完成更重要的工作。

虽然这会产生一些开销,但对于像键盘中断这样频繁的中断(ISR 非常小)而且这些中断非常罕见的情况下开销并不大。

但是说有一个硬件做作业是非常有规律的间隔。比如磁盘read/write或者网卡。这种情况下,一而再再而三的打断,代价会很大。

所以我们使用的是DMA(直接内存访问)。处理器为这些硬件分配一些物理内存。他们可以在不停止进程的情况下访问这部分 RAM,因为不需要处理器的干预。

他们继续做他们需要的所有 IO,但最后当工作完成时(或者如果失败),他们用一个中断向处理器发出信号。