我对DMA和中断I / O之间的差异有点不清楚。 (目前正在阅读操作系统概念,第7版)。
具体来说,我不确定在任何一种情况下中断何时发生,并且在两种情况下,CPU都可以自由地执行其他工作。我一直在阅读的内容,但不一定能够和解:
中断驱动
DMA
答案 0 :(得分:9)
我对DMA和中断I / O之间的差异有点不清楚
DMA和中断之间的差异是假的,因为它们不是相反的概念 DMA和中断是正交概念,并且这两个概念通常一起使用。
DMA的替代方案是编程I / O,即PIO 中断的替代方法是轮询。
中断驱动
您需要更具体地了解您所指的内容 如果系统没有使用中断,则必须使用轮询来检测设备状态的变化。
PIO经常使用中断(来自器件)来启动每个字节/字数据传输。这有助于减轻PIO的CPU密集型特性。轮询的PIO传输否则将完全消耗CPU资源 但要通过中断来引用" PIO"只是"中断"或"中断驱动"是不准确和误导。
DMA传输几乎总是使用completion interrupt
(来自DMA控制器)来通知CPU缓冲区传输已完成。
轮询DMA完成(而不是使用完成中断)会给DMA带来负担,DMA应该减轻负担。我见过一个启动DMA传输的引导加载程序,然后轮询完成。但这是一个可以承受繁忙等待的单一任务环境,而操作系统需要最大化CPU可用性。这意味着使用DMA完成中断。
讨论"中断"没有提供具体的背景,例如生成这些中断的原因和原因可能是造成你混淆的原因。
- 通过驱动程序初始化控制器
- 控制器检查由驱动程序加载的寄存器以决定操作
- 随之而来的是来自/到外围设备和控制器缓冲区的数据传输。
- 控制器发出中断时(每个字节读取?读取每个字?当缓冲区填满时?传输完成时?
- 据我所知,当外围设备< - >时,CPU没有做任何事情。正在进行控制器I / O,并且控制器< - > MM I / O正在发生?
- 当传输完成或块填满时,CPU必须初始化从控制器缓冲区到MM的传输
醇>
我在问题中看到的一个问题是,您构造的模糊不清 你提到了一个"外围设备",一个"控制器",CPU和" MM" (也许主要的记忆?)。
从软件角度来看,外围设备连接可能是以下拓扑之一:
一个。 CPU< - >设备
B中。 CPU< - >控制器 - [设备或介质]
℃。 CPU< - >总线 - 设备
D. CPU< - >总线 - 控制器 - [设备或介质]
连接A代表CPU可以直接访问的设备,例如串行端口的本地UART。硬件实现中可能涉及总线,但它们对软件不可见。
连接B代表通过设备控制器与CPU连接的设备,例如, MultiMediaCard(MMC)控制器到SD卡和IDE(集成磁盘控制器)磁盘驱动器。与A不同,CPU必须仅与设备控制器接口,而不是与设备本身接口。控制器与其设备之间的交互通常不受CPU控制,并且最低限度地监控(如果有的话)。存在控制器以简化CPU与其设备之间的接口。
连接C和D代表CPU可以通过总线(例如USB,SPI或SATA)间接访问的设备或其控制器,例如USB转以太网适配器或SPI NOR闪存。需要通过总线传输对设备或其控制器的命令。例如,磁盘控制器的ATAPI命令必须通过SATA控制器传输。与A不同,总线控制器是CPU必须直接执行I / O的接口。
所以#3和#5a无关紧要。 CPU不参与。此外,您无法概括控制器到设备接口,因为它对每个外围子系统都是唯一的。一个控制器可以只缓冲一个字节,而另一个控制器将缓冲整个块以验证ECC。
DMA
与上述相同,只是控制器能够在没有CPU干预的情况下将数据从其缓冲区直接传输到MM。
这是否意味着CPU仅在整个传输完成时被中断,或者在控制器缓冲区填满时是否仍然中断?
- 醇>
唯一的区别是CPU不再需要等待控制器< - > MM I / O,但是当控制器缓冲区填满时仍然需要中断?或者DMA是否也将其隐藏在CPU中?
这些场景和问题几乎没有意义。转移的方向未指定,即CPU执行读或写操作)。
DMA传输几乎总是使用completion interrupt
(来自DMA控制器)来通知CPU缓冲区传输已完成。
当控制器缓冲区填满" 而未指定此数据的来源时,您反复使用短语"如果您要询问设备到控制器的I / O,那么这种I / O通常是CPU最不关心的问题,状态指示是控制器特定的。
您似乎在询问有关块类型的转移。理解块传输并不一定能够理解基于字符的I / O. 有关基于字符的(UART)I / O的衍生问题,请参阅Master for Interrupt based UART IO
答案 1 :(得分:2)
让我用简单的话来说明你的理解。
代表直接内存访问的DMA是一种系统,其中计算机的硬件组件可以访问内存总线并控制传输。说CD / DVD驱动器通常使用DMA工作。但请记住,CPU总是掌握一切,这意味着即使CPU给DMA控制器提供了主控权,它仍然有权检查DMA。它可以随时重新调用总线控制,它甚至可以完成DMA的任务。 有些寄存器用于设置从CPU到DMA和DMA到CPU的总线控制。 DMA控制器完成后,它可能会中断或通知CPU它已完成其工作。那是关于DMA的。
现在进入中断I / O.中断I / O比DMA更频繁。一个过程通常经历I / O很多次。要求用户输入的是中断I / O.不是DMA。有两种类型的中断。
每个中断都分配了一个特殊编号。每个中断都由Interupt Routine(一个简单的函数)提供服务,该函数保存在RAM中的某个位置,并从一个由中断号组成的表中调用。我告诉你这个是为了你的理解。 当您在键盘上移动鼠标或键入时,它实际上是正在发生的中断。
答案 2 :(得分:1)
在中断驱动IO的情况下,MCU在每个字节或字上获得中断取决于微控制器的便利性。 MCU进入中断模式,为每个字节/字接收保持正常工作模式。除了从IO读取数据并复制到内存中之外,MCU无法做任何事情。
在DMA的情况下,DMA执行的操作与MCU在中断情况下完成的操作相同。所以这里MCU可以自由地做任何其他事情。您可以配置DMA需要中断的字节数。所以这里它与IO中断不同,因为MCU没有为每个字节或字获得中断;只有在收到已配置的数据量时才从DMA中获取中断。 此外,DMA已将数据从IO复制到RAM,因此MCU也无需为复制工作,节省了大量时间。
因此,如果您将DMA配置为以1 KB的数据进行中断,则MCU将获得1个1 KB的中断,否则如果使用中断驱动的IO则会获得1 K的中断。 因此,与中断驱动的IO相比,使用DMA可减少中断次数并提高性能。
这就是为什么当需要频繁传输大块数据时,主要使用DMA。