微知-linux内核中PCIe驱动扫描后驱动加载为什么有两种类型的resource?分别是什么?
分别是io资源 和 mem资源。
在pcie scan的后linux内核会遍历所有的bus和节点 根据每个设备中pcie的配置空间进行映射到内核的地址空间。
此时有两种映射方式
- 一种是把地址空间映射到内核的io地址空间
- 另一种是地址空间映射到内存
在PCIE的配置空间的bar(基础地址寄存器)空间里面 每一个伴都会告诉内核,他所需要的空间大小 以及它所使用的空间类型
因为当应用程序访问某个地址空间的时候 CPU访问地址的时候 通过host bridge发送地址,mmu会自动过滤掉io空间的地址,经由pcie host bridge进行访问io设备的资源。
所以本文开始提出的在扫描中驱动加载显示bar资源的需要的两种内存类型,是设备用来表示它所使用的两种内存介质,一种是用自己的配置空间的地址,另外一种是使用物理内存的地址。
还有一些细节点
- PCIe的host bridge 其实就是平时所说的rc(root complex)
- rc的主要作用之一就是将pcie的访存(比如bdf号指定寄存器)转化为pcie的总线数据进行访问
- rc的提供使用方法是提供一个address和data的操作接口,先制定address写入地址,总线根据地址进行片选,以后再读取要访问或者写入的数据
- 另外,在bios或者uefi启动期间,系统会进行pca的设备扫描,然后将分配的地址写入到pcie配置空间。然后在linux启动之后再扫描PCIE的配置空间,读取相应的地址需求,从而进行相应的地址映射,或者地址分配