• 程序里的全局变量,如果它的初始值为0,或者没有设置初始值,这些变量被放在BSS段里
      • 对于初始值为0或没有设置初始值的全局变量,放在BSS段,在程序加载到内存时再对对应的空间进行清除
      • 这样是为了减小目标程序.bin文件的大小
      • image.png
    • 对于bss段,并不会放在bin文件中;只是记录BSS段的起始地址和结束地址,在使用变量之前将该段所对应的内存清零
    • 链接脚本中的bss段:

      1. . = ALIGN(4);
      2. __bss_start = .;
      3. .bss : { *(.bss) *(.COMMON) }
      4. __bss_end = .;
    • BSS段的起始地址、结束地址,使用__bss_start__bss_end来获得,它们是链接地址

    • 怎么清除BSS段:

      1. ldr r0, =__bss_start /* 目的 */
      2. mov r1, #0 /* 值 */
      3. ldr r2, =__bss_end
      4. sub r2, r2, r1 /* 长度 */
      5. bl memset /* r0: 目的, r1: 值, r2: 长度 */
      • 因为bin文件中没有bss段,所以没有数据的拷贝,也就没有源地址,因为不需要通过_start计算bss段的源地址