bss清零

bss段:Block Started by Symbol的简称,BSS段属于静态内存区,是指用来存放程序中未初始化的全局变量的一块内存区域。

 

遇到问题,问题未初始化全局变量和static变量不清0,eg:

+    static int is_irq_inited = 0;

+    if(is_irq_inited != 1) {
+        init_irq();
+        is_irq_inited = 1;
+    }

执行reboot后发现is_irq_inited = 1一直为1;

 

原因bss段没有初始化为0。

修改:

   +       __bss_start = .;
          .bss :
          {
                  *(.bss)
          }
          . = ALIGN(4);
 +         __bss_end = .;

 

+               /* clear .bss section */
+               ldr             r0, =__bss_start
+               ldr             r1, =__bss_end
+               mov             r2, #0
+1:
+               stmia           r0!, {r2}
+               cmp             r1, r0
+               bgt             1b

03-21
<think>好的,用户想了解BSS的概念和用途。我需要先回忆一下相关的知识点。BSS是程序内存中的一部分,用于存放初始化的全局变量和静态变量。根据之前提供的引用内容,BSS是“Block Started by Symbol”的缩写,属于静态内存分配区域。 首先,我应该明确BSS的作用。根据引用1和引用4,BSS存放的是初始化的全局变量,程序加载由内核清零。这样可以节省可执行文件的空间,因为不需要在文件中存储零值。例如,定义了一个全局变量int global_array[1000],如果在初始化没有赋值,它就会被放在BSS,而不是数据。 接下来需要解释BSS的特点。根据引用2和引用3,BSS在可执行文件中只记录大小,不实际占用空间。链接器会分配相应大小的内存,并在程序启动清零。这样设计的好处是减少磁盘上可执行文件的大小,尤其是对于大型初始化的数组或结构体。 还要比较BSS与数据的不同。数据(data)存放已初始化的全局和静态变量,而BSS存放初始化的。例如,int initialized = 10;会放在数据,而int uninitialized;则在BSS。 另外,用户可能想知道BSS在内存中的位置。根据引用2BSS紧跟在数据后面,两者合称为数据区。程序加载BSS会被初始化为零,这是由操作系统或加载器完成的。 还需要注意BSS的静态内存分配特性,如引用4提到的,BSS的大小由链接器根据程序中初始化变量的大小确定,用户无法在运行动态调整,但可以使用malloc等函数在堆上分配内存。 最后,应该举例子来帮助理解。比如定义多个初始化的全局变量,它们在BSS占据空间,但不会增加可执行文件的大小。而初始化过的变量则会增加文件大小。 总结起来,回答需要涵盖BSS定义、用途、与数据的区别、内存分配方式以及实际例子。同,要确保引用正确的来源,比如引用1到引用4中的相关内容,以增强回答的可信度。</think>### BSS的概念与用途 **BSS**(Block Started by Symbol)是程序内存布局中用于存储**初始化的全局变量和静态变量**的静态内存区域[^1][^4]。以下是其核心特点与作用: 1. **存储内容** - 存放程序中**显式初始化**的全局变量和静态变量。例如: ```c int global_uninit; // 初始化的全局变量,位于BSS static int static_uninit; // 初始化的静态变量,也位于BSS ``` - 已初始化的全局变量则存储在**数据(data)**中[^3]。 2. **内存初始化** - 程序加载,操作系统会将BSS的内存**自动清零**。例如,若定义`int array[1000];`,则系统会在运行分配内存并将其所有元素初始化0[^1]。 3. **节省可执行文件空间** - BSS在可执行文件中**仅记录大小**,而不实际存储零值数据。例如,一个初始化的全局数组`int buffer[1024];`不会增加可执行文件的体积,仅在运行分配内存[^2]。 4. **与数据的区别** - **数据**存储已初始化变量(如`int x = 5;`),内容直接写入可执行文件。 - **BSS**存储初始化变量,仅记录所需空间大小,运行动态分配并清零。 5. **内存布局示例** 程序的内存区域通常按以下顺序排列(从低地址到高地址): - **代码(text)**:存放可执行指令。 - **数据(data)**:存放已初始化数据。 - **BSS**:存放初始化数据。 - **堆(heap)**:动态分配的内存。 - **栈(stack)**:函数调用和局部变量。 --- ### 例子说明 假设定义以下变量: ```c int initialized = 10; // 在data,占4字节(假设int为4字节) char uninitialized[100]; // 在BSS,占100字节 ``` - 可执行文件中仅需存储`initialized`的值(10),而`uninitialized`仅记录需要100字节的BSS空间,不占用文件体积。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值