直接用VxWorks吧,压缩率一般为55%
......
-------------------
| VxWorks内存布局 |
-------------------
内存布局是VxWorks移植中需要非常准确理解的内容,它关系到config.h的配置和Makefile的编写,如果处理不好或者概念搞错了,那就全乱了。
-------------- 0x00100000 = LOCAL_MEM_SIZE = sysMemTop()
| |
| RAM |
| 0 filled |
| |
|------------| = (romInit+ROM_COPY_SIZE) or binArrayStart
| ROM image |
|----------- | 0x00090000 = RAM_HIGH_ADRS
| STACK_SAVE |
|------------|
| | 0x00080000 = 0.5 Megabytes
| |
| |
| 0 filled |
| |
| | 0x00001000 = RAM_ADRS & RAM_LOW_ADRS
| |
| | exc vectors, bp anchor, exc msg, bootline
| |
| |
-------------- 0x00000000 = LOCAL_MEM_LOCAL_ADRS
--------------
| ROM |
| | 0xff8xxxxx = binArrayStart
| |
| | 0xff800008 = ROM_TEXT_ADRS
-------------- 0xff800000 = ROM_BASE_ADRS
上图是一个内存布局实例(1M字节RAM空间),地址值是自己编的,主要看宏定义。
ROM_BASE_ADRS是指ROM的起始地址,例如:0x80000000。
ROM_TEXT_ADRS是代码段的起始地址,有些CPU不能从0开始执行,所以需要一个偏移量,不同CPU的要求不同,一般和ROM_BASE_ADRS值相同。
LOCAL_MEM_LOCAL_ADRS是指可用RAM的起址,如:0x81000000。
RAM_LOW_ADRS是内核在内存中的加载位置。
RAM_HIGH_ADRS是需要拷贝到内存的ROM映像和堆栈的分界线,向下是堆栈,向上是ROM映像的起址。
未用的部分可以选择清零(用“0”填充)。
大体上就是这么一个分布,但是限于篇幅,还有很多细节没有谈到。比如:堆栈保护、解压缩代码空间、不同ROM映像类型的内存分布差异等。这些看代码可以详细了解,还是那句话,亲自调试就能了解全部细节,写出来的内容总会有信息量的损失,从调试中你能得到最准确全面的信息。
------------------------
| VxWorks的ROM映像类型 |
------------------------
VxWorks有三种ROM映像类型:
1、ROM_RESIDENT-----驻留ROM型。在ROM中运行,只有数据段放在RAM里。
2、ROM_COPY---------复制ROM型。把主要映像从ROM中拷贝到RAM里并跳到其RAM入口点执行。
3、ROM_COMPRESS-----解压ROM型。把主要映像从ROM中解压到RAM里并跳到其RAM入口点执行。
各种ROM映像类型的内存布局图如下:
ROM
--------------
| |
|------------|
| data |
|------------| 0xff8xxxxx = ROM_DATA_ADRS
| text |
| | 0xff800008 = ROM_TEXT_ADRS
-------------- 0xff800000 = ROM_BASE_ADRS
RAM
-------------- 0x00100000 = LOCAL_MEM_LOCAL_ADRS + LOCAL_MEM_SIZE
| |
| |
|------------| = RAM_DATA_ADRS + data segment size
| |
|data segment|
| |
|------------| 0x00001000 = RAM_DATA_ADRS
| initial sp |
|------------| = RAM_DATA_ADRS - STACK_SAVE
| |
| |
-------------- 0x00000000 = LOCAL_MEM_LOCAL_ADRS
上图是驻留ROM型映像的内存分布,可见,只有数据段拷贝到了RAM内存里,当然堆栈也在RAM内存中。
ROM
--------------
| |
|------------| 0xff8xxxxx = binArrayEnd
| subImage |
|------------| 0xff8xxxxx = binArrayStart
| data |
|------------| 0xff8xxxxx = ROM_DATA_ADRS
| text |
| | 0xff800008 = ROM_TEXT_ADRS
-------------- 0xff800000 = ROM_BASE_ADRS
RAM
-------------- 0x00100000 = LOCAL_MEM_LOCAL_ADRS + LOCAL_MEM_SIZE
| |
| |
|------------|
| temp data |
|------------| 0x00090000 = RAM_DATA_ADRS
| initial sp |
|------------| = RAM_DATA_ADRS - STACK_SAVE
| |
| |
|------------|
| |
| subimage |
| |
|------------| 0x00001000 = RAM_DST_ADRS (for non-resident images)
| |
| |
-------------- 0x00000000 = LOCAL_MEM_LOCAL_ADRS
上图是复制ROM型和解压ROM型映像的内存分布,他们比驻留ROM型稍微有点复杂。复制ROM型和解压ROM型映像的主要差别的是 subimage是否压缩,一般压缩率能超过55%,允许在ROM中烧写更大的系统,唯一的代价是增加了几秒钟的启动延迟,而复制ROM型映像没有解压过程,所以启动速度更快。subimage是由make产生的中间映像,并被make插在ROM映像文件中。代码段、初始化数据段、subimage在 ROM中的排列顺序就如上图所示。
复制ROM型映像直接把binArrayStart处的subimage拷贝到RAM_DST_ADRS,没有上面的temp data部分。
对于解压ROM型映像,首先拷贝压缩的代码数据段到RAM_DATA_ADRS位置(即temp data部分),然后运行解压缩例程把解压后的subimage放置在RAM_DST_ADRS。
RAM_DST_ADRS和RAM_DATA_ADRS宏均来自定义于make的链接地址,缺省值分别为Makefile文件中的 RAM_LOW_ADRS和RAM_HIGH_ADRS。关于如何改变链接地址的信息,参见“target/h/make/rules.bsp”文件。
......
|