5.4.4 错误处理

磁盘制造商通过不断地加大线性位密度而持续地推进技术的极限。在一块5.25英寸的磁盘上,处于中间位置的一个磁道大约有300mm的周长。如果该磁道存放300个512字节的扇区,考虑到由于前导码、ECC和扇区间隙而损失了部分空间这样的实际情况,线性记录密度大约是5000b/mm。记录5000b/mm需要极其均匀的基片和非常精细的氧化物涂层。但是,按照这样的规范制造磁盘而没有瑕疵是不可能的。一旦制造技术改进到一种程度,即在那样的密度下能够无瑕疵地操作,磁盘设计者就会转到更高的密度以增加容量。这样做可能会再次引入瑕疵。

制造时的瑕疵会引入坏扇区,也就是说,扇区不能正确地读回刚刚写到其上的值。如果瑕疵非常小,比如说只有几位,那么使用坏扇区并且每次只是让ECC校正错误是可能的。如果瑕疵较大,那么错误就不可能被掩盖。

对于坏块存在两种一般的处理方法:在控制器中对它们进行处理或者在操作系统中对它们进行处理。在前一种方法中,磁盘在从工厂出厂之前要进行测试,并且将一个坏扇区列表写在磁盘上。对于每一个坏扇区,用一个备用扇区替换它。

广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元

有两种方法进行这样的替换。在图5-30a中,我们看到单个磁盘磁道,它具有30个数据扇区和两个备用扇区。扇区7是有瑕疵的。控制器所能够做的事情是将备用扇区之一重映射为扇区7,如图5-30b所示。另一种方法是将所有扇区向上移动一个扇区,如图5-30c所示。在这两种情况下,控制器都必须知道哪个扇区是哪个扇区。它可以通过内部的表来跟踪这一信息(每个磁道一张表),或者通过重写前导码来给出重映射的扇区号。如果是重写前导码,那么图5-30c的方法就要做更多的工作(因为23个前导码必须重写),但是最终会提供更好的性能,因为整个磁道仍然可以在旋转一周中读出。

阅读 ‧ 电子书库
图 5-30 a)具有一个坏扇区的磁盘磁道;b)用备用扇区替换坏扇区;c)移动所有扇区以回避坏扇区

驱动器安装之后在正常工作期间也会出现错误。在遇到ECC不能处理的错误时,第一道防线只是试图再次读。某些读错误是瞬时性的,也就是说是由磁头下的灰尘导致的,在第二次尝试时错误就消失了。如果控制器注意到它在某个扇区遇到重复性的错误,那么可以在该扇区完全死掉之前切换到一个备用扇区。这样就不会丢失数据并且操作系统和用户甚至都不会注意到这一问题。通常使用的是图5-30b的方法,因为其他扇区此刻可能包含数据。而使用图5-30c的方法则不但要重写前导码,还要复制所有的数据。

前面我们曾说过存在两种一般的处理错误的方法:在控制器中或者在操作系统中处理错误。如果控制器不具有像我们已经讨论过的那样透明地重映射扇区的能力,那么操作系统必须在软件中做同样的事情。这意味着操作系统必须首先获得一个坏扇区列表,或者是通过从磁盘中读出该列表,或者只是由它自己测试整个磁盘。一旦操作系统知道哪些扇区是坏的,它就可以建立重映射表。如果操作系统想使用图5-30c的方法,它就必须将扇区7到扇区29中的数据向上移动一个扇区。

如果由操作系统处理重映射,那么它必须确保坏扇区不出现在任何文件中,并且不出现在空闲列表或位图中。做到这一点的一种方法是创建一个包含所有坏扇区的秘密的文件。如果该文件不被加入文件系统,用户就不会意外地读到它(或者更糟糕地,释放它)。

然而,还存在另一个问题:备份。如果磁盘是一个文件一个文件地做备份,那么非常重要的是备份实用程序不去尝试复制坏块文件。为了防止发生这样的事情,操作系统必须很好地隐藏坏块文件,以至于备份实用程序也不能发现它。如果磁盘是一个扇区一个扇区地做备份而不是一个文件一个文件地做备份,那么在备份期间防止读错误是十分困难的,如果不是不可能的话。惟一的希望是备份程序具有足够的智能,在读失败10次后放弃并且继续下一个扇区。

坏扇区不是惟一的错误来源,也可能发生磁盘臂中的机械故障引起的寻道错误。控制器内部跟踪着磁盘臂的位置,为了执行寻道,它发出一系列脉冲给磁盘臂电机,每个柱面一个脉冲,这样将磁盘臂移到新的柱面。当磁盘臂移到其目标位置时,控制器从下一个扇区的前导码中读出实际的柱面号。如果磁盘臂在错误的位置上,则发生寻道错误。

大多数硬盘控制器可以自动纠正寻道错误,但是大多数软盘控制器(包括Pentium的)只是设置一个错误标志位而把余下的工作留给驱动程序。驱动程序对这一错误的处理办法是发出一个recalibrate(重新校准)命令,让磁盘臂尽可能地向最外面移动,并将控制器内部的当前柱面重置为0。通常这样就可以解决问题了。如果还不行,则只好修理驱动器。

正如我们已经看到的,控制器实际是一个专用的小计算机,它有软件、变量、缓冲区,偶尔还出现故障。有时一个不寻常的事件序列,例如一个驱动器发生中断的同时另一个驱动器发出recalibrate命令,就可能引发一个故障,导致控制器陷入一个循环或失去对正在做的工作的跟踪。控制器的设计者通常考虑到最坏的情形,在芯片上提供了一个引脚,当该引脚被置起时,迫使控制器忘记它正在做的任何事情并且将其自身复位。如果其他方法都失败了,磁盘驱动程序可以设置一个控制位以触发该信号,将控制器复位。如果还不成功,驱动程序所能做的就是打印一条消息并且放弃。

重新校准一块磁盘会发出古怪的噪音,但是正常工作时并不让人烦扰。然而,存在这样一种情形,对于具有实时约束的系统而言重新校准是一个严重的问题。当从硬盘播放视频时,或者当将文件从硬盘烧录到CD-ROM上时,来自硬盘的位流以均匀的速率到达是必需的。在这样的情况下,重新校准会在位流中插入间隙,因此是不可接受的。称为AV盘(Audio Visual disk,音视盘)的特殊驱动器永远不会重新校准,因而可用于这样的应用。