Jon*_*ney 10 architecture operating-system driver interrupt dma
我对DMA和中断I/O之间的差异有点不清楚.(目前正在阅读操作系统概念,第7版).
具体来说,我不确定在任何一种情况下中断何时发生,并且在两种情况下在哪些点上CPU都可以自由地进行其他工作.我一直在阅读的东西,但不一定和解:
中断驱动
DMA
saw*_*ust 10
我对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完成中断.
在没有提供特定上下文的情况下讨论"中断",例如生成这些中断的来源和原因,可能是造成您混淆的原因.
- 控制器通过驱动程序初始化
- 控制器检查由驱动程序加载的寄存器以决定操作
- 从/向外设和控制器缓冲区的数据传输随之发生.
- 控制器发出中断时(每个字节读取?读取每个字?当缓冲区填满时?传输完成时?
- 我的理解是,当外围控制器I/O正在发生,并且控制器< - > MM I/O正在发生时,CPU没有做任何事情?
- 当传输完成或块填满时,CPU必须初始化从控制器缓冲区到MM的传输
我在你的问题中看到的一个问题是,你构成了一个模棱两可的配置.
你提到"外围设备","控制器",CPU和"MM"(也许是主存储器?).
从软件角度来看,外设连接可能是以下拓扑之一:
A. CPU < - >设备
B. CPU < - >控制器 - [设备或介质]
C. 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的衍生问题,请参阅基于中断的UART IO的Master
小智 5
在中断驱动 IO 的情况下,MCU 在每个字节或字上获得中断,具体取决于微控制器的功能。MCU 进入中断模式,为每个字节/字接收保留正常操作模式。这里MCU除了从IO读取数据并复制到内存之外不能做任何事情。
在 DMA 的情况下,DMA 执行与 MCU 在中断情况下执行的操作相同的操作。所以这里MCU可以自由地做其他事情。您可以根据需要中断的字节数配置 DMA。所以这里它与IO中断不同,因为MCU不会为每个字节或字获取中断;相反,仅当 DMA 接收到您配置的数据量时才从 DMA 获取中断。而且DMA已经将数据从IO复制到RAM,所以MCU也不需要费力去复制,节省了大量时间。
因此,如果您将 DMA 配置为在 1 KB 数据处中断,则您的 MCU 将获得 1 KB 的 1 个中断,否则如果使用中断驱动 IO,它将获得 1 K 中断。因此,与中断驱动 IO 相比,DMA 的使用减少了中断数量并提高了性能。
这就是为什么 DMA 主要用于需要频繁传输大块数据的情况。
| 归档时间: |
|
| 查看次数: |
18872 次 |
| 最近记录: |