水面下面的冰山

水面下面的冰山

本文摘自于渊编著的《orange's一个操作系统的实现》一书


    即便是非常袖珍的程序,也有可能遇到不能正确运行的情况,对此你一定并不惊讶,谁都可能少写一个标点,或者在一个小小的逻辑问题上犯迷糊。好在我们可以调试,通过调试,可以发现错误,让程序日臻完美。但是对于操作系统这样的特殊程序,我们没有办法用普通的调试工具来调试。可是,哪怕一个小小的引导扇区,我们也没有十足的把握一次就写好,那么,遇到不能正确运行的时候该怎么办呢?在屏幕上没有看到我们所要的东西,甚至于机器一下子重启了,你该如何是好呢?
     每一个问题都是一把锁,你要相信,世界上一定存在一把钥匙可以打开这把锁。你也一定能找到这把钥匙。
    一个引导扇区代码可能只有20行,如果Copy&Paste的话,10秒钟就搞定了,即便自己敲键盘抄一遍下来,也用不了10分钟。可是,在遇到一个问题时,如果不小心犯了小错,自己到运行时才发现,你可能不得不花费10个10分钟甚至更长时间来解决它。笔者把这20行的程序称做水面以上的冰山,而把你花了数小时的时间做的工作称做水面下的冰山。
    古人云:“授之以鱼,不如授之以渔。”本书将努力将冰山下的部分展示给读者。这些都是笔者经历了痛苦的摸索后的一些心得,这些方法可能不是最好的,但至少可以给你提供一个参考。好了,就以我们刚刚完成的引导扇区为例,你可以想像得到,将来我们一定会对这20行进行扩充,最后得到200行甚至更多的代码,我们总得想一个办法,让它调试起来容易一些。
    其实很容易,因为有Bochs,我们前面提到的虚拟机,它本身就可以作为调试器使用。请允许我再次卖一个关子,留待下文分解。但是请相信,调试一个引导扇区──甚至是一个操作系统,在工具的帮助下都不是很困难的事情。只不过跟调试一个普通的应用程序相比,细节上难免有一些不同。
    如果你使用的是Windows,还有个可选的方法能够帮助调试,做法也很简单,就是把“org 07c00h”这一行改成“org 0100h”就可以编译成一个.COM文件让它在DOS下运行了。我们来试一试,首先把07c00h改成0100h,编译:
    $ nasm boot.asm –o boot.com
    好了,一个易于执行和调试的引导扇区就制作完毕了。如果你是以DOS或者Windows为平台学习的编程,那么调试.COM文件一定是你拿手的工作,比如使用Turbo Debugger。
调试完之后要放到软盘上进行试验,我们需要再把0100h改成07c00h,这样改来改去比较麻烦,好在强大的NASM给我们提供了预编译宏,把原来的“org 07c00h”一行变成许多行即可:
    1 ;%define _BOOT_DEBUG_   ; 制作Boot Sector 时一定将此行注释掉!
    2                         ; 去掉此行注释后可做成.COM文件易于调试:
    3                         ; nasm Boot.asm -o Boot.com
    4
    5 %ifdef _BOOT_DEBUG_
    6         org 0100h       ; 调试状态, 做成.COM 文件, 可调试
    7 %else
    8         org 07c00h      ; BIOS 将把Boot Sector 加载到0:7C00 处
    9 %endif
    这样一来,如果我们想要调试,就让第一行有效,想要做引导扇区时,将它注释掉就可以了。
这里的预编译命令跟C语言差不多,就不用多解释了。
    至此,你不但已经学会了如何写一个简单的引导扇区,更知道了如何进行调试。这就好比从石器时代走到了铁器时代,宽阔的道路展现在眼前,运用工具,我们有信心将引导扇区不断扩充,让它变成一个真正的操作系统的一部分。
回顾
    让我们再回过头看看刚才那段代码吧,大部分代码你一定已经读懂了。如果你还是一个NASM新手,可能并不是对所有的细节都那么清晰。但是,毕竟你已经发现,原来可以如此容易地迈出写操作系统的第一步。
是啊,这是个并不十分困难的开头,如果你也这样认为,就请带上百倍的信心,以及一直以来想要探索OS奥秘的热情,随我一起出发吧!

 

posted @ 2009-05-19 14:21  我的javaIT  阅读(209)  评论(0编辑  收藏  举报