VxWorks 操作系统内存布局

在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。

时间: 2024-11-02 07:23:07

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

剖析程序的内存布局

[html] view plain copy print? 转载自drshenlei的译文http://blog.csdn.net/drshenlei/article/details/4339110      原文标题:Anatomy of a Program in Memory      原文地址:http://duartes.org/gustavo/blog/   转载自drshenlei的译文http://blog.csdn.net/drshenlei/article/details/43

C程序的内存布局(Memory Layout)

  由C语言代码(文本文件)形成可执行程序(二进制文件),需要经过编译-汇编-链接三个阶段.编译过程把C语言文本文件生成汇编程序,汇编过程把汇编程序形成二进制机器代码,链接过程则将各个源文件生成的二进制机器代码文件组合成一个文件.         C语言编写的程序经过编译-连接后,将形成一个统一格式的二进制可执行文件,这个格式是一个依照可执行文件格式的,可以被系统识别,并且加载到内存中执行的,它由几个部分组成.在程序运行时又会产生其他几个部分,各个部分代表了不同的存储区域: 静态区域(全局区域)

Java的内存布局

from:https://www.ibm.com/developerworks/cn/java/j-codetoheap/ 从 Java 代码到 Java 堆 理解和优化您的应用程序的内存使用 Chris Bailey, Java 支持架构师, IBM 简介: 本文将为您提供 Java 代码内存使用情况的深入见解,包括将 int 值置入一个Integer 对象的内存开销.对象委托的成本和不同集合类型的内存效率.您将了解到如何确定应用程序中的哪些位置效率低下,以及如何选择正确的集合来改进您的代码.

Go语言中的内存布局详解_Golang

一.go语言内存布局 想象一下,你有一个如下的结构体. 复制代码 代码如下: type MyData struct {         aByte   byte         aShort  int16         anInt32 int32         aSlice  []byte } 那么这个结构体究竟是什么呢? 从根本上说,它描述了如何在内存中布局数据. 这是什么意思?编译器又是如何展现出来呢? 我们来看一下. 首先让我们使用反射来检查结构中的字段. 二.反射之上 下面是一些使用

浅析内存对齐与ANSI C中struct型数据的内存布局_C 语言

这些问题或许对不少朋友来说还有点模糊,那么本文就试着探究它们背后的秘密. 首先,至少有一点可以肯定,那就是ANSI C保证结构体中各字段在内存中出现的位置是随它们的声明顺序依次递增的,并且第一个字段的首地址等于整个结构体实例的首地址.比如有这样一个结构体: 复制代码 代码如下:   struct vector{int x,y,z;} s;  int *p,*q,*r;  struct vector *ps;  p = &s.x;  q = &s.y;  r = &s.z;  ps

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

转自:http://blog.chinaunix.net/uid-25909619-id-3032209.html 当在C中定义了一个结构类型时,它的大小是否等于各字段(field)大小之和?编译器将如何在内存中放置这些字段?ANSI C对结构体的内存布局有什么要求?而我们的程序又能否依赖这种布局?这些问题或许对不少朋友来说还有点模糊,那么本文就试着探究它们背后的秘密.     首先,至少有一点可以肯定,那就是ANSI C保证结构体中各字段在内存中出现的位置是随它们的声明顺序依次递增的,并且第一

vs2008下C++对象内存布局(3):加上虚函数

这次我们为父类加上虚函数: class CParent { public: int parent_a; int parent_b; public: virtual void parent_f1() { parent_a = 0x10; } virtual void parent_f2() { parent_b = 0x20; } }; class CChild : public CParent { public: int child_a; int child_b; public: virtual

vs2008下C++对象内存布局(2):简单继承

这次我们添加一个子类,父类和子类均不带虚函数: class CParent { public: int parent_a; int parent_b; public: void parent_f1() { parent_a = 0x10; } void parent_f2() { parent_b = 0x20; } }; class CChild : public CParent { public: int child_a; int child_b; public: void child_f1

C++对象布局及多态实现探索之内存布局

为了便于分析和观察对象的内存布局,我把代码生成时的结构成员对齐选项设置为1字节,默认为8字节.如果你在自己的工程下编译文中的代码,请做同样的设置.因为我写了一些函数打印对象中的布局信息,如果对象选项不是1字节,运行这些代码会出现指针异常错误. 普通类对象的内存布局 首先我们从普通类对象的内存布局开始.c000为一个空类,定义如下: struct c000 {}; 运行如下代码打印它的大小及对象中的内容. print_size_detail(c000) 结果为: the size of c000