读书人

数据段,BSS段的内存初始化有关问题

发布时间: 2012-09-06 10:37:01 作者: rapoo

数据段,BSS段的内存初始化问题

请问下下面的结论对不?
1 C51单片器、ARM7:编译器连接后会自动添加部分代码将数据段,BSS段的初始化信息(可能包括BSS段的清零)加在代码段中,代码在ROM中运行时会先分配初始化数据段及bss段。

2 ARM9同样如上,bootloader程序会加载镜像文件(只有代码段,数据段和BSS段的初始化在代码段中)到RAM,系统运行在RAM中时才会根据代码段中的初始化来分配数据段,BSS段并初始化。

3 PPC的gcc编译器将代码段,数据段,BSS段(并不给该段的数据分配空间,只是记录数据所需空间的大小)已经分段好,bootrom可以选择将代码段、数据段(基于ROM镜像) 或 只代码段(rom驻留型镜像)加载到ram中,像代码段(usrInit.c)中手动添加了BSS段的清零代码。

谢谢!



[解决办法]
这个跟芯片无关的
而是跟操作系统(linux/win ==),运行文件的格式(a.out ELF PE)相关
gcc编译出的ELF , bss并不占用磁盘空间的。
全局变量的初始化,是在main函数之前开始的。

1 51单片机木有操作系统,它的程序有木有分段,如何分,不清楚。
2 bootloader加载的内核镜像是kernel,所以它又有所不同,它分的段比较多, 如模块的__init 区,
个人人为其bss的原理应该是与ELF的一致。
3 bootrom没有用过, 也不清楚其原理, 但是它的功能是可以实现的。

[解决办法]
楼主如果从创建进程开始,一直单步跟踪到进入该进程main函数之前,我猜就会豁然开朗了。
[解决办法]
这些细节和具体的编译器和链结器有关系.
通常做嵌入式开发的人需要了解这些细节.
要了解这些细节,需要学习:
. ELF规范(ABI: Application Binary Interface);
ELF规范又分3个层次:
a. 芯片架构相关的ELF规范;
b. 通用层,可参考文档 《Executable and Linking Format (ELF) Specification》;
c. 操作系统接口层.
. 编译器原理,Linker & Loader原理;
编译器的参考书籍很多,龙书什么的。
Linker & Loader的参考书籍有《Linkers and Loaders》。
这些书都是对编译器以及Linker & Loader通用理论的介绍,实际当中
还要参考具体编译器材和Linker的手册。
. 学习Linker Script。如gld的Script,比较流行。另外还有ArmLinker的Script.
. 结合工具如readelf, objdump等来分析.obj,.elf的段结构。
至于你描述的.bss等什么,都可以通过Linker Script来控制。
至于.bss的初始化什么的,是程序代码做的事情,通常是结果Linker导出的符号进行.bss的初始化。
而这些代码通常都封装到了bootloader之类的东西里面。

如果的PC平台大多数平台都支持ELF规范,而Windows平台则支持PE32和最新的PE64。

[解决办法]

探讨
感谢大家回答!
可能这里我写的宽泛不具体。比如以PPC上的vxWorks系统为例,我们生成的image文件有几种,其中
基于ROM的bootloader将其代码段和数据段都拷贝到RAM中
基于ROM驻留型的image文件bootloader只将其数据段拷贝到RAM中
image文件分为三部分text,data,bss(不占空间,在运行C程序中扩展为全零),这些空间的分配是由编译器分开的吧?……

[解决办法]
个人意见楼主不学汇编是不可能弄懂这个问题的。

读书人网 >C语言

热点推荐