在VxWorks操作系统过程中可能使用到的BootRom和VxWorks内核映像本身都可以存在两种方式:压缩的和非压缩的。

1.非压缩形式

如果没有进行压缩,则只有一次重定位,即从ROM到RAM只存在一次代码复制过程,所有ROM中存储的代码都被一次性复制到RAM中。

① 对于BootRom 而言,所有的代码被一次性复制到RAM_HIGH_ADRS 指定地址处,如图3-1所示。

② 对于VxWorks_rom
而言,所有的代码被一次性复制到RAM_LOW_ADRS 指定地址处,如图3-2
所示。

2.压缩形式

如果有进行压缩,则代码复制过程将分为两次,一次是非压缩代码,另一次是压缩代码,且二者复制到内存不同的位置处。

① 对于BootRom
而言,非压缩代码(romInit.s、bootInit.c)被直接复制到RAM_LOW_ADRS
处;压缩代码复制到RAM_HIGH_ADRS
处,并在复制过程中完成解压缩,如图3-3
所示。

② 对于VxWorks_rom
而言,非压缩代码(romInit.s、bootInit.c)被直接复制到RAM_HIGH_ADRS处;压缩代码复制到RAM_LOW_ADRS处,并在复制过程中完成解压缩,如图3-4所示。

事实上,对于压缩版本,在进行编译时,进行了两次代码链接:一次是针对压缩代码的链接,另一次是将非压缩代码和压缩代码整合在一起时的链接。注意,在进行非压缩代码和压缩代码的整合时,压缩代码部分是作为数据进入整个映像的,所以不会对其进行重新链接。对压缩代码的链接,实际上是在代码被压缩之前完成的,完成代码的链接后,生成特定格式的目标文件(如ELF
或者COFF),为了在解压缩后可以直接执行,首先必须将其转成二进制可执行文件,通过objcopy函数完成此项功能,此后对生成的二进制可执行文件调用deflate函数进行压缩,由于需要将压缩后的代码最后整合到整个映像中,故压缩后的文件还需要通过binToAsm
工具进行转换,转成一个汇编源文件,该文件将压缩后的二进制代码作为数据部分进行保存,从而避免在与非压缩代码最后进行二次链接时被修改。

两步链接过程中各自指定了不同的链接地址,对于压缩代码而言,其分为两种情况,对于BootRom,压缩代码被链接到了RAM_HIGH_ADRS地址处,而对于VxWorks_rom,则被链接到了RAM_LOW_ADRS 地址处,在与非压缩代码进行整合链接时指定的链接地址(即_romInit函数地址)与压缩代码链接时指定的地址相对应:如果压缩代码为RAM_HIGH_ADRS,则最后整合时就为RAM_LOW_ADRS;如果压缩代码为RAM_LOW
_ADRS,则整合时就为RAM_HIGH_ADRS。

VxWorks 操作系统内存布局的更多相关文章

  1. C++ 系列:内存布局

    转载自http://www.cnblogs.com/skynet/archive/2011/03/07/1975479.html 为什么需要知道C/C++的内存布局和在哪可以可以找到想要的数据?知道内 ...

  2. Linux 内存布局

         本文主要简介在X86体系结构下和在ARM体系结构下,Linux内存布局的概况,力求简单明了,不过多深入概念,多以图示的方式来记忆理解,一图胜万言. Technorati 标签: 内存 布局 ...

  3. linux系统进程的内存布局

    内存管理模块是操作系统的心脏:它对应用程序和系统管理非常重要.今后的几篇文章中,我将着眼于实际的内存问题,但也不避讳其中的技术内幕.由于不少概念是通用的,所以文中大部分例子取自32位x86平台的Lin ...

  4. C语言程序内存布局

    C语言程序内存布局 如有转载,请注明出处:http://blog.csdn.net/embedded_sky/article/details/44457453 作者:super_bert@csdn 一 ...

  5. C/C++内存布局及对齐

    1.源文件转换为可执行文件 源文件经过以下几步生成可执行文件: 1.预处理(preprocessor):对#include.#define.#ifdef/#endif.#ifndef/#endif等进 ...

  6. Anatomy of a Program in Memory.剖析程序的内存布局

    原文标题:Anatomy of a Program in Memory 原文地址:http://duartes.org/gustavo/blog/ [注:本人水平有限,只好挑一些国外高手的精彩文章翻译 ...

  7. 内存对齐与ANSI C中struct型数据的内存布局 【转】

    转自:http://blog.chinaunix.net/uid-25909619-id-3032209.html 当在C中定义了一个结构类型时,它的大小是否等于各字段(field)大小之和?编译器将 ...

  8. UNIX高级环境编程(8)进程环境(Process Environment)- 进程的启动和退出、内存布局、环境变量列表

    在学习进程控制相关知识之前,我们需要了解一个单进程的运行环境. 本章我们将了解一下的内容: 程序运行时,main函数是如何被调用的: 命令行参数是如何被传入到程序中的: 一个典型的内存布局是怎样的: ...

  9. Linux内存初始化(三) 内存布局

    一.前言 同样的,本文是内存初始化文章的一份补充文档,希望能够通过这样的一份文档,细致的展示在初始化阶段,Linux 4.4.6内核如何从device tree中提取信息,完成内存布局的任务.具体的c ...

随机推荐

  1. 《.NET 设计规范》第 3 章 命名规范

    <.NET 规范>第 3 章 命名规范 3.1 大小写约定 要把 PascalCasing 用于由多个单词构成的命名空间.类型以及成员的名字. 要把 camelCasing 用于参数的名字 ...

  2. Linux 下定时备份数据库以及删除缓存

    一.定时备份数据库 1.在根目录下创建备份文件夹 #mkdir backup 2.进入到该目录下,创建backup.sh文件 3.赋予文件权限让其变成可执行文件 4.在backup.sh中写备份的脚本 ...

  3. java类加载时执行顺序

    源代码 class HelloA { public HelloA() { System.out.print("A"); } { System.out.print("B&q ...

  4. Python函数可变参数*args及**kwargs详解

    初学Python的同学们看到代码中类似func(*args, **kwargs)这样的函数参数定义时,经常感到一头雾水. 下面通过一个简单的例子来详细解释下Python函数可变参数*args及**kw ...

  5. Jmockit之mock特性详解

    本文是Jmockit学习过程中,根据官网所列的工具特性进行解读. 1.调用次数约束(Invocation count constraints) 可以通过调用计数约束来指定预期和/或允许匹配给定期望的调 ...

  6. PLSQL Developer软件使用大全

    PLSQL Developer软件使用大全 第一章 PLSQL Developer特性 PL/SQL Developer是一个集成开发环境,专门面向Oracle数据库存储程序单元的开发.如今,有越来越 ...

  7. RMI基础

    远程方法调用(Remote Method Invocation,RMI)从JDK1.1就已经实现,它大大增强了Java开发分布式应用的能力.可以实现通过网络完成不同JVM间的通信,不仅可以传递基本的数 ...

  8. cdcqの省选膜你赛

    cdcqの省选膜你赛 比赛当天因为在杠hnoi2016的大数据结构没有参加,今天补了一下.挺好玩的虽然不看一句话题意的话真的卡读题 此生无悔入东方,来世愿生幻想乡 2651. 新史「新幻想史 -现代史 ...

  9. 夏令营讲课内容整理 Day 3.

    本日主要内容是树与图.   1.树 树的性质 树的遍历 树的LCA 树上前缀和   树的基本性质: 对于一棵有n个节点的树,必定有n-1条边.任意两个点之间的路径是唯一确定的.   回到题目上,如果题 ...

  10. Nginx与Tomcat/PHP架构优化的技术分享

    PHP性能优化 一般我们是在/usr/local/php5/etc/php-fpm.conf这个文件里面进行相应的配置. 1)       如果设置成static,php-fpm进程数自始至终都是pm ...