前文对TLP各域段做了一些简介,但并未深挖。实际上,TLP报文的很多域段都有其对应的使用场景,与系统配合完成相关的功能,同时也能够看到存在的一些问题。上文提到地址是TLP报文中最难分析的域段,所有使用PCIe接口的场景,均离不开地址,属于数据传输的基本要素。本文介绍一下地址域段,主要是个人对地址的分析逻辑。
1 谁的地址?
这是第一个问题,也是最关键的问题,这个地址属于谁的?也就是哪个角色在分配和管理这些地址?先来看看PCIe的拓扑结构,如下图所示。
PCIe系统拓扑使用的地址,必须是由CPU/RC侧分配使用的地址。与PCIe EP连接的CPU,也称为Host,与此对应,EP则称为Device。Host侧作为一个系统,有其地址系统,用于路由各种读写访问请求,其下发至各Device的操作,也都是基于该地址进行编址的。通常来说,这一地址作为物理地址(physical address)的角色,Host侧系统的互联总线,都是基于该地址进行路由的。
相反方向,Device访问Host侧,稍微复杂一些,可以有多种选择。最简单的情况,使用Host的物理地址,Device的读写访问可以直接发送至Host的互联总线。实际上,该方向也可以使用虚拟机VM的物理地址(GPA),甚至是进程的用户地址(GVA),在Host侧使用IOMMU/SMMU转换为物理地址后,再发送至互联总线进行路由。后者就是硬件辅助的IO虚拟化的基本原理。当然,这一方向使用的地址,仍然是Host侧的地址,只是可以在物理地址、虚拟机物理地址、进程地址等等进行选择,基于不同需求使用不同的方案。需注意的是,该方向的地址来源仍然且必须是Host侧,如驱动分配,Device是无法自动生成该访问地址的,否则就是安全问题了。
2 地址路由
使用了Host侧的地址系统,但其地址路由需在PCIe拓扑系统处理。PCIe协议提供了两种配置空间,分别是Type 0和Type 1。Type 0配置空间用于描述Device设备的各种能力及其所需系统资源,而这一资源就包括地址空间,描述这一需求的称为BAR(Base Address Register)。Type 1配置空间用于描述Switch和Root Port的相关信息,包括其下所有Device需使用的地址空间。
Type 0的BAR寄存器,用于声明该Device所需的地址区间,再映射到Device侧的硬件资源。最大支持6个32bit BAR寄存器,使用序号0-5标记,相邻且第一个序号为0/2/4的两个BAR可组成一个64bit BAR。枚举阶段,软件会基于BAR的初始配置,给Device分配Host侧的地址空间,并将其基地址写入BAR寄存器内。
Type 1关于描述地址信息的寄存器主要分为两类,一是BAR寄存器,只有2个,另外一个则是BASE/LIMIT寄存器,包括Non-prefetchable、Prefetchable和I/O共三种类型。其中BAR寄存器可预留至Switch或RootPort使用,BASE/LIMIT则用于该Port下所有设备的地址分配。
Host侧下发的访问请求,会基于BASE/LIMIT进行路由,如上图拓扑结构中发送至Switch的请求,基于4个Downstream Port的BASE/LIMIT进行路由。Device侧接收到请求后,会基于BAR寄存器基地址进行匹配。
Device侧发送至Host侧的请求,通常则是直接发送至Host侧再做路由。但有一些例外,若请求地址为物理地址,且命中了如Switch的Downstream Port的BASE/LIMIT区间,理论上可直接转发至对应的Device。这一场景就是Peer-to-peer,访问请求不经过Host侧Memory,直接转发至另一个Device。若请求为虚拟地址,则需转发至Host侧进行地址转换,再做后续的路由处理,需使能ACS且受其约束。
3 虚拟地址
Host侧的用户进程需要使用地址进行数据的读写访问,但其使用的并非是物理地址,而该访问请求发送至互联总线,又必须使用物理地址。因此,其间必须经过一次地址的转换。
实际上,用户进程使用的通常是虚拟地址,经过页表转换后,输出物理地址,才能对实际的Memory空间进行访问。使用虚拟地址,可以带来诸多好处。进程可独享整个地址空间,而不会与其余进程发生地址冲突。不过,虽然有整个地址空间,但并非每个地址均有其物理Location对应,该地址只是标号,实际被分配后,才会与具体的物理位置形成对应关系,该对应关系就是页表。
存在虚拟机的系统中,其地址视角可以简单描述如下图。每个虚拟机进程有其独有的地址空间,可称为Guest虚拟地址GVA;每个虚拟机有其地址空间,称为Guest物理地址GPA;两者之间存在映射关系,而GPA又与Host物理地址存在映射关系。此外,物理机进程也有其独有的地址空间。
如上文所述,Device从Host驱动获取地址,该地址可能是虚拟地址,此时Device发出的访问,也要经过页表转换,才能访问物理地址空间。
Host侧进程发出读写访问和Device发出读写访问,都有可能使用虚拟地址,需经页表转换后才能访问互联总线,存在如下图的对应关系。CPU侧,也即进程发出的读写访问,使用MMU进行地址转换,为加速转换效率,设置了TLB作为页表关系的缓存。类似地,从device侧接收到的读写请求,使用SMMU/IOMMU进行地址转换。
更多内容,可关注硬件虚拟化与相关逻辑一文。
4 小结
本文是个人对PCIe报文地址的理解,从谁的地址、地址路由和虚拟地址三方面阐述。结合系统和具体场景,地址信号还有较多可分析的地方,尤其是涉及到性能调优的部分。
芯工阿文
芯工阿文
推荐阅读
CCIX(七)
IC验证er一起学点设计模式(1)---单例模式
怎么在sequence中调用agent中的函数以及如何快速实验你的想法?
更多IC设计技术干货请关注IC设计技术专栏。
迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。