haha,我读《自己动手写操作系统》的时候也碰到同样的问题,不过我读的是第一版
。
最初读发现这本书的时候很激动,是一个实践性很强的书。粗略读了第一章,就激动的开始在xp下配置好开发环境,编写了第一个实验。
后来,看着书,心情好时自己敲代码编译,更多时候直接拷贝光盘里的代码,修修改改再编译运行。
因为我学习习惯的是通过 简单修改几个值,再编译运行,查看产生的效果变化 以此来学习的。但按照书上介绍的开发环境编译书里的代码,再执行周期很大(主要是我没完全搭建好环境,每次修改编译后,都要重新启动虚拟机和里面的DOS,然后执行编译后的程序),时间久了就变得懒了,不再对书上的实验代码进行修改测试。而只是看书,于是到了第三章就越来越看不懂了
。
放下几个月后,重新拾起勇气再拿起书研究,这回下了很大决心,先将前3,4,5章的所有代码都打印出来(好厚一打),整理好,一个实验一个实验一句一句看,用笔勾画出调用关系图(主要是我当初汇编不扎实,所以当初对复杂些的汇编程序就晕了)。
这样,我对书上第三章大部分都能看明白了。但是依然不会凭借理解去自己写,因此心里也没什么底,看久了又放下。
再后来,我偶然情况下,发现了在xp下搭建能够快速编译测试的开发平台方法。于是我将书上的实验一个个搬到新的平台上重新做一遍,因为编译器改了,实验的大题内容结构不变,但许多细节都要改动。结果许多用nasm编写很简单的地方,在新的编译器上却出现许多问题。于是只有使用bochsdbg.exe一点点调试。如此一个个实验做下来。我对第三章的内容就了解得比较透彻了。此时我可以根据自己的想法随意改动程序编写自己的实验例子了。
《自己动手写操作系统》里的第三章最为重要,看懂了里面的所有实验,32位保护模式的核心内容就明白了。后面的章节的内容,基本上就不会有什么大的问题。
最近在看linux0.12代码。因为没有一个个实验做来逐步了解。学习的方法为:1.看书上对模块功能的解释,2.逐行代码阅读,将代码与解释(注释)对上号,3.使用bochsdbg.exe调试,设断点,单步执行等,并根据代码功能查看寄存器与内存变化。
总结来说学习的方法有两种:
1.根据书上的例子自己动手写实验(完全照书上敲代码,不是实验,是练习打字),需要有自己的理解,存在错误了要想办法调试找出来。
2.不想动脑经编写实验(或条件不允许),那么就边阅读代码,并且尽可能通过调试验证代码对寄存器内存等产生的变化。
当你能够在阅读代码时,程序对内存,对计算机产生的各种影响都心如明镜般的话,那么就完全可以单凭阅读代码就能理解程序了,而不需要通过编写实验或是调试来学习。