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

时间:2017-06-29 09:23:36

标签: c memory system interrupt dma

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

我将表达我迄今所理解的内容,如果我是对的,我想得到一些反馈。

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

现在我有些疑惑,一旦我们遇到中断后台发生了什么?有什么开销? CPU需要设置什么?是否有上下文切换?中断处理程序如何工作?

CPU必须做一些工作才能处理中断,是否读取寄存器并将“消息”写入内存,以便用户查看?

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

正如您所看到的,我需要澄清一些内容。我将衷心感谢您的帮助。我知道所有这些问题的答案都可以写在一本书中,但我所需要的只是知道事情是如何联系起来的,以便直接了解幕后发生的事情,以便更容易地推理它。 / p>

1 个答案:

答案 0 :(得分:0)

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

当硬件收到中断时,它会暂停任何正在运行的进程(在该处理器上)的执行,推送堆栈上的进程状态(寄存器,标志,段)并执行ISR。

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

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

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

是的,这可以被认为是一个上下文切换,但它实际上并不是因为没有加载其他进程。在完成一项更重要的工作之前,可以将其视为暂停。

虽然这有一些开销,但是在键盘中断(ISR非常小)等频繁中断的情况下并不多,而且这些中断也很少发生。

但是说有一个硬件可以做非常规则的工作间隔。像磁盘读/写或网卡。在这种情况下,一次又一次地中断将是非常昂贵的。

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

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