突然要为bss段写点东西 ,虽然也就那么一两句话 ,但是之前我确实是一直不是怎么明白 , 其实是因为我在写bootloader的时候在清零bss段时出现了问题 ,具体什么问题。其实也没什么的。
1、bss段是用来存放未被初始化的全局变量 ,这个相信大家都是知道的。我也一直都看到bss段就是用来放未被初始化的全局变量 这几个字段。 但是也就知道而已。具体还没自己特意去观察过。其实链接器在链接的过程中会从编译好了的文件得知代码中到底使用了多少未被初始化的全局变量,或者初始化为0的全局变量(即使以后有些会被赋值),然后根据这几个全局变量的大小来决定bss段大小
如下,我定义了7个未初始化的全局变量:
int i;
int b;
int c;
int d;
int e;
int f;
int w;
然后汇编出来如下,第一段的33f80740是bss段的起始地址 , 第二段的33f8075c是bss段的结束地址 ,由33f8075c - 33f80740 = 1C,也就是28个字节,刚好对应了上面7个32位整数。这里需要主要在清零bss段的时候,一定要注意如果没有未初始化或者初始化为0的全局变量的时候,bss是为0的。
33f800fc: 33f80740 mvnscc r0, #16777216 ; 0x1000000
33f80100: 33f8075c mvnscc r0, #24117248 ; 0x1700000