1 / 10
文档名称:

bss段,代码段及数据段的区别.doc

格式:doc   页数:10页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

bss段,代码段及数据段的区别.doc

上传人:rabbitco 2016/5/30 文件大小:0 KB

下载得到文件列表

bss段,代码段及数据段的区别.doc

文档介绍

文档介绍:一个程序本质上都是由 bss 段、 data 段、 text 段三个组成的。这样的概念, 不知道最初来源于哪里的规定,但在当前的计算机程序设计中是很重要的一个基本概念。而且在嵌入式系统的设计中也非常重要, 牵涉到嵌入式系统运行时的内存大小分配, 存储单元占用空间大小的问题。在采用段式内存管理的架构中(比如 inte l的 80x8 6 系统), bss段( Block Started by Symbol segment )通常是指用来存放程序中未初始化的全局变量的一块内存区域,一般在初始化时 bss 段部分将会清零。 bss 段属于静态内存分配,即程序一开始就将其清零了。比如,在 C 语言之类的程序编译完成之后, 段中, 段中。在《 Programming ground up 》 的解释为: There is another section called the .bss. This section is like the data section, except that it doesn ’t take up space in the executable. text 和 data 段都在可执行文件中(在嵌入式系统里一般是固化在镜像文件中) ,由系统从可执行文件中加载;而 bss 段不在可执行文件中,由系统初始化。【例一】< XMLNAMESPACE PREFIX ="O" /> 用 cl 编译两个小程序如下: 程序 1: int ar[30000]; void main() { ...... } 程序 2: int ar[300000] = {1, 2, 3, 4, 5,6 }; void main() { ...... } 发现程序 2 文件比程序 1 的要大得多。当下甚为不解, 于是手工编译了一下,并使用了/FAs ,发现在程序 中 ar的定义如下: _BSS SEGMENT ?ar@***@3PAHA DD 0493e0H DUP (?) ; ar _BSS ENDS 而在程序 中, ar 被定义为: _DATA SEGMENT ?ar@***@3PAHA DD 01H ; ar DD 02H DD $+1199988 _DATA ENDS 区别很明显, 段, 段, 两者的区别在于: 段中, 具体体现为一个占位符; 段中; 而函数内的自动变量都在栈上分配空间。.bss 文件空间的, 其内容由操作系统初始化(清零) ; 却需要占用,其内容由程序初始化,因此造成了上述情况。【例二】编译如下程序( ): #include <> #define LEN 1002000 int inbss[LEN]; float fA; int indata[LEN]={1,2,3,4,5,6,7,8,9}; double dbB = ; const int cst = 100; int main(void) { int run[10