1、BSS段的作用
初始化的全局变量:数据段
局部变量: 栈
malloc:堆
未初始化的全局变量:bss段
bss.c
-
#include <stdio.h>
-
-
int year;
-
-
int main()
-
{
-
year = 2014;
-
return year;
-
}
[root@localhost lesson11_bss]# arm-linux-gcc -c bss.c -o bss
[root@localhost lesson11_bss]# arm-linux-readelf -a bss >dump
-
80: 00008410 0 NOTYPE GLOBAL DEFAULT ABS __exidx_end
-
81: 00010528 0 OBJECT GLOBAL HIDDEN 22 __dso_handle
-
82: 00010530 4 OBJECT GLOBAL DEFAULT 23 year 10530是year的位置
-
83: 00010534 0 NOTYPE GLOBAL DEFAULT ABS __end__
-
84: 00008384 116 FUNC GLOBAL DEFAULT 12 __libc_csu_init
-
85: 00010534 0 NOTYPE GLOBAL DEFAULT ABS __bss_end__ 结尾是10534
-
86: 0001052c 0 NOTYPE GLOBAL DEFAULT ABS __bss_start 起始是1052c,所以year在bss段中
-
87: 00010534 0 NOTYPE GLOBAL DEFAULT ABS _bss_end__
2、未初始化的变量,需要全部清零
-
clean_bss:
-
ldr r0, =bss_start bss_start是起始地址,在gboot.lds中获得的
-
ldr r1, =bss_end bss_end是结束地址,在gboot.lds中获得的
-
cmp r0,r1 比较r0,和r1
-
moveq pc,lr 如果相同就跳转回bl clean_bss
-
-
clean_loop:
-
mov r2, #0 设置r2为0
-
str r2, [r0], #4 初始化r0指向的内容,并将r0往下移动一格
-
cmp r0,r1 比较r0,r1
-
bne clean_loop 如果不相同就循环clean_loop
-
mov pc,lr 跳转回bl clean_bss
阅读(1097) | 评论(0) | 转发(0) |