程序中的数据段、代码段、栈段各⾃的作⽤。
对任何⼀个普通进程来讲,它都会涉及到5种不同的数据段。归纳⼀下进程对应的内存空间中所包含的5种不同的数据区都是⼲什么的。
BSS段:BSS段(bss segment)通常是指⽤来存放程序中未初始化的全局变量的⼀块内存区域。BSS是英⽂Block Started by Symbol的简称。BSS段属于静态内存分配。
数据段:数据段(data segment)通常是指⽤来存放程序中已初始化的全局变量的⼀块内存区域。数据段属于静态内存分配。
代码段:代码段(code segment/text segment)通常是指⽤来存放程序执⾏代码的⼀块内存区域。这部分区域的⼤⼩在程序运⾏前就已经确定,并且内存区域通常属于只读, 某些架构也允许代码段为可写,即允许修改程序。在代码段中,也有可能包含⼀些只读的常数变量,例如字符串常量等。
堆(heap):堆是⽤于存放进程运⾏中被动态分配的内存段,它的⼤⼩并不固定,可动态扩张或缩减。当进程调⽤malloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当利⽤free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)
栈(stack):栈⼜称堆栈,是⽤户存放程序临时创建的局部变量,也就是说我们函数括弧“{}”中定义的变量
(但不包括static声明的变量,static 意味着在数据段中存放变量)。除此以外,在函数被调⽤时,其参数也会被压⼊发起调⽤的进程栈中,并且待到调⽤结束后,函数的返回值也会被存放回栈中。由于栈的先进后出特点,所以栈特别⽅便⽤来保存/恢复调⽤现场。从这个意义上讲,我们可以把堆栈看成⼀个寄存、交换临时数据的内存区。
molloc函数全局的未初始化变量存在于.bss段中,具体体现为⼀个占位符;全局的已初始化变量存于.data段中;⽽函数内的⾃动变量都在栈上分配空间。.bss是不占⽤.exe⽂件空间的,其内容由操作系统初始化(清零);⽽.data却需要占⽤,其内容由程序初始化,因此造成了上述情况。
bss段(未⼿动初始化的数据)并不给该段的数据分配空间,只是记录数据所需空间的⼤⼩。
data(已⼿动初始化的数据)段则为数据分配空间,数据保存在⽬标⽂件中。数据段包含经过初始化的全局变量以及它们的值。BSS段的⼤⼩从可执⾏⽂件中得到,然后链接器得到这个⼤⼩的内存块,紧跟在数据段后⾯。当这个内存区进⼊程序的地址空间后全部清零。包含数据段和BSS段的整个区段此时通常称为数据区。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论