我有点不清楚 DMA 和中断 I/O 之间的区别
DMA 和中断之间的差异是虚假的,因为它们不是对立的概念。
DMA 和中断是正交的概念,并且这两个概念通常一起使用。
DMA 的替代方案是编程 I/O,又名 PIO。
中断的替代方法是轮询。
中断驱动
您需要更具体地说明您所指的内容。
如果系统不使用中断,则必须使用轮询来检测设备状态的变化。
PIO 通常使用中断(来自设备)来启动每个字节/字数据传输。这有助于减轻 PIO 的 CPU 密集型特性。否则,轮询 PIO 传输将完全消耗 CPU 资源。
但将“带中断的 PIO”简单地称为“中断”或“中断驱动”是不准确且具有误导性的。
DMA 传输几乎总是采用completion interrupt
(来自 DMA 控制器)通知 CPU 缓冲区传输已完成。
轮询 DMA 完成情况(而不是使用完成中断)会给 CPU 带来负担,而 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
-
与上面相同,只是控制器能够将数据从其缓冲区直接传输到 MM,而无需 CPU 干预。
-
这是否意味着 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 主控 https://stackoverflow.com/questions/38119491/master-for-interrupt-based-uart-io/38155310#38155310