龟速linux内核学习之旅(二)

  下午花了三四个小时在看总共才260行的,而且是算上注释的,linux-0.11的bootsect.s汇编代码。难点一是对硬盘的结构和术语没有一个概念,二是从硬盘加载内核镜像的代码段逻辑较为复杂,三是对汇编指令的作用还不是很清楚,四是对BIOS中断的不熟悉,主要是INT10和INT13号中断。最后还是在下班前把它搞懂了。


      对难点一:我是翻了翻Barry B. Brey的The Inter Microprocessor的中文版与硬盘相关的章节,似懂非懂。话说我想找英文版的看,可是网上居然只有中文版的,英文版的都要注册花钱买,等我有了张VISA卡再说吧。然后就硬着头皮看汇编代码了,看得跟乌龟爬一样。不过看着看着就清楚了硬盘的结构。head是磁头(废话),一个驱动器有两个,head0和head1。磁头在磁道间移动,硬盘驱动器转动(转盘子)使磁头对准磁道上不同的扇区sector。磁道track就是一个个同心圆环,另一个同义词叫cylinder,直译为圆柱体,术语叫柱面,可见中国翻译界没有一个统一的标准,可惜啊。我知道cylinder,但我不知道它就是柱面,这是看Ralf Brown的很详细的BIOS Interrupt List对比赵炯博士写的中文解释才发现的。扇区就是磁道上过圆心的两条射线截圆环的一段“有宽度的弧”。因为相对的关系,我们姑且把驱动器的转动变成磁头的转动。开始的时候磁头在圆心所谓的“安全区”,磁头移动到0磁道(这是真的移动),然后“转动”到0扇区。读磁盘的操作是,读磁头下的扇区,然后磁头“转”到下一个扇区1。当一个磁道正面的扇区(也是为什么有两个磁头的原因)全部读完,就到磁头1大显身手了。磁头1也读完了它的扇区,那磁头0和磁头1这对双胞胎就要移动到磁道1上去了,然后重复。


      对难点二:最后说。读磁盘的内容到内存的代码有八段,按标号来划分。逻辑上不清楚的原因是由于有两个对象,一个是磁盘,一个是内存。对这两个对象的操作往往是混在一起的,造成了思维上的困难,只要明白了这点,看起来就清楚了。剩下的就自己嚼吧。


      对难点三:主要是条件跳转指令,看多了发现只要把指令的全称读出来,就是它的本意。比如jne root_defined,就是jump to root_defined if not equal zero。内部的操作是根据Flag标志寄存器的ZF位,如果ZF=1,即zero is activated;如果ZF=0,即zero is deactivated。jne的跳转条件是ZF is deactivated,即ZF=0。


      对难点四:博士的注释已经很详细了,只是有个地方没说清楚,就是99行的attribute 7(normal),我查看了Brown的更详细的说明,对INT10 AH=13H的说明也是这样简略。Brown的文档肯定是全的,唯一的可能就是在这个中断说明的前面已经解释过了。我也不知道怎么在长长的文档中找这个信息,于是就google去了,找到一篇文章把它解释成颜色信息,bit[4-7]是背景色,bit[0-3]是前景色,感觉蛮可靠的。于是乎用white在Brown的文档中搜索,找到了类似的说明。原来这个07H是表示前景色是黑色,背景色是亮灰。

     最后的发现:bootsect.s末尾的.org 508,博士的解释是很清楚,但没有明说作者的意图。508换算成16进制就是0x1fc,一个扇区的大小是512B,即0x200。508 + 4 = 512,也就是说文件的末尾填充4个字节后的大小正好是一个扇区的大小,多么聪明的做法!!
~

posted on 2010-11-07 20:47  Prajna  阅读(243)  评论(0编辑  收藏  举报

导航