解决一个两年前的 Bug

现在好像整天都在找 Bug。。。
主要是因为目前的工作基本是把以前我在 Lingix 中写的代码移植到 ANOS 中来。
所以今天就解决一个那时遗留下来的 Bug 当时的一个 ??? 注释:
Lingix/driver/keyboard.c 的 kbd_getkeyqueue() 函数。
究其原因,是因为编译时使用了优化,一般优化和 inline 内嵌函数优化一起造成的。
而让优化器做出错误优化的原因是 keyboard.c 是中断服务程序。
中断服务程序中使用的变量会被随时(因为中断触发)而改变值。
而优化器认为这些值在已知程序段不会改变,直接优化掉了一些比较跳转操作。
这些关键的比较跳转没有了后,形成了一个死循环。
要解决这个问题,就应该使用 C 关键字 volatile 来声明这些变量,告诉编译器(优化器)这些变量会因为外部因素(中断调用时)而改变,对其优化有限制。
这样,优化器就不会优化掉那些比较跳转,而是老老实实的一一执行。
死循环也就不会产生。Bug 也随之而去。。。

自由使用内存的 Bug

这是我有史以来遇到的最恐怖的 Bug: 我把正在执行的代码给擦掉了~~~
系统中断服务表 IDT 需要 2K 空间,不想在程序中定义,就想着直接使用空余的内存空间。鬼使神差的想到 BOOT(7C00h)和内核代码(8000h)之间还有一段空区,就用上了。根本不注意到这段空区(7E00h – 7FFFh) 和 BOOT 一样只有 512 (0.5K) 字节。于是等我傻里傻气的清零 2K 的内存时,内核代码被清零了(7E00h + 2K > 8000h),包括正在执行这段清零操作的代码。QEMU 模拟器报错,弹出对话框来。天啊,不晓得在真是机器上执行会怎样,幸好有模拟器,庆幸!
昨天一晚上都牵挂着浅浅 x_x ,没有心思研究为什么有怎么严重的出错。后来便放弃了清零操作,只是对 INTEL 保留异常向量表进行处理,也就是 0 – 31 号的 256 个字节。呵呵。这样子没有影响到内核的代码,于是乎,发布了 ANOS 0.03 赶着好安心睡觉。
奇怪的是,早晨醒来时,不知为什么想起这个来。突然一下明白 7E00h 到 7FFFh 根本不到 2K 空间。。。
😀 真的是真的是很恐怖的错误!

学习保持党员先进性真好

🙂 嘿嘿,真的很好。偶是这次先进性教育的直接受益者。哈哈。
小舅舅、舅妈来汉,晚上一起吃饭。正值新闻联播时间,两会正热。弟弟就问小舅妈,下面的政协开会没。小舅妈说,去年底就开了。当了十几年的政协代表,开会就那么回事。然后自然扯到当前正如火如荼的保持共产员先进性学习活动(新闻联播也正放着,呵呵)。小舅妈就说弟弟,你不是休假回家,现在不在部队里天天搞学习、写心得体会。我吃饭吃的笑了起来,说,这个学习真好,我们老板天天在公司学习在,一个星期多没到库里来了。妈妈接口道,难怪你这段时间下班回家没有叫这怨那了。我哈哈大笑,说,他们不来仓库指东划西蛮好,大家都安生。
真是托保持党员先进性学习的福。愿学习越长久越好,让教育来的更猛烈一些吧~~~
😀 😀 😀 😀 😀 哈哈哈哈哈~~~