Cavium多核系统地址空间布局以及启动.doc
文本预览下载声明
Cavium多核系统地址空间布局及启动
引言
作为使用MIPS内核的CPU芯片,Cavium系列CPU具有两个地址空间,即虚拟地址空间和物理地址空间。在MIPS系统中,软件所见到的都是虚拟地址,其与物理地址的联系是通过内核中的TLB以及ERL位共同决定。
1. 虚拟地址
Cavium系列CPU在采用32位寻址模式时,具有标准的一个MIPS特有的虚拟地址空间布局:
4G的地址空间被分为四大区域。MIPS CPU可以运行在两种特权级之上:用户态和核心态。当运行于用户态时只能访问到低2G的kuseg区域;而运行于核心态时,对于任意4个区域都能够正常访问。Vxworks系统不分用户态和核心态,一律都运行在核心态。因此,我们的系统对整个虚拟地址空间都是可以正常访问的。
对于kuseg区,其范围为0– 0x7fffffff (低端2G),对这段空间的使用只有在ERL置位,或是ERL被清0,且TLB已经正确配置的情况下才能进行。由于Cavium CPU特有的属性——对所有的内存空间的访问都是Cached,所以这段空间是一定Cached的。
对于kseg0区,其范围为0– 0x9fffffff(共512M)。这段空间的访问不需要TLB映射,只需将其最高位清0,即得到其相应的物理地址。该区域一定是Cached的。
对于kseg1区,其范围为0xa0000000 – 0xbfffffff (共512M)。这段空间通过去掉最高的三位来获得物理地址。因此,实际上它的物理地址范围同kseg0是一致的。这段空间在MIPS的定义中是unCached的。但是由于上面提到的Cavium CPU访问物理内存的特殊性,映射到这部分的0-256M物理内存,访问时也是cached的。MIPS上电跳转的虚拟地址0xbfc00000就是属于这段区域,其物理地址就是0x1fc00000。
对于kseg2区,其范围为0xc0000000 – 0xffffffff (共1G)。这块区域需要通过TLB才能够正确访问。
2. Cavium CPU物理地址空间分布
Cavium系列CPU比较特别的地方,是其物理内存的物理地址是不连续的,即其DR1 DRAM部分是0x410000000 – 0x41fffffff。这样做可能是因为其物理地址的0– 0x1fffffff在满足MIPS的启动规则前提下分配给了boot-but模块。如上图,当CPU遇到0– 0x1fffffff的访问请求时,会将其转换为0x1000010000000 – 0x100001fffffff。这是因为在Cavium CPU的物理地址空间中,分为两部分,即:
System memory (DRAM)
I/O space
Cavium CPU只用到了49位的物理地址,区分内存与I/O space的方法就是看其物理地址的Bit48是否置位,如果为1,则属于I/O space,否则则为内存空间。
I/O空间统一都是unCached的。从上图可以看出,实际上所有的Cavium CPU的组件的寄存器空间都是属于I/O空间的,如FPA,POW等等。因为我们的软件平台是32位的,而这些寄存器空间的物理地址都是超过32位的,因此要访问它们,必须通过cavium提供的内嵌汇编函数,如cvmx_write_csr、cvmx_read_csr、cvmx_read64_uint8、cvmx_write64_uint8等等。
3. 多核内存布局及其虚实地址映射
当前多核采用所有核跑一个BIN的方式,为了实现这种模式,要求所有核上的软件所看到的虚拟地址都是一样的。两个核共享代码段和CVMX_SHARED段,CVMX_SHARED段存储了一些供两个核共享的全局变量;各自有自己的数据段,BSS段以及一个LOCAL HEAP;一个共享的GLOBAL HEAP。
基于上述规则,可得到下面的多核内存虚实地址映射表:
上图左边的是整个内存的物理地址空间,其中红色区域与其最后的虚拟地址空间是一一对应的,而蓝色区域不是一一对应的。所有的核都共享Reserved Region,.txt,.cvmx_shared和Global Heap,而拥有自己的.data和.bss,Local Heap,将其统称为Local Region。其中n代表CPU所具有的核数。
所有核上的虚拟地址空间都是一样的,即为右边所示。其中的Invisible Region没有体现在TLB映射中,所以是系统不可见的,也无法对其进行正常访问。
从上图可以看出,除了主核的虚实地址是一一映射之外,所有的从核的Local Region的虚实地址映射都不是一一对应的。因此,当从核跳转到程序入口时,必须首先进行其TLB的初始化
显示全部