在上一篇中,我们简单的介绍了PCIe的总体架构,设备树和主要组成部分,并且了解了如何通过lspci命令和Windows下的设备管理器来查看PCIe的系统结构。这一篇,我们来更加深入的看看PCIe中的设备相关的信息,如配置空间,来帮助我们了解PCIe和这些命令的工作原理。
1. It is all about memory
理解PCIe的关键,我个人觉得是理解内存的访问。这里先小小的剧透一下,PCIe中主要定义了4种请求:Memory Transaction,I/O request,Configuration Space Access和Message。除了最后一种以外,其余三种全都是基于内存访问的,甚至连中断发起都是基于内存访问的,所以如果我们能很好的理解内存的访问,我们就能很好的理解PCIe。
学过操作系统的小伙伴对虚拟内存这个概念肯定不陌生。在现代的操作系统中,当CPU想去访问一段内存的时候,它访问的地址并不是真实内存的物理地址,而是一个虚拟地址,这个地址需要经过MMU进行地址转换,将其变为物理地址之后才能通过总线去物理内存拿到真实的数据 [2]。
而PCIe中基于内存访问的请求的实现,也正是利用类似的机制:
- PCIe中的每一个设备,无论是Endpoint(Type 0)还是Switch(Type