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 的相关文章

  • 存储徽章标准的最佳方式?

    我一直在考虑如何在新网站上实现类似于SO的徽章功能 存储徽章标准的最佳方式是什么 两个想法 All code 第二系统 创建一个元架构来定义徽章及其标准 在数据库中存储一些信息 并让代码查询它以找出徽章及其标准 还有更好的方法吗 Rules
  • 如何建立一个类似Jira的SaaS网站?

    任何人都知道如何构建单租户 SaaS 应用程序 例如 Jira Wordpress com 等 其中每个客户都有一个单独的站点 但托管在公司服务器上 网络上似乎有很多关于多租户 SaaS 应用程序以及如何在 Heroku Openshift
  • Minix 与 Linux 相比如何学习操作系统设计?

    我想学习操作系统设计 我想知道在此过程中我是否应该解决 Minix 或 GNU Linux 问题 我喜欢书籍 所以我主要关注一本书 尽管视频资源 大概是录像讲座 也很受欢迎 我已经正式学习了 C 和 C 可以用它们编写中小型程序 我对数据结
  • 哪种语言(在 JVM 上运行)最适合创建 DSL?

    我们需要创建复杂的固定长度和可变长度字符串 这些字符串可能代表客户资料 订单等 你们建议使用哪种基于 JVM 的编程语言 想法是让最终用户使用此 DSL 创建字符串 所以我正在寻找验证 代码完成等 Groovy http docs code
  • MVP 和 GWT 小部件之间的通信

    如果我将 MVP 模式与 GWT 结合使用 如 2009 年 Google I O 中的 GWT 架构最佳实践讨论 但已将信息分散到多个小部件中 那么应该如何填充值对象 假设我有一个 EditPersonView Presenter 一个
  • 由于 system.out.println 语句导致运行线程延迟[重复]

    这个问题在这里已经有答案了 在下面的代码中 如果我在 for 循环内使用 sysout 语句 则代码将执行并在满足条件后进入循环内部 但如果我不在循环内使用 sysout 语句 则无限循环将继续进行 而不会进入 if 条件 即使if 条件满
  • 呈现模型与被动视图

    我想知道上述两种模式之间的区别 当您考虑到您需要在表示模型模式中同步代码并且该代码位于表示模型本身中时 那么我认为这些模式非常相似 两者都将事件委托给演示模型 演示者 演示模型和演示者命令域模型 并且也观察域模型 当发生更改时 它们都与视图
  • 缓冲区溢出(与)缓冲区溢出(与)堆栈溢出[重复]

    这个问题在这里已经有答案了 可能的重复 堆栈溢出和缓冲区溢出有什么区别 https stackoverflow com questions 1120575 what is the difference between a stack ove
  • 如何以 REST方式发送 HTML 表单?

    我有一个名为 事实 的资源集合的 URI 以及该集合中每个 事实 资源的 URI 我相信 创建新 事实 的表单应该使用 GET 来请求 但我无法确定应该将其设置为哪个 URI 对集合 URI 的 GET 应返回 事实 资源 URI 的列表
  • 您会在新的商业项目中使用 S#arp 架构吗?

    The S arp 架构 http code google com p sharp architecture 看起来真的很酷 但是您是否认为它仍然太新而无法在重要的新项目中做出承诺 我们假设该项目乍一看很适合它 It all seems非常
  • 如果物理内存的大小是2^32-1,那么虚拟内存的大小是多少?

    我知道物理地址是 32 位长 但是如何通过这些信息找出虚拟内存的大小 虚拟内存地址空间的总大小为2 32x86架构和更大 目前约为 2 48 x64建筑学 然而 操作系统通常会保留一部分空间 因此 32 位应用程序不一定能一次寻址 4GB
  • 这叫什么类型的建筑?

    对于我当前正在开发的 Web 应用程序 ASP NET MVC 我们采用以下架构 Data Access Layer 将数据持久保存到任意数据库的逻辑 Domain 数据模型 Service Layer 业务逻辑 例如订单处理 账户管理等
  • 在 Codeigniter 中使用/嵌入 Ember js

    我即将开始开发一个 Web 应用程序 使用 Ember js 作为前端技术 使用 Codeigniter 作为后端 我遇到的问题是如何在 codeigniter 中嵌入或使用 ember js 可以通过 Web 服务从 codeignite
  • QuickBlox:arm64 架构的未定义符号

    我使用 Xcode 6 4 并使用 cocoapods 安装了 QuickBlox 框架 使用该框架后 我收到一些错误 例如 Undefined symbols for architecture arm64 OBJC CLASS QBSet
  • 如何查找或计算Linux进程的页表大小和其他内核占用?

    我怎样才能知道 Linux 进程页表有多大 以及任何其他可变大小的进程统计 如果您真的对页表感兴趣 请执行以下操作 cat proc meminfo grep PageTables PageTables 24496 kB
  • Alsa 带有来自调制解调器的 PCM 接口

    我有一个基于 imx28 CPU 的定制板 CPU 的串行端口连接到调制解调器的 PCM 输出 我必须为调制解调器的 PCM 接口开发一个驱动程序 使其成为 ALSA SoC 的一部分 您能指出内核树 中与我的设置重新组合的一些驱动程序吗
  • 当IRQL下降时,Windows中如何触发软件中断?

    我知道对于硬件中断 当 KeAcquireInterruptSpinLock 调用 KeLowerIrql 时 HAL 会调整 LAPIC 中的中断掩码 这将允许自动服务排队的中断 可能在 IRR 中 但是对于软件中断 例如 ntdll d
  • “if”在 ASP.NET MVC View (.aspx) 文件中被认为有害?

    我记得看到一个博客 或其他内容 说你不应该在 ASP NET MVC 的 aspx 文件中使用 但我不记得它说的替代方案是什么 有人记得看过这个并指出我吗 基本上 这意味着您的视图中不应该有大量的 if 语句 您的控制器和视图模型应该能够处
  • 没有 FPU 的处理器中的浮点计算

    是否可以在没有浮点单元的嵌入式处理器中执行浮点运算 是的 您只需要在软件中完成即可 你的编译器可能会提供支持 http gcc gnu org onlinedocs gccint Soft float library routines ht
  • 服务作为 SOA 中的中介

    我知道什么是 通常的 中介设计模式 维基百科中有一些描述 http en wikipedia org wiki Mediator pattern http en wikipedia org wiki Mediator pattern 在我的

随机推荐

  • 如何设置内置输入(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 在什么时候可以自由地执行其他工作 我一直在读但不一定能调和的东西 中断驱动 通