假设CPU想要从PCI Express设备进行DMA读取传输。与PCI Express设备的通信由事务层分组(TLP)提供。从理论上讲,TLP的最大有效载荷大小为1024双字。那么,当CPU向PCI Express设备提供4兆字节的DMA读取命令时,DMA控制器如何动作?
答案 0 :(得分:15)
在PCIe枚举阶段,确定允许的最大有效载荷大小(它可以低于设备的最大有效载荷大小:例如,中间PCIe交换机具有较低的最大有效载荷大小)。
大多数PCIe设备都是DMA主设备,因此驱动程序将命令传输到设备。设备将发送多个写入数据包,以xx最大大小的TLP块传输4 MiB。
基于PCI的总线在芯片组中没有芯片或子电路形式的“DMA控制器”。总线上的每个设备都可以成为总线主设备。主存储器始终是从属存储器。
假设您已经构建了自己的PCIe设备卡,它可以充当PCI主设备,并且您的程序(在CPU上运行)希望将数据从该卡发送到主存储器(4 MiB)。
设备驱动程序知道操作系统中该特定内存区域的内存映射(某些关键字:内存映射I / O,PCI总线枚举,PCI BAR)。
驱动程序将命令(写入),源地址,目标地址和长度传输到设备。这可以通过将字节发送到预定义BAR内的特殊地址或写入PCI配置空间来完成。卡上的DMA主机检查这些特殊区域的新任务(分散 - 收集列表)。如果是这样,这些任务就会被排队。
现在,DMA主控器知道发送的位置,数据量。他将从本地存储器读取数据并将其包装成最大有效载荷大小的512字节TLP(路径设备上的最大有效载荷大小< --->主存储器从枚举中已知)并将其发送到目的地地址。基于PCI地址的路由机制将这些TLP引导到主存储器。
答案 1 :(得分:0)
我缺少内存管理方面的内容。总线主控器使用物理地址将数据分块发送到内存,该地址以前是由使用OS的API的软件来解析的。但是4 MB的大小跨越了许多MMU页,并且MMU是CPU的一部分。不在芯片组中驱动内存和PCIe。 所以,我不相信,这是完整的故事。恐怕每个块都必须分开处理。