✨前言:
在PCIe中,存在几种不同类型的请求,主要包括IO(Request)请求、存储器(Request)请求和配置(Request)请求。这些请求类型允许CPU与连接在PCIe总线上的设备进行通信和控制。
🌟1. IO(Request)请求
定义与作用: IO请求,即输入输出请求,是一种使CPU能够读写连接在PCIe总线上设备的特定IO端口的操作。这种请求类型常用于较旧的或简单的外围设备,如早期的声卡、网卡等,它们使用设定的IO空间进行数据交换。
实现方式: 当发起IO请求时,CPU通过总线发送一个包含端口地址及操作类型(读/写)的信号给目标设备。设备响应这一请求,执行相应的读或写操作,并将结果返回给CPU。
🌟2. 存储器(Request)请求
定义与作用: 存储器请求,即内存访问请求,用于直接在CPU与PCIe设备之间传输数据。它允许PCIe设备读写系统内存,支持更高效、更直接的数据传输方式,广泛应用于需要快速数据交换的设备,例如现代显卡、SSD等。
实现方式: 发起内存请求时,会指定系统内存的地址和需要传输的数据。PCIe支持的DMA(直接内存访问)允许外设直接与系统内存通信,不必占用CPU资源,从而实现高效数据处理。
🌟3. 配置(Request)请求
定义与作用: 配置请求用于读取或设置PCIe设备的配置空间,这是一块预留的内存区域,包含了设备的重要信息和配置参数,如设备ID、中断设置、支持的功能等。通过配置请求,系统可以识别和配置连接的设备。
实现方式: 在设备初始化或系统启动时,BIOS或操作系统会发起配置请求来探测和配置所有PCIe设备。配置访问通常通过特定的地址和数据路径进行,CPU可通过这些路径读写PCIe设备的配置寄存器。
✨IO Request
IO Request的TLP Header的格式如下图所示:
IO请求用来进行输入/输出操作,其TLP头部包含以下字段:
格式(Fmt): 指示TLP的格式,IO请求通常是3位长,对于IO Read请求,格式为"001",IO Write请求,格式为"000"。
类型(Type): 指示TLP的具体类型,对于IO操作,通常是5位长,IO Read请求的类型为"00001",IO Write请求的类型为"00010"。
长度(Length): 表明数据传输的DWORD数量,对于IO操作,这通常是较小的数量。
请求者ID(Requester ID): 表明发起请求的设备。
总线/设备/函数号(Bus/Device/Function Number): 指定请求目标的PCI Express设备地址。
标签(Tag): 用于将请求和响应匹配起来,以区分不同的事务。
✨Memory Request
Memory Request的TLP Header的格式如下图所示:
内存请求用来访问系统内存,TLP头部的字段和IO请求类似,但具有不同的值:
格式(Fmt): 内存读取为"000"或"010",内存写入为"001"或"011",长包头格式包含4个额外的字节用于64位地址。
类型(Type): 对于内存读写操作,类型分别为"00000"(Memory Read)和"00001"(Memory Write)。
长度(Length): 传输的数据长度。
请求者ID(Requester ID): 发起请求的设备。
标签(Tag): 同IO请求。
首次读/写(First BE)/最后读/写(Last BE): 分别表示数据开始和结束的字节使能位。
64位地址(Address): 内存地址,可能是32位或64位,取决于格式字段。
注:TLP Prefix、ID Based Ordering(IDO)和TLP Processing Hints(TH)均为PCIe Spec V2.1提出的。
✨Configuration Request
Configuration Request的TLP Header的格式如下图所示:
格式(Fmt): 配置读取为"010",配置写入为"011"。
类型(Type): 对于配置读写操作,类型分别为"10100"(Configuration Read Type 0)、“10101”(Configuration Read Type 1)或"11000"(Configuration Write Type 0)、“11001”(Configuration Write Type 1)。
长度(Length): 配置访问固定长度为"1",因为配置空间是采用4字节为单位进行访问。
请求者ID(Requester ID): 发起请求的设备。
拓展注册头(Extended Register Number): 表示访问的配置空间在256字节之上的偏移。
配置注册头(Register Number): 访问配置空间的偏移量。
设备号(Device Number): 指示配置空间需访问的PCI设备编号。
功能号(Function Number): 指示配置空间需访问的PCI功能编号。