- 程序里的全局变量,如果它的初始值为0,或者没有设置初始值,这些变量被放在BSS段里
- 对于初始值为0或没有设置初始值的全局变量,放在BSS段,在程序加载到内存时再对对应的空间进行清除
- 这样是为了减小目标程序.bin文件的大小
- 对于bss段,并不会放在bin文件中;只是记录BSS段的起始地址和结束地址,在使用变量之前将该段所对应的内存清零
链接脚本中的bss段:
. = ALIGN(4);
__bss_start = .;
.bss : { *(.bss) *(.COMMON) }
__bss_end = .;
BSS段的起始地址、结束地址,使用
__bss_start
和__bss_end
来获得,它们是链接地址怎么清除BSS段:
ldr r0, =__bss_start /* 目的 */
mov r1, #0 /* 值 */
ldr r2, =__bss_end
sub r2, r2, r1 /* 长度 */
bl memset /* r0: 目的, r1: 值, r2: 长度 */
- 因为bin文件中没有bss段,所以没有数据的拷贝,也就没有源地址,因为不需要通过_start计算bss段的源地址