DMA 与中断驱动的 I/O

2024-01-09

我不太清楚 DMA 和中断 I/O 之间的区别。 (当前正在阅读操作系统概念,第 7 版)。

具体来说,我不确定在这两种情况下何时会发生中断,以及在这两种情况下 CPU 在什么时候可以自由地执行其他工作。我一直在读但不一定能调和的东西:

中断驱动

  1. 通过驱动程序初始化控制器
  2. 控制器检查驱动程序加载的寄存器以决定操作
  3. 随后发生来自/到外设和控制器缓冲区的数据传输。
  4. 控制器在以下情况下发出中断(在读取每个字节时?在读取每个字时?缓冲区填满时?传输完成时?
  5. 据我了解,CPU 没有在执行任何操作both外设 控制器 I/O 正在发生,并且控制器 MM I/O 正在发生?
  6. 当传输完成或块填满时,CPU 必须初始化从控制器缓冲区到 MM 的传输

DMA

  1. 与上面相同,只是控制器能够将数据从其缓冲区直接传输到 MM,而无需 CPU 干预。
  2. 这是否意味着 CPU 仅在整个传输完成时才会中断,还是在控制器缓冲区填满时仍会中断?
  3. 唯一的区别是 CPU 不再需要等待控制器 MM I/O,但当控制器缓冲区填满时仍然必须中断?或者 DMA 也向 CPU 隐藏了这一点吗?

我有点不清楚 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。

讨论“中断”而不提供具体上下文,例如产生这些中断的来源和原因可能是造成您困惑的原因。

  1. 通过驱动程序初始化控制器
  2. 控制器检查驱动程序加载的寄存器以决定操作
  3. 随后发生来自/到外设和控制器缓冲区的数据传输。
  4. 控制器在以下情况下发出中断(在读取每个字节时?在读取每个字时?缓冲区填满时?传输完成时?
  5. 据我了解,当外设 控制器 I/O 发生且控制器 MM I/O 发生时,CPU 没有执行任何操作?
  6. 当传输完成或块填满时,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

  1. 与上面相同,只是控制器能够将数据从其缓冲区直接传输到 MM,而无需 CPU 干预。

  2. 这是否意味着 CPU 仅在整个传输完成时才会中断,还是在控制器缓冲区填满时仍会中断?

  3. 唯一的区别是 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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DMA 与中断驱动的 I/O 的相关文章

  • 内核模式下的线程(和进程)与用户模式下的线程(和进程)有什么区别?

    我的问题 1 书中现代操作系统 它说线程和进程可以处于内核模式或用户模式 但没有明确说明它们之间有什么区别 2 为什么内核态线程和进程的切换比用户态线程和进程的切换花费更多 3 现在 我正在学习Linux 我想知道如何在LINUX系统中分别
  • Windows CE 与嵌入式 Linux [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 现在我确信我们都清楚 Linux 与 Windows 桌面的相对优点 然而 我对嵌入式开发世界的了解却少得多 我主要对行业解决方案感兴
  • 使用嵌入qt的mysql?

    我正在尝试使用嵌入 QT 的 mysql 我已经有一个与 mysqld 链接的 Qt mysql 插件 该插件可以很好地加载嵌入式数据库 但 QT 没有简单的方法来设置 dataDir 等嵌入式选项 我在这里看到 http doc qt i
  • 使用 C# 使用 INF 文件安装 libusb 驱动程序

    我想在 Windows 安装程序安装过程中安装第三方 libusb 驱动程序 我使用 Visual Studio 2010 创建了此安装 我尝试使用 SetupAPI 和 DifXAPI 通过命令行安装此驱动程序 但没有任何反应 我预计会弹
  • 您对“大规模 C++ 软件设计”的看法 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 正在阅读亚马逊评论 https rads stackoverflow com amzn click com 0201633620 and ACC
  • Web 应用程序架构 - 需要作业/任务队列吗?

    我目前正在设计一个 Web 应用程序 该应用程序将允许用户安排将针对 HTTP API 代表他们 执行的任务 这些任务可以重复出现 并且可用于调度的最小时间分辨率为一分钟 由于任务的性质 我认为异步执行它们是有意义的 但是 这部分的架构应该
  • 无法在 Windows 7 上安装 Android USB 驱动程序

    所以我想使用我的新 Nexus 5 来调试我的应用程序 我尝试通过以下方式安装 Android USB 驱动程序装置经理 http developer android com tools extras oem usb html Win7但我
  • 有人还在使用客户端服务器架构吗[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我编写软件已有几十年了 现在一切都是网络 在网络出现之前 我们拥有的客户端服务器应用程序基本上是直接与数据库对话的胖客户端应用程序 它
  • JavaFX 中的 MVC 模式与场景生成器

    我是 JavaFX 新手 根据我当前的设置 正在努力创建合适的 MVC 架构 我使用 Scene Builder 单击了一个 UI 并指定了一个 Controller 类 Startup public class Portal extend
  • 如何设置 Hibernate 读取/写入不同的数据源?

    使用 Spring 和 Hibernate 我想写入一个 MySQL 主数据库 并从基于云的 Java Web 应用程序中的另一个复制从属数据库中读取数据 我找不到对应用程序代码透明的解决方案 我真的不想更改我的 DAO 来管理不同的 Se
  • 在使用实体框架的分层架构中,我应该从 BLL 返回 POCO 类吗? (需要架构指导)

    我可能读得太多了 并且遭受了一些信息超载的困扰 所以我希望得到一些明确的指导 根据我收集的信息 我可以使用 VS2010 的 T4 模板来生成不直接与 EF 绑定的 POCO 类 我会将这些放在他们自己的项目中 而我的 DAL 将有一个 O
  • 如何获取过滤器驱动程序中当前进程映像文件的全名?

    在过滤器驱动程序中我可以调用IoGetCurrentProcess得到一个PEPROCESS结构 然后调用PsGetProcessImageFileName获取文件名 我的问题是我怎样才能得到full过程映像文件的名称 您可以使用ZwQue
  • 什么时候应该构建 Web 应用程序而不是胖客户端?

    我想听听其他人关于何时应该构建 Web 应用程序而不是构建胖客户端的建议 在过去的几年中 我参与了多次关于是否应该使用 Web 浏览器界面构建应用程序 或升级旧应用程序 的讨论 通常这些是组织内使用的内部系统 而不是大众市场的收缩包装产品
  • 软件堆栈和操作系统有什么区别?为什么Android不是操作系统而是软件堆栈?

    Android 是一个软件堆栈 但不是一个操作系统 正如developer android com所述 什么是安卓 Android 是一个适用于移动设备的软件堆栈 包括操作系统 中间件和关键应用程序 这 Android SDK 提供了开始开
  • 良好的类似 STL 的 C 库 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 对于具有向量 双端队列 堆栈 哈希图 树形图 集合等数据结构的 C 语言来说 有哪些好的库 请使用纯 C 并且与平台无关 The Glib
  • 无法理解Peterson算法的正确性

    我在这里讨论彼得森算法的一个场景 flag 0 0 flag 1 0 turn P0 flag 0 1 turn 1 while flag 1 1 turn 1 busy wait
  • ISR(中断服务例程)中的信号量同步

    我有一个队列 当不同的中断发生时 会调用队列的 put 和 pull 函数 在这种情况下有没有办法防止竞争情况 虽然我们不能在中断服务例程中等待信号量 但创建类似功能的最佳方法是什么 我们使用 Zynq FPGA 的 ARM Cortex
  • 如何使用汇编获取BIOS时间?

    我正在从头开始实现一个小型操作系统 用于教育目的 现在 我想使用汇编来获取 BIOS 时间 我对此进行了很多搜索 但找不到任何代码示例来执行此操作 如果有人可以提供任何参考或代码示例或与此相关的任何内容 我将非常感激 See 时钟中断 1a
  • 获取微过滤器驱动程序中的文件路径

    我使用了下面的代码 但它给了我文件路径的结果 status FltGetFileNameInformation Data FLT FILE NAME OPENED FLT FILE NAME QUERY ALWAYS ALLOW CACHE
  • 使用os.execlp时,为什么`python`需要`python`作为argv[0]

    代码是这样的 os execlp python python child py other args this works os execlp python child py other args this doesn t work 我读过

随机推荐

  • 如何设置内置输入(OSX Core Audio / Audio Unit)的输入电平(增益)?

    我有一个 OSX 应用程序 它使用音频单元记录音频数据 音频单元的输入可以设置为任何可用的输入源 包括内置输入 问题是 我从内置输入获得的音频经常被削波 而在 Audacity 甚至 Quicktime 等程序中 我可以调低输入电平 但不会
  • PYTHONPATH 不适用于 GNU/Linux 上的 sudo(适用于 root)

    编辑 适用于 root sudo 是问题所在 参见下文 我有一个包含我自己的库的目录 例如我的 Python 库位于 home name lib py 我已将此目录添加到Python 的路径对于所有用户 包括 root 添加以下行 etc
  • 半音阶乐器调音器的稳健算法? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 谁知道半音阶乐器调音器最强大的算法 我正在尝试编写一个乐器调音器 我尝试过以下两种算法 FFT 创建韦尔
  • 哪个 OpenSSL 版本支持 SHA256?

    我编写了一个 PHP 库 它使用openssl verify and openssl sign 使用 SHA256 我认为 SHA256 支持对于 PHP 和 OpenSSL 来说是一种新功能 但我不知道哪个版本开始支持 SHA256 这会
  • 将逗号分隔的字符串转换为单独的行

    我有一个这样的 SQL 表 SomeID OtherID Data abcdef cdef123 18 20 22 abcdef 4554a24 17 19 987654 12324a2 13 19 20 是否有一个查询可以执行类似的查询S
  • C++ 函数模板编译错误“‘containerType’不是模板”

    我正在尝试编写一个函数来 字符串化 参数以用于记录目的 例如 我想写这样的东西 vector
  • DirectX 或 OpenGL [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 如果您正在用 C 编写下一个 3D 图形密集型应用程序 例如 3D 建模和动画软件 那么哪一个是更好的选择 如果我们认为 C 是独立于平台的 那
  • 如何配置此 Spring-Boot 应用程序以使用 IAM 角色而不是密钥和机密?

    我有一个与 S3 和 SQS 通信的 Spring Boot 应用程序 它使用 AWS 密钥和机密工作得很好 但我发现我有一个限制 因为我不能使用这些凭证 而必须使用 IAM 实例角色进行身份验证 我没有运气让这个微小的改变发挥作用 我创建
  • 消息队列和共享内存的区别?

    我读了很多关于消息队列和共享内存之间差异的文章 但仍不清楚哪一种有利于获得良好的性能 就像共享内存应该比队列更好 但在同步它的情况下也存在性能问题 共享内存和消息队列都可以用来在进程之间交换信息 区别在于how他们被使用了 共享内存正如您所
  • 如何在 Vim 中的 html 标签之间粘贴内容?

    紧迫p将内容粘贴到当前行下方 dit删除 html 标签内的内容 如何在 html 标签内粘贴内容 Nor here p I want to paste something here p Not here 我通常只是这样做vitp它直观地选
  • VS 2010可以自动检查/更新头文件吗?

    这几乎就是我的问题 VS 2010 可以自动检查和更新 C 代码中的头文件吗 VS 2010可以自动从头文件生成cpp文件 从而节省您从头文件复制函数定义的时间吗 我的意思是 它是否可以认为某些方法没有实现 并从头文件中找到的声明生成一个空
  • 量角器可以慢速运行吗?

    有没有办法缓慢运行使用量角器编写的 Angular E2E 测试 以便我可以观察正在发生的情况 以下是我的解决方案 所以基本上我为当前控制流创建了一个装饰器execute函数 现在在每个排队操作之前额外排队 100 毫秒的延迟 这需要在调用
  • Spring MVC @ResponseBody 返回一个列表

    我们想创建一个 WebService 它返回特定对象的列表 我们想通过 apache http 客户端库从另一个 java 程序调用这个 Web 服务 此时 如果我们从 Firefox 中调用 Web 服务 则会出现 406 错误页面 我们
  • Spring 安全和 JSON 身份验证

    我在 spring spring mvc 中有一个完全使用 JSON 通信的应用程序 现在我需要通过 JSON 使用 spring security 3 使用 LdapAuthenticationProvider 对我的应用程序进行身份验证
  • Doctrine 2.0 中未加载延迟加载属性

    我正在使用 PHP 和 Doctrine 2 0 所有实体都工作正常 除了下面详细介绍的实体关系 或者其他实体在我没有注意到的地方失败 考虑以下实体 Entity class Target ManyToOne targetEntity k
  • 根据浏览器应用不同的 CSS 宽度属性? (IE8、FF)

    我必须将宽度应用于 div 宽度值需要根据浏览器的不同而变化 我无法应用条件 css 那么有什么办法可以做到这一点吗 FF apply width 720px IE8 apply width 690px 可以使用一些技巧将它们组合起来 以便
  • 如何在Android中注册睡眠事件?

    我正在开发 Android 3 0 我需要在我的应用程序中知道设备何时进入睡眠 关闭屏幕 我如何注册此意图 事件 以便在发生这种情况时我能够运行一些操作 BroadcastReceiver 中是否有任何通知此操作的操作 This http
  • 图库中的图像自动旋转 - Android

    在我的 Android 应用程序中 我正在从设备库加载图像 在这方面 我面临着有关图像方向的问题 当我从图库加载高分辨率图像时 它们会自动旋转然后显示在我的视图中 我尝试了有关此问题的各种解决方案 但无法得到正确的解决方案 我提到获取方向
  • 如何正确转义 Makefile 的数据?

    我正在动态生成config mk带有将由 Makefile 使用的 bash 脚本 该文件的构造如下 cat gt config mk lt
  • DMA 与中断驱动的 I/O

    我不太清楚 DMA 和中断 I O 之间的区别 当前正在阅读操作系统概念 第 7 版 具体来说 我不确定在这两种情况下何时会发生中断 以及在这两种情况下 CPU 在什么时候可以自由地执行其他工作 我一直在读但不一定能调和的东西 中断驱动 通