初始化的全局变量一定放在.data段中吗?

原创 2006年05月28日 21:33:00

学过C语言的都知道,已经初始化的全局变量是放在.data段中的,没有初始化的全局变量是放在.bss段中的。一直以来我也是这么认为的,但在开发MyOS的过程中,一些明明已经初始化的数据在执行时得到的却是随机值,使我对这个说法产生了怀疑。例如,在MyOS的VBE驱动中,背景色明明设成了黑色,可系统启动后屏幕却是红色的。昨天,在真机上调试最新的MyOS代码时,任务调度老是调度不到别的线程去,只有一个Idle线程在跑。输出了很多的调试信息,可就是找不到哪错了。最后发现,系统的确是进行调度了,可被选中的新的线程还是Idle线程。而进程和线程管理的代码经过检查是没错的。而且还有一个奇怪的现象就是在调试信息中为了看到系统的确的不断输出,我在每个输出语句后加了一个从0开始不断增加的数,每次输出就递增,这样就能看到变化了。在VMWare上,工作的很好,是从0开始递增的,可在真机上是从一个很大的数开始递增的。就在我即将崩溃之际,突然想到是不是flag这个控制线程创建的全局变量也没有按照我想的那样初始为0,导致根本没有别的线程被创建,所以就只有Idle一个线程在运行。当我把flag设成局部变量后,系统就正常了。

我猜想是不是编译器发现变量是被初始化成了0,所以就把变量放到.bss段中了。因为.bss段一般情况下会清0的。所以,编译器认为没有必要把这个变量放在.data段中。而MyOS在启动的时候,并没有把.bss段占用的内存清0。因为我一直认为.bss段中放的是未初始化的数据,清不清0关系不大,只要我保证在使用时初始化就是了。没想到编译器把已经初始化为0的变量也放到了.bss段中了。

当然,这样可以减少可执行文件的体积。而且正如上面所说,一般的系统都会把.bss段清0,所以不会有问题。而MyOS是个操作系统,没有人帮我们把它清0,才出现了上面说到的很多问题。

接下来的几天,应该修复MyOS的这个Bug,添加把.bss段清0的代码。当然,只需4行C代码即可,即时是汇编也不会超过10行。

大家可以看出来,这个说法其实是我的猜测,所以还是需要实际验证。但我想应该是这样的。

相关文章推荐

刨根问底:C++中未初始化全局变量为什么都会被编译器自动置0

有这个疑问很久了今天搜了一上午资料想知道为什么。

全局/静态变量初始化为0放在bss段还是data段

2013-6-4上午去面试,被鄙视了,技术公司大牛的风范,好犀利!不过我这题应该是蒙对了。。   如:static unsigned char s_test = 0; 这个静态变量是...

VC++全局变量初始化-16.09.26

  • 2016年09月26日 12:26
  • 64KB
  • 下载

在Linux 系统中,在运行一个程序时,程序中未初始化的全局变量会被加载到以下哪个内存段中?

BSS(Block Started by Symbol)通常是指用来存放程序中未初始化的全局变量和静态变量的一块内存区域。特点是:可读写的,在程序执行之前BSS段会自动清0。所以,未初始的全局变量在程...

通过未初始化全局变量,研究BSS段和COMMON段的不同

本文的copyleft归gfree.wind@gmail.com所有,使用GPL发布,可以自由拷贝,转载。但转载请保持文档的完整性,注明原作者及原链接,严禁用于任何商业用途。 作者:gfree.wi...

通过未初始化全局变量,研究BSS段和COMMON段的不同

本文的copyleft归gfree.wind@gmail.com所有,使用GPL发布,可以自由拷贝,转载。但转载请保持文档的完整性,注明原作者及原链接,严禁用于任何商业用途。 作者:gfree.wi...
  • zhaozzy
  • zhaozzy
  • 2014年03月26日 15:33
  • 547

通过未初始化全局变量,研究BSS段和COMMON段的不同

最近正在重温《程序员的自我修养》一书,由于水平比以前有所提升,所以读书的收获也不一样。 下面针对该书3.3.3节BSS段的内容进行更细节的探讨——该节内容不在本文中重复说明了,只说一...

读写全局变量

  • 2013年09月29日 11:46
  • 8KB
  • 下载

discuz $_G 全局变量

  • 2013年09月01日 15:50
  • 86KB
  • 下载

nginx源码分析—全局变量ngx_cycle的初始化

作者:阿波 链接:http://blog.csdn.net/livelylittlefish/article/details/7247080 Content 0.序 1. ngx_cycl...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:初始化的全局变量一定放在.data段中吗?
举报原因:
原因补充:

(最多只允许输入30个字)