BSS 段:BSS(Block Started by Symbol)段通常是指用来存放执行程序中未初始化的全局变量的一块存储区域。BSS 段属于静态内存分配的存储空间。
数据段:数据段(Data Segment)通常是指用来存放执行程序中已初始化的全局变量的一块存储区域。数据段属于静态内存分配的存储空间。
代码段:代码段(Code Segment/Text Segment)通常是指用来存放程序执行代码的一块存储区域。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读,某些 CPU 架构也允许代码段为可写,即允许修改程序。在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。
和一般应用程序一样,首先是保存在像硬盘这样的非易失性存储介质上,当需要运行时,被加载到内存中。这时,需要把代码段、数据段的内容拷贝到内存中。对于位于BSS 段中的未初始化的全局变量,执行程序一般认为其值为零。所以需要把 BSS 段对应的内存空间清零,确保执行代码的正确运行。可查看 init 文件中的 kern_init 函数的第一个执行语句“memset(edata, 0, end-edata);”
以下脚本将输出文件的text section定位在0x10000, data section定位在0x8000000:
SECTIONS {
. = 0x10000;
.text : { *(.text) }
. = 0x8000000;
.data : { *(.data) }
.bss : { *(.bss) }
}
解释一下上述的例子:
. = 0x10000 : 把定位器符号置为0x10000 (若不指定, 则该符号的初始值为0).
.text : { *(.text) } : 将所有(*符号代表任意输入文件)输入文件的.text section合并成一个.text section, 该section的地址由定位器符号的值指定, 即0x10000.
. = 0x8000000 :把定位器符号置为0x8000000
.data : { *(.data) } : 将所有输入文件的.text section合并成一个.data section, 该section的地址被置为0x8000000.
.bss : { *(.bss) } : 将所有输入文件的.bss section合并成一个.bss section,该section的地址被置为0x8000000+.data section的大小.
连接器每读完一个section描述后, 将定位器符号的值*增加*该section的大小. 注意: 此处没有考虑对齐约束.