1. 几个重要的概念
虚拟地址
也叫逻辑地址或程序地址,是从CPU角度看到的地址,也是写在代码里面的那个地址。
线性地址
在X86里面表示虚拟地址经过段转换得到的地址,实模式下等于物理地址,保护模式下需要经过页转换才能得到物理地址
在龙芯(MIPS)里面,不需要经过页转换的虚拟地址即为线性地址,如32位地址空间里面的KSEG0/KSEG1地址以及64位地址空间里面的XKPHYS地址。
物理地址
虚拟地址(MIPS)/线性地址(X86)经过页转换得到的地址为物理地址。
龙芯(MIPS)的线性地址去掉类型前缀可以直接得到物理地址
此处的物理地址是“初始物理地址”,是CPU核的地址总线发出的地址,要经过各级交叉开关的转换才能得到“最终物理地址”,即内存条上的地址
总线地址
也叫DMA地址,是从设备角度看到的地址,在没有IOMMU的情况下等于物理地址,在有IOMMU的情况下,经过简单转换可以得到物理地址。
2. 虚拟地址空间的划分以及映射规则。
核心与用户特权级
在核心特权级下(CPU启动时),可以做任何事情,在用户态下,2G(最高位置位的)以上的程序地址都是非法的,会导致陷入异常。
注意的是,如果CPU有MMU,这意味着所有的用户地址在到达物理地址之前必须经过MMU转换,从而使操作系统有能力可以防止用户程序失去控制/乱冲横撞。
3. 龙芯3的DMA结构
龙芯3B1500由硬件维护处理器以及通过HT端口接入I/O之间的Cache一致性,但硬件不维护通过PCI接入到系统中的I/O设备的Cache一致性,在驱动程序开发时,对通过PCI 接入的设备进行DMA(Direct Memory Access)传输时,需要由软件进行Cache一致性的维护。
4. 系统节点级的物理地址空间的分布
龙芯3号系列处理器的系统物理地址分布采用全局可访问的层次化寻址设计,以保证系统开发的扩展兼容。整个系统的物理地址宽度为48位,按地址的高4位,整个地址空间被均匀分布到16个节点上,即每个节点分配44位地址空间。
在每个节点的内部,44位地址空间有进一步均匀分布给节点内连接的可能最多8个设备,其中低43位地址由4个SCache模块所拥有,高43位地址则进一步按地址的[43:42]位分布给连接在4个方向端口的设备上。根据芯片和系统结构的配置不同,如果某端口上没有连接从设备,则对应的地址空间是保留地址空间,不允许访问。
5. 地址路由分布与配置
龙芯3B1500的路由主要通过系统的两级交叉开关可以对每个Master端口接收到的请求进行路由配置,每个Master端口都拥有8个地址窗口,可以完成8个地址窗口的目标路由选择。每个地址窗口由BASE,MASK和MMAP三个64位寄存器组成,BASE以K字节对齐;MASK采用类似网络掩码高位为1的格式;MMAP的低三位表示对应目标Slave端口的编号,MMAP[4]表示允许取指,MMAP[5]表示允许块读,MMAP[7]表示窗口使能。
窗口命中公式:(IN_ADDR & MASK)==BASE
如下图 (龙芯3的架构图),从图中我们可以看到,从CPU核出来的程序地址经过一级高速缓存之后,到达一级XBar进行地址路由分配,之后经过二级高速缓存,来到二级XBar。