在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. 前端自动化测试神器-Katalon进阶用法

    前言 上一篇介绍了Katalon的基础用法,本篇继续介绍一些进阶的用法. Keyword 和 Method Call Statement Keyword Keyword就是自定义方法,该方法在当前项目 ...

  2. 开源中文分词工具探析(五):Stanford CoreNLP

    CoreNLP是由斯坦福大学开源的一套Java NLP工具,提供诸如:词性标注(part-of-speech (POS) tagger).命名实体识别(named entity recognizer ...

  3. CSS中的选择器之html选择器和伪类选择器

    1.html选择器(标签选择器) 基本语法: html标签名称{ 属性名:属性值; 属性名:属性值; } 继续在上面的代码中做修改,实例代码: <!DOCTYPE html> <ht ...

  4. python中的协程及实现

    1.协程的概念: 协程是一种用户态的轻量级线程.协程拥有自己的寄存器上下文和栈. 协程调度切换时,将寄存器上下文和栈保存到其他地方,在切换回来的时候,恢复先前保存的寄存器上下文和栈. 因此,协程能保留 ...

  5. mysql导出数据至指定文件的命令

    根据查询语句,导出数据至指定文件SELECT name INTO OUTFILE '/tmp/result.txt' FIELDS TERMINATED BY '-|-' OPTIONALLY ENC ...

  6. 51NOD 1222 最小公倍数计数 [莫比乌斯反演 杜教筛]

    1222 最小公倍数计数 题意:求有多少数对\((a,b):a<b\)满足\(lcm(a,b) \in [1, n]\) \(n \le 10^{11}\) 卡内存! 枚举\(gcd, \fra ...

  7. Java随感

    创新项目要用java,而我只大概会C++,只能靠自学咯~~~随时将一些重要的概念做笔记在这里吧>_< 1.一个源文件中只能有一个public类,一个源文件可以有多个非public类 2.所 ...

  8. Android逆向之so的半自动化逆向

    因为工作需要,转型干android逆向,有几个月了.不过对于so的逆向,任然停留在,难难难的阶段,虽然上次自己还是逆向了一个15k左右的小so文件,但是,那个基本是靠,一步一步跟代码,查看堆栈信息来自 ...

  9. MySQL复制同一个服务器的表结构和表数据

    例如,现在服务器上有数据库 dbx 和 dby,dbx中有很多表,要把dbx中的表全部复制到dby,如下操作: 首先: use dby; [复制表结构] CREATE TABLE user LIKE ...

  10. 安装php的memcached模块和扩展支持sasl

    memcached的1.2.4及以上增加了CAS(Check and Set)协议,对于同一key的多进行程的并发处理问题.这种情况其实根数据库很像,如果同时有几个进程对同一个表的同一数据进行更新的话 ...