PCIe概述
PCI总线使用并行总线结构,采用单端并行信号,同一条总线上的所有设备共享总线带宽PCIe总线使用高速差分总线,采用端到端连接方式,每一条PCIE链路只能连接两个设备
PCIe的端到端连接方式发送端和接收端都含有TX(发送逻辑),RX(接受逻辑)
现在来说明什么是mmio
mmio,memory map io内存映射访问机制,除了port I/O之外,另外一种访问方式就是mmio了内存映射,简而言之就是将用户空间的一段内存区域映射到内核空间,映射成功后,用户对这段内存区域的修改可以直接反映到内核空间,同样,内核空间对这段区域的修改也直接反映用户空间。那么对于内核空间用户空间两者之间需要大量数据传输等操作的话效率是非常高的。
这里就自然地提到一个函数,
mmap(linux环境)
头文件
void* mmap(void* start,size_t length,int prot,int flags,int fd,off_toffset);
int munmap(void* start,size_t length);
mmap函数用来将内存空间映射到内核空间
munmap用来解除这个映射关系
函数参数:start映射区開始地址,設置為NULL時表示由系統決定
length映射区長度單位,地址自然是sizeof(unsigned long)
prot設置為PORT_READ|PORT_WRITE表示頁可以被读写
flag指定映射对象类型,MAP_SHARED表示與其他所有映射這個对象的所有进程共享映射空间
fd,/dev/mem文件描述符
offset被映射對象內容的起點
这里还需要提到一个文件/dev/mem
“/dev/mem”物理內存全映像,可以用來訪問物理內存,一般是open("/dev/mem",O_RD_WR),然后mmap,接著就可以用mmap地址訪問物理內存(root权限)
这是PCIe物理内存地址!
)
遍历时只需要根据相应的offset偏移即可PCIe设备的配置空间!
关于PCIe设备配置空间的0x34位置的Capabilites Pointer,需要说一说
这是0x34h位置即Capability Pointer所代表的空间,也就是说Capability Pointer虽然听起来像一个指针,但是他只是一个8bit的数据,这里面存放了一个地址,而这个地址,就是我们要找的,
意义上Capability Pointer所指向的东西,我们来看看他究竟要指向哪里,就是这里喽!
如果觉得《linux pcie内存映射 PCIE的mmio内存映射访问机制》对你有帮助,请点赞、收藏,并留下你的观点哦!