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

学过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行。

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值