链接全局变量再说BSS段的清理

本文探讨了裸机程序中全局变量的存储位置及其影响,通过对比分析链接脚本使用前后的情况,验证了BSS段对于全局变量的重要性,并解释了其如何影响变量的链接地址。

废话就不多说了,开始。。。

    再说BSS段的清算

    


    

        以前遇到一个裸机程序不能改变全局变量值的问题,最后模模糊糊处理了:手动添加了一个链接脚本,清算了BSS段。问题得以处理,就认定是BSS段清算的问题,全局变量在BSS段中。

    


    

       但是现在看这个论断下的有点不全面。根据名著上说BSS段是放未初始化或者初始化为0的全局变量(经手动证实无误),我不想着有问题了。那么把这个功绩全归于BSS段的清算仿佛有点勉强了。

    


    

       为了验证一下,重新翻出以前的裸机程序,再来看看,这次只添加一个链接脚本,不清算BSS段,结果发现程序也是正常的,这下就完全的证实了我的假设。本来功绩是“链接脚本”的。但是这位链接脚本是在u-boot中提取的没有仔细分析。

    


    每日一道理
青春,有嬉笑声与哭泣声夹杂的年华,青春的少年是蓝天中翱翔的幼鹰,虽然没有完全长大,有些稚气,有些懵懂,脱不开父母的双手却极力想去找寻属于自己的一片天空,为的是一时的激情,为的是一种独自翱翔的感觉!

    

       现在退回到没有处理这个问题之前,经过《 实例说明C语言中初始化和未初始化的全局变量地点不同的段》这个文章,肯定初始化为0的全局变量是存在BSS段的,想到查看一下用objdump生成的dis文件,看到下图所示:

    

  链接和全局变量

    


    

      全局变量g_val的链接地址是0x8080(32.125k)超出了CPU内部的内存大小(4k)。再看一下加上链接脚本的g_val的链接地址:

    

链接和全局变量

    


    

      可以看到链接地址是小于4k的。所以能够改动了。

文章结束给大家分享下程序员的一些笑话语录: 有一天,一个男人穿越森林的时候,听到一个细微的声音叫住他。他低头一看,是一只青蛙。
“如果你亲我一下,我会变成一个美丽的公主哦。”男人一言不发,把青蛙捡起来,放入口袋。
“如果你亲我一下,我会变成一个美丽的公主哦。而且,我会告诉我遇到的每一个人,你是多么聪明和勇敢,你是我的英雄。”男人把青蛙拿出来,对着它微微一笑,又把它放回口袋。
“如果你亲我一下,我会变成一个美丽的公主,然后我愿意成为你的爱人一星期。”男人又把青蛙拿出来,对着它微微一笑,把它放回口袋。
“如果你亲我一下,我会变成一个美丽的公主,然后我愿意成为你的爱人一年,而且你可以对我做任何事。”再一次,男人把青蛙拿出来,对着它微微一笑,又把它放回口袋。
  最后,青蛙无力地问:“我开出了这么好的条件,为什么你还不肯吻我?”男人说:“我是一个程序员,我可没时间和什么公主鬼混。不过,拥有一个会说话的青蛙,倒是蛮酷的。”

转载于:https://www.cnblogs.com/jiangu66/archive/2013/05/17/3084507.html

<think>好的,我现在需要回答用户关于全局变量在进程虚拟地址空间中的存储位置的问题,包括数据BSS,以及初始化与未初始化全局变量的区别,还有局部变量的区别。首先,我需要回忆相关的知识点,并参考用户提供的引用内容。 根据用户提供的引用[1],全局变量区和静态变量区是存储在一起的,初始化的和未初始化的分在两个相邻区域。引用[2]提到数据存放已初始化的全局变量BSS存放未初始化的,且在程序加载时会被清零。引用[3]进一步说明数据存储已初始化的全局变量和静态局部变量,属于静态内存分配。而局部变量通常存储在栈区,这点可能在引用[4]中提到,但用户的问题中没有直接引用,可能需要结合自己的知识补充。 接下来,我需要组织这些信息,确保结构清晰。首先说明全局变量的存储位置,分为数据BSS,解释两者的区别。然后对比局部变量,指出它们存储在栈区,生命周期和作用域的不同。最后总结它们的区别,包括存储位置、初始化、生命周期和作用域。 需要注意用户的问题中提到的“进程虚拟地址空间”,所以在回答时要明确指出各个属于该空间的哪一部分。同时,要正确引用提供的参考文献,例如引用[1]、[2]、[3]对应的内容,确保标注正确。此外,按照用户的系统级指令,所有数学表达式使用$...$格式,独立公式用$$...$$,但这个问题可能不需要数学公式,但需要注意中文回答和生成相关问题。 最后,生成三个相关问题,需要与主题相关,比如存储布局、初始化和未初始化的处理、局部变量与全局变量的对比。确保问题符合用户的要求,并放在最后。</think>在进程的虚拟地址空间中,全局变量的存储位置与其初始化状态密切相关: 一、全局变量存储位置 1. **已初始化的全局变量**:存储在数据(data) - 包含显式初始化为非零值的全局变量和静态局部变量 - 在程序加载时直接读取初始值,如:$int g_init = 10;$[^3] 2. **未初始化的全局变量**:存储在BSS(Block Started by Symbol) - 包含初始化为零或未显式初始化的全局变量 - 在程序加载时统一清零,如:$int g_uninit;$[^2] $$ \text{虚拟地址空间布局} = \begin{cases} \text{代码} \\ \text{数据} \\ \text{BSS} \\ \text{堆} \\ \text{栈} \\ \text{内核空间} \end{cases} $$ 二、与局部变量的核心区别 1. **存储位置** - 全局变量:数据/BSS(静态存储区) - 局部变量:栈区(动态存储区) 2. **生命周期** - 全局变量:从程序启动到终止 - 局部变量:函数调用期间存在 3. **初始化特性** - 全局未初始化变量会被自动清零(BSS特性)[^2] - 局部未初始化变量包含随机值 三、内存分配示意图 ``` 高地址 → 内核空间 ↓ 栈(局部变量) ↓ 堆(动态内存) ↓ BSS(未初始化全局变量) ↓ 数据(已初始化全局变量) 低地址 → 代码 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值