繁体   English   中英

Linux 使用什么指令来指示 Intel CPU 设置 DMA 传输?

[英]What instruction does Linux use to direct Intel CPU to setup a DMA transfer?

我知道设备驱动程序可以使用 kernel api 来设置传输方向、计数等,但我想了解 api 使用什么 CPU 指令来通知 cpu 启动此 DMA 传输?

在大多数情况下,每个设备都内置了自己的 DMA/总线主控功能; 并且设备驱动程序使用设备的 DMA/总线主控(以“设备特定”方式)而不涉及任何 kernel API。 在这些情况下,通常操作系统会阻止其他代码使用设备的寄存器(通过拒绝访问 IO 端口或不将“内存映射的 IO 寄存器”映射到普通代码可以使用的区域); 因此其他代码也无法使用设备的 DMA/总线主控。

在极少数情况下,特定设备中没有内置 DMA/总线主控功能; 但它们本身是一个单独的设备。 这包括 PC 中古老的“DMA controller 芯片”和一些更现代的设备(例如“Intel Quickdata IO 加速器”)。 在这些情况下; 您可能有其他设备驱动程序可以使用的 DMA 引擎的设备驱动程序。 某种“DMA 引擎特定”接口,或者它可能(如果硬件非常常见)“更集成”到 kernel 中(这样“DMA 引擎驱动程序代码”内置到 kernel 和“DMA 引擎特定接口”更像是一个 kernel API)。

另请注意:

a) 对于现代计算机,几乎所有软件都使用虚拟地址,但硬件设备只能使用物理地址。 这意味着在某些时候需要将虚拟地址(对于一个虚拟地址空间)转换为设备可以使用的物理地址。

b) 对于现代操作系统,设备驱动程序通常将数据直接传输到属于某个进程(在用户空间中)的 memory 或从其传输数据。 在这些情况下,设备驱动程序需要确保内核的虚拟 memory 管理不会干扰传输(例如,确保 kernel 不能/不会将 RAM 的内容发送到交换空间并释放 RAM,而设备正在传输数据)。 通常,设备驱动程序通过要求 kernel 在启动 DMA/总线主控之前“固定”虚拟 memory(并在之后要求 kernel “取消固定”)来执行此操作。

c) 对于现代计算机,可能涉及到 IOMMU。 如果 IOMMU 被用于增强安全性(而不仅仅是用于虚拟化或“通过”); 那么设备驱动程序可能需要在开始任何 DMA/总线主控之前要求 kernel 配置 IOMMU(如果没有,IOMMU 硬件可能会拒绝允许设备传输数据)。 在某些情况下,IOMMU 也可用于 IO 重新映射以修复/避免设备的限制 - 例如,如果设备只能使用 32 位地址但需要与 64 位地址之间传输数据,则 IO MMU 可以配置为将一个区域重新映射到设备支持的地址范围(并防止设备驱动程序需要使用 RAM 中的“反弹缓冲区”,其中数据在 DMA 传输之前复制到该临时缓冲区或复制出临时缓冲区DMA传输后)。

由于这些原因; kernel 可以提供设备驱动程序在开始 DMA/总线主控传输之前和 DMA/总线主控传输完成后使用的接口; 但这不应被视为设置 DMA/总线主控传输本身的一部分。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM