初始化的全局变量一定放在.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行。

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

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

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

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

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

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

作者:gfree.wind@gmail.com 博客:linuxfocus.blog.chinaunix.net 最近正在重温《程序员的自我修养》一书,由于水平比以前有所提升,所以读书...

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

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

C/C++ --- 全局变量初始化总结

注意:本文所说的全局变量指的是 variables with static storage,措词来自 c++ 的语言标准文档。什么时候初始化根据 C++ 标准,全局变量的初始化要在 main 函数执行...

全局变量与局部变量初始化问题

头文件: [cpp] view plaincopyprint? #ifndef FRIEND_H   #define FRIEND_H   struct X;    &#...

读写全局变量

discuz $_G 全局变量

  • 2013-09-01 15:50
  • 86KB
  • 下载

Lesson_for_java_day08--面向对象、重载和构造函数、this关键字的使用以及八大类在全局变量初始化中的值

一、面向对象的思想、重载和构造函数、th
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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