硬盘中的指令很多,各指令的用法也不同。有的指令直接往command寄存器中写就行了,有的还要在feature寄存器中写入参数,最权威的方法还是要去参考ATA手册。由于本书中用到的都是简单的指令,所以对此抽象出一些公共的步骤仅供参考之用。
不管是读硬盘还是写硬盘,都不是一个指令就完事的。相关寄存器都需要设置。要是读硬盘,得告诉读哪个扇区,读几个扇区,用哪种模式对扇区寻址,LBA?CHS?写硬盘也一样,写哪个,写几个,还要设置操作的是哪个通道的哪个硬盘……讲了这么多寄存器,有没有心里发怵?心想,我到底先设置哪个寄存器呢?有没有个一般硬盘操作的基本顺序呢?还真有,小弟马上给大家呈上大概步骤。最主要的顺序就是command寄存器一定得是最后写,因为一旦command寄存器被写入后,硬盘就开始干活啦,它才不管其它寄存器中的值对不对,一律拿来就用,有问题的话报错就好啦。其它寄存器顺序不是很重要。
那咱们可以约定个操作顺序,免得有选择恐惧症的同学感到无所适从,哈哈,抱歉,请原谅我这么说,因为我就有选择恐惧症,我很理解像我这样的同学。咱们还是约定个步骤好:
- 1.先选择通道,往该通道的sector count寄存器中写入待操作的扇区数。
- 2.往该通道上的三个LBA寄存器写入扇区起始地址的低24位。
- 3.往device寄存器中写入LBA地址的24~27位,并置第6位为1,使其为LBA模式,设置第4位,选择操作的硬盘(master硬盘或slave硬盘)。
- 4.往该通道上的command寄存器写入操作命令。
- 5.读取该通道上的status寄存器,判断硬盘工作是否完成。
- 6.如果以上步骤是读硬盘,进入下一个步骤。否则,完工。
- 7.将硬盘数据读出。
硬盘工作完成后,它已经准备好了数据,咱们该怎么获取呢?一般常用的数据传送方式有:
- 1.无条件传送方式
- 2.查询传送方式
- 3.中断传送方式
- 4.直接存储器存取方式(DMA)
- 5.I/O处理机传送方式
对于上面的第1种“无条件传送方式”,应用此方式的数据源设备一定是随时准备好了数据,cpu随时取随时拿都没问题,如寄存器、内存就是类似这样的设备,cpu取数据时不用提前打招呼。
第2种“查询传送方式”,也称为程序I/O、PIO(Programming Input/Output Model)。是指传输之前,由程序先去检测设备的状态。数据源设备在一定的条件下才能传送数据,这类设备通常是低速设备,比cpu慢很多。cpu需要数据时,先检查该设备的状态,如果状态为“准备好了可以发送”,cpu再去获取数据。硬盘有status寄存器,里面保存了工作状态,所以对硬盘可以用此方式来获取数据。
第3种“中断传送方式”,也称为中断驱动I/O。上面提到的“查询传送方式”有这样的缺陷,由于cpu需要不断查询设备状态,所以意味着只有最后一刻的查询才是有意义的,之前的查询都是发生在数据尚未没准备好的时间段里,所以说效率不高,仅对于不要求速度的系统可以采用。可以改进的地方是,如果数据源设备将数据准备好后再通知cpu来取,这样效率就高了。通知cpu可以采用中断的方式,当数据源设备准备好数据后,它通过发中断来通知cpu来拿数据,这样避免了cpu花在查询上的时间,效率较高。
第4种“直接存储器存取方式(DMA)”。在中断传送方式中,虽然极大地高高了cpu的利用率,但通过中断方式来通知cpu,cpu就要通过压栈来保护现场,还要执行传输指令,最后还要恢复现场。似乎有同学说此方式已经很爽了,你还想怎样。哈哈,其实更爽的是一点都不要浪费cpu资源,不让cpu参与传输,完全由数据源设备和内存直接传输。cpu直接到内存中拿数据就好了。这就是此方式中“直接”的意思。不过DMA是由硬件实现的,不是软件概念,所以需要DMA控制器才行。
第5种 “I/O处理机传送方式”。不知大家发现了没有,在说上面每一种的时候都把它们各自说的特别好,似乎完美不可替代了,就像电视上的广告一样,每次都把自己的产品描述的无与伦比甚至全宇宙第一,但该公司一出新产品,就开始自暴曾经无与伦比的老一代产品的问题以突显现在产品更胜一筹。DMA已经是借助其它硬件了,cpu已经很轻松了,难道还有更爽的方式?是啊,DMA方式中cpu还嫌爽的不够,毕竟数据输入之后或输出之前还是有一部分工作要由cpu来完成的,如数据交换,组合,校验。如果DMA控制器再强大一点,把这些工作帮cpu做了就好了。也是哦,既然为了解放cpu,都已经引用一个硬件(DMA)了,干脆一不做二不休,再引入一个硬件吧。于是,I/O处理机诞生啦,听名字就知道它专门用于处理IO,并且它其实是一种处理器,只不过用的是另一套擅长IO的指令系统,随时可以处理数据。有了I/O处理机的帮忙,cpu甚至可以不知道有传输这回事,这下cpu才真正爽到家啦。同样,这也是需要单独的硬件来支持。
综上所述,硬盘不符合第1种方法,因为它需要在某种条件下才能传输。第4种和第5种需要单独的硬件支持,先不说我们的bochs能否模拟这两种硬件,单独学习这两类硬件的操作方法就很头疼,大家有兴趣的话还是先放一放,以后再琢磨吧。所以在我们的系统中,我们用了第2、3这两种软件传输方式。
关于硬盘的部分介绍完了,接下来的工作是实践,我记得当初自己做实验时的是心情是非常忐忑的,总是担心有些东西不可控,有些东西自己左右不了。如果您此时的心情也是这样,那我用“过来人”的经验告诉您,想太多也没有用,做就是了,只有做超出自己能力的事才能提高,总做自己能力内的事,咱们大家连走路都不会呢。再说啦,即使是恶梦也会有醒来的一刻,烦事都会过去的,扛吧兄弟,我相信,艰辛过后,您会看到更加强大的自己(这是我说的吗,好感动)。
【再续】
本书内容来自《操作系统真象还原》,请大家支持正版,多谢。