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

 我来答
众神_暧昧110
2013-11-02 · 超过62用户采纳过TA的回答
知道答主
回答量:117
采纳率:0%
帮助的人:146万
展开全部
学过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行。
大家可以看出来,这个说法其实是我的猜测,所以还是需要实际验证。但我想应该是这样的。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式