由于这个领域对我来说是新的,所以我对PCIe有一些困惑。我以前曾研究过一些协议,如I2c、spi、uart、can和大多数这些协议都有定义良好的文档(最多300页)。在几乎所有提到的这些协议中,从软件的角度来看,应用程序只需写到数据寄存器,其余的将由硬件来处理。例如,在Uart中,我们只需将数据加载到数据寄存器中,然后使用启动、奇偶校验和停止位将数据发送出去。
我在网上读过一些关于PCIe的东西,下面是我到目前为止的理解。
在系统引导期间,BIOS固件将通过对PCIe设备(端点)中的条的神奇写入和读取过程,计算出PCIe设备所需的内存空间。一旦发现,它将在系统内存映射中为设备分配一个地址空间(主机中不使用实际内存,内存只驻留在endpoint.The端点中,内存映射到主机中)。我看到PCIe有几个头字段,BIOS固件在总线枚举阶段显示了这些字段。
现在,如果主机想在地址0x10000004的配置寄存器中设置一个位(映射为enpoint的地址),主机将执行类似的操作(假设只有1个enpoint存在,没有分支):
*(volatile uint32 *)0x10000004 |= (1<<Bit_pos);1.根复合体如何知道在何处引导这些消息,因为条形图位于端点中。RC是否向所有节点广播,然后每个节点将地址与在BAR中编程的地址进行比较,以确定它是否必须接受?(就像CAN中的可接受过滤器)。
G 210
上面的查询是相关的,只有当需要读取或写入enpoint中的配置reg时。下面的查询涉及从主机到enpoint的数据传输。
1.假设主机要求enpoint将显示在dram中的特定数据保存到SSD,并且由于SSD被控制到PCIe时隙,PCIe也会执行DMA传输吗?例如,主机在Dram中写入的特殊栏是否必须移动到ssd,从而触发PCIe执行从主机到点的DMA转换?
我正试图理解PCIe与我迄今为止所研究过的任何其他协议的关系。这对我来说有点新。
发布于 2020-03-29 16:46:12
RC通常是CPU本身的一部分。它充当将CPU请求路由到下游以及从端点到上游CPU的桥。
PCIe端点具有类型0报头,桥接器/交换机具有类型1报头。类型1报头有基(最小地址)和限制寄存器(最大地址)。类型0标头具有在枚举阶段编程的条形寄存器。
在枚举阶段完成后,所有端点都已编程,RC和桥接器/开关的类型1报头中的基本寄存器和限制寄存器被编程。
例:假设一个系统只有一个端点直接连接到RC,没有中间桥/开关,其条的值为A00000。如果它请求CPU中4Kb的地址空间(MMIO),则RC的基本寄存器为A00000,限制寄存器为AFFFFF(它始终是1MB对齐的,尽管端点请求的空间小于1MB)。如果CPU写入寄存器A00004,RC将查看基本寄存器并限制寄存器,以确定地址是否在其范围内,并将数据包向下路由到端点。
端点使用BAR来确定它们是否必须接受数据包。RC、网桥和交换机使用基本寄存器和限制寄存器将数据包路由到正确的下游端口。大多数情况下,交换机可以有多个下游端口,每个端口都有自己的Type 1报头,其基本寄存器和限制寄存器将针对连接到其端口的端点进行编程。这用于路由数据包。
CPU内存和端点之间的数据传输是通过PCIe内存写入的。每个PCIe数据包的最大有效负载容量为4K。如果超过4K必须发送到端点,它是通过多个内存写入。内存写入是发布事务(不需要来自端点的ACK )。
https://stackoverflow.com/questions/59086536
复制相似问题