下面是VxWorks for PowerPC的内存分配图

VxWorks RAM

专业术语解释:

  • Interrupt Vector Table. Table of exception/interrupt vectors.
  • SM Anchor. Anchor for the shared memory network and VxMP shared memory objects(if there is shared memory on the board).
  • Boot Line. ASCII string of boot parameters.
  • Exception Message. ASCII string of the fatal exception message.
  • Initial Stack. Initial stack for usrInit(), until usrRoot() is allocated a stack.
  • System Image. The VxWorks system image itself(three sections: text, data, and bss). The entry point for VxWorks is at the start of this region, which is BSP dependent(see BSP-specific documentation).
  • Host Memory Pool. Memory allocated by host tools. The size depends on the macro
  • WDB_POOL_SIZE. Modify WDB_POOL_SIZE under INCLUDE_WDB.
  • Interrupt Stack. Size is defined by ISR_STACK_SIZE under INCLUDE_KERNEL. Location depends on system image size.
  • System Memory Pool. Size depends on the size of the system image. The sysMemTop() routine returns the address of the end of the free memory pool.

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动态申请获得,这部分可以说是最大的内存空间,当物理内存不够需要优化时需要重点考虑。