VxWorks for PowerPC的内存分配图:
PowerPC体系结构的内存结构包括5大部分,分别为系统映像(System Image)之前的系统启动相关的低端内存,系统映像,Host Memory Pool,中断堆栈以及系统内存池(System Memory Pool)。下面就各部分进行介绍。
1. 系统映像之前的低端内存
包括中断向量表(Interrupt Vector Table),共享内存标志(SM Anchor),启动参数(Boot Line),异常信息(Exception Message)和初始化堆栈(Initial Stack)。
中断向量表(异常向量表)占据0x0到0x3000地址的12KB的空间,保存有重要的中断向量信息;
共享内存标志占据0x4100到0x4200地址的100字节,它的作用是标志是否有网络共享内存和VxMP共享内存对象;
启动参数是保留VxWorks启动的时候所用的参数,如:
qefcc(0,0)host:vxWorks h=192.1.1.1 e=192.254.0.4 u=cca pw=cca tn=cca
异常信息,起始地址是0x4300,如果启动过程中出现致命异常,则系统将异常信息保留在这段内存中。如果系统启动过程中失败,我们首先要看的是这段地址中记录的异常信息,可以使用d 0x4300命令查看其中记录的内容。
初始化堆栈,是给usrInit()使用的初始化堆栈,直到usrRoot()分配堆栈。起始地址是0x4C00。
2. 系统映像
系统映像是ELF格式的文件,boot启动之后,将系统映像(boot映像或版本映像)从Flash上copy或解压(如果是压缩版本)到RAM_LOW_ADRS地址处,并跳转到该地址执行。
系统映像包括三部分:TEXT段、DATA段、BSS段。其中TEXT段是代码段,使用的内存基本是必须的;DATA段是数据段,包括已经初始化的全局变量和数组;而BSS段是未初始化的数据段,包括未初始化的全局变量和数组,实际上基本不占用Flash存储空间,在VxWorks系统启动的时候在内存将其进行扩展为全零。
代码段的起始地址:RAM_LOW_ADRS,终止地址:VxWorks定义的char etext[];
数据段的起始地址:VxWorks定义的char etext[],终止地址:VxWorks定义的char edata[];
BSS段的起始地址:VxWorks定义的char edata[],终止地址:VxWorks定义的char end[]。
FREE_RAM_ADRS指向VxWorks定义的char end[],即BSS段的最后,也是映像的最后。
end是由loader在动态加载时确定的,从源码里找不到。首先取得end变量的地址,再减去低RAM_LOW_ADRS的空间,即得到系统映像的大小:
dwImageSize = (WORD32)end - RAM_LOW_ADRS;
3. Host Memory Pool
Host Memory Pool是在VxWorks上驻留的调试工具使用的内存空间,可以根据WDB_POOL_SIZE宏值得到。该部分大小一般有十几M左右。
起始地址:VxWorks定义的char end[],终止地址:end+WDB_POOL_SIZE。
4. 中断堆栈:中断堆栈的大小可以由宏ISR_STACK_SIZE定义可以得出。
5. 系统内存池
这部分是给VxWorks用户程序使用的存储空间,用户通过malloc动态申请获得,这部分可以说是最大的内存空间,当物理内存不够需要优化时需要重点考虑。