use*_*550 2 driver bus linux-kernel pci pci-e
有人可以列出使用主机总线的总线主控提供的最常见操作吗?我可以列举几个。。
1) GPU 通过 PCI-e(最近的 x86)使用总线控制将整个帧缓冲区传输到视频卡。
2) 以太网卡使用总线控制将接收到的数据包传输到主存储器。
3)我假设硬盘也使用总线控制来传输块。
在这种情况下,这些设备/驱动器什么时候使用总线主控,而不是 3rd 方 DMA?
最近,Linux 内核似乎开始支持 PCIe 中的 P2P DMA,设备之间直接通信。现在,P2P DMA 与常规总线主控 DMA 有何根本不同。我想,直到现在,总线主控仅被设备用于传输到由 DMA 子系统创建的缓冲区,并且它总是与主内存之间的往来,对吗?我猜,P2P Dma 是一种允许完全绕过主内存的规定。我还在某处读到过,高端游戏系统中的某些专有图形驱动程序正在使用此类规定,而 Linux 则是后来者。
有人可以提供对现代系统中可用的 DMA 种类的广泛概述,以及一些从概念上理解它们的方法(如果有的话)?
编辑:常规 DMA 更改为 3rd 方 DMA
TLDR:在像PCI-express这样的现代树状高速总线中,几乎所有连接到它的设备都能够启动内存访问事务(第一方 DMA)以从系统内存中进行读写。它们类似于古老的共享总线(如 PCI 或 ISA)的总线主操作。
有人可以列出使用主机总线的总线主控提供的最常见操作吗?
在具有高速外设接口(“总线”)的现代系统中,如 PCIe(它是树,而不是总线),最常见的操作是所谓的“内存写入”和“内存读取”操作,编码在 TLP 数据包中。(那里的一些例子:http : //xillybus.com/tutorials/pci-express-tlp-pcie-primer-tutorial-guide-1)
在具有多个设备连接到电气共享信号的古老公共总线(ISA,Conventional PCI)中,这可能有所不同。但是基本的驱动程序编写说明将起作用,例如来自LDD 书籍 Linux 设备驱动程序:https : //www.oreilly.com/library/view/linux-device-drivers/0596000081/ch13s04.html
1) GPU 通过 PCI-e(最近的 x86)使用总线控制将整个帧缓冲区传输到视频卡。
在最近的具有 PCIe 接口的显卡和GPU(原生 PCIe 或 PCIe 制成的集成 PCI 到 PCIe,或 AGP 到 PCIe 桥接芯片)中,帧缓冲区被集成到 GPU 本身中(https://en.wikipedia.org/wiki/Framebuffer “Modern视频卡在其内核中包含帧缓冲电路。”)。GPU不需要访问总线来输出帧,GPU就是显卡。(GPU 具有将当前帧图像从内部 GPU 内存转换为视频信号的电路:用于 VGA 或 DVI-A/-I 模拟信号的RAMDAC;用于 DVI-D、HDMI 和 DisplayPort 的 RAM 到 TMDS 或 LVDS 编码器。)
2) 以太网卡使用总线控制将接收到的数据包传输到主存储器。
是的,以太网卡中的以太网控制器(NIC) 会使用一些描述符和环将接收到的数据包写入系统内存,这些描述符和环是由操作系统中的网络驱动程序设置的。它还将执行驱动程序写入的传输描述符,并从系统内存中读取数据包头和数据包数据以传输数据包。这两个操作都是 DMA,操作的 DMA 引擎在网络控制器中(对于现代 PCIe 和 PCI 卡)。
3)我假设硬盘也使用总线控制来传输块。
硬盘未通过总线控制(真实或模拟)连接到任何总线。通常硬盘有PATA、SATA或SCSI接口连接到一些硬盘控制器或HBA,如PCI-to-SATA、PCIe-to-SATA一些控制器集成到南桥或其他类型。控制器将使用 DMA(和总线控制)在环外执行读写描述符。写入描述符的数据将由系统内存中的 DMA 读取;从磁盘读取的数据将通过 DMA 写入系统内存。操作的 DMA 引擎位于磁盘控制器中。
NVMe (NVM express) 固态磁盘(SSD) 直接连接到 PCIe 总线,每个此类磁盘中的 nvme 控制器都能够进行 DMA 读取和写入,由 nvme 驱动程序在 nvme 队列中使用 nvme 描述符进行编程。(nvme 概述:第 7 页用于队列,第 10 页用于 I/O 命令;第 21 页 - 控制器注册“门铃”,由驱动程序写入以通知 nvme 控制器新命令已发布到队列,第 45 页用于读取 io 命令,第 73 页用于写入命令)。
在这种情况下,这些设备/驱动器什么时候使用总线主控,而不是 3rd 方 DMA?
在现代 PCIe 系统的背景下,连接到总线的每个设备仅直接连接到具有高速全双工通道的单个端口(直接连接到主机 PCIe 端口或某个桥接器或交换机)。没有像旧PCI那样的电信号共享,也不需要将任何操作称为“总线主控”。当设备想要读取或写入系统(或任何其他)内存时,设备可以向接口发送内存读取或写入数据包 (TLP)。为了做一些有用的事情,设备有自己的集成 DMA 引擎,驱动程序将命令设备控制器对正确的内存地址(由驱动程序分配并在命令描述符中给出)执行操作。
总线主控仅由设备用于传输到由 DMA 子系统创建的缓冲区,并且它总是与主内存之间的往来,对吗?
是的,驱动程序通常使用主(系统)内存作为 DMA 操作的目标。
P2P Dma 是一种允许完全绕过主内存的规定
P2P DMA 是非常新的和罕见的功能。它可以与少量高成本的特殊高速 PCI-express 控制器一起使用,但可能不适用于典型的桌面系统。
在 P2P(点对点)dma 中,特殊驱动程序可以将一个设备指向同一 PCI-express 层次结构上的另一个(兼容)设备的内存资源进行 DMA 操作。此 p2p DMA 可用于发送大数据。系统内存可用于存储一些元数据或描述符,因此就像 95% 或 99% 的数据通过 P2P dma 发送,而 5% 或 1% 的元数据仍存储在系统内存中。
例如,有提议的驱动程序可以将数据从一个 nvme ssd 复制到另一个或使用 p2p dma 计算 GPU:* https://www.snia.org/sites/default/files/SDC15_presentations/nvme_fab/StephenBates_Donard_NVM_Express_Peer-2_Peer。 pdf * https://www.usenix.org/sites/default/files/conference/protected-files/atc17_slides_bergman.pdf * https://lwn.net/Articles/764716/(对等 PCI 内存在初始支持 NVMe 结构目标子系统的内核)
关于 CMB 和 PMR 缓冲区的一些信息:* https://www.flashmemorysummit.com/English/Collaterals/Proceedings/2018/20180808_SOFT-201-1_Bates.pdf * https://nvmexpress.org/wp-content/uploads/Session -2-Enabling-the-NVMe-CMB-and-PMR-Ecosystem-Eideticom-and-Mell ....pdf
PCIe 交换机(据我所知)将被配置为检测 p2p 内存读或写操作 (TLP) 的接收者,并将 TLP 数据包直接发送到正确的设备,而不是主机端口。内存访问 R/W (DMA) TLP 可能由访问地址路由(“表 3-5。PCI Express TLP 变体和路由选项”)。
通用p2p dma说明及p2p dma激活的一些问题:https : //spdk.io/doc/peer_2_peer.html
Peer-2-Peer (P2P) 是将数据从一个 PCI 端点 (EP) 直接 DMA 到另一个的概念,而不使用系统内存缓冲区。从 SPDK 的角度来看,最明显的例子是使用 NVMe 控制器内存缓冲区 (CMB) 来实现两个 NVMe SSD 之间的数据直接复制。在某些系统中,当在直接连接到根联合体 (RC) 的 PCIe EP 之间执行对等 2 对等 DMA 时,DMA 可能会失败或性能可能不佳。基本上你的里程可能会有所不同。建议您使用 PCIe 开关(例如 Broadcom 或 Microsemi 提供的那些),因为它可以提供良好的性能。
驱动程序中 p2p dma 支持的一些 linux 内核文档:https : //www.kernel.org/doc/html/latest/driver-api/pci/p2pdma.html
PCI 总线为在总线上的两个设备之间执行 DMA 传输提供了相当不错的支持。这种类型的交易此后称为点对点(或 P2P)。然而,有许多问题使得 P2P 交易很难以完全安全的方式进行。因此,在撰写本文时,内核仅支持在所涉及的端点都在同一个 PCI 桥之后进行 P2P,因为这些设备都在同一个 PCI 层次结构域中,并且规范保证层次结构内的所有事务都是可路由的
| 归档时间: |
|
| 查看次数: |
600 次 |
| 最近记录: |