内存分配的一些心得
数据内存的主要位置:
.bss(Block Started by Symbol) |内存低地址
.data |
.code(or .text) |
.heap |
.stack |内存高地址
intel i386架构中,内存存放采用小端字节序来存放数据,所谓小端字节序是指低序字节低地址,高序字节高地址,高地址为数据增长方向。(小端字节序则相反
BSS是Unix链接器产生的未初始化数据段(有的编译器会把未出世的数据初始化为0)或者初始化为0的数据段。其他的段分别是包含程序代码的“text”段和包含已初始化数据的“data”段。BSS段的变量只有名 称和大小却没有值。此名后来被许多文件格式使用,包括PE。“以符号开始的块”指的是编译器处理未初始化数据的地方。BSS节不包含任何数据,只是简单的 维护开始和结束的地址,以便内存区能在运行时被有效地清零。BSS节在应用程序的二进制映象文件中并不存在。
在采用段式内存管理的架构中(比如intel的80x86系统),bss段(Block Started by Symbol segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域,一般在初始化时bss 段部分将会清零。bss段属于静态内存分配,即程序一开始就将其清零了。
比如,在C语言之类的程序编译完成之后,已初始化的全局变量保存在.data 段中,未初始化的全局变量保存在.bss 段中。
text和data段都在可执行文件中(在嵌入式系统里一般是固化在镜像文件中),由系统从可执行文件中加载;而bss段不在可执行文件中,由系统初始化。
.data 保存的变量是可以被更改的,这与 .rodata(read-only data)不同,他存放的是只读的data
.text包含了可执行程序的指令和指向内存区域的语句。一般而言,.text也是只读的。
数据内存的主要位置:
.bss(Block Started by Symbol) |内存低地址
.data |
.code(or .text) |
.heap |
.stack |内存高地址
intel i386架构中,内存存放采用小端字节序来存放数据,所谓小端字节序是指低序字节低地址,高序字节高地址,高地址为数据增长方向。(小端字节序则相反
BSS是Unix链接器产生的未初始化数据段(有的编译器会把未出世的数据初始化为0)或者初始化为0的数据段。其他的段分别是包含程序代码的“text”段和包含已初始化数据的“data”段。BSS段的变量只有名 称和大小却没有值。此名后来被许多文件格式使用,包括PE。“以符号开始的块”指的是编译器处理未初始化数据的地方。BSS节不包含任何数据,只是简单的 维护开始和结束的地址,以便内存区能在运行时被有效地清零。BSS节在应用程序的二进制映象文件中并不存在。
在采用段式内存管理的架构中(比如intel的80x86系统),bss段(Block Started by Symbol segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域,一般在初始化时bss 段部分将会清零。bss段属于静态内存分配,即程序一开始就将其清零了。
比如,在C语言之类的程序编译完成之后,已初始化的全局变量保存在.data 段中,未初始化的全局变量保存在.bss 段中。
text和data段都在可执行文件中(在嵌入式系统里一般是固化在镜像文件中),由系统从可执行文件中加载;而bss段不在可执行文件中,由系统初始化。
.data 保存的变量是可以被更改的,这与 .rodata(read-only data)不同,他存放的是只读的data
.text包含了可执行程序的指令和指向内存区域的语句。一般而言,.text也是只读的。