4.6 Maxtor驱动器固件
下面介绍Maxtor驱动器固件的有关内容。
4.6.1 概况
Maxtor驱动器固件分为两部分,第一部分是存储在PCB上处理器芯片内部的掩膜ROM和外部扩展Flash ROM中的微代码,第二部分是存储在固件区的磁盘固件。在Maxtor驱动器中,通过为访问固件而专门分配的逻辑扇区可以非常容易地访问固件。这种扇区称为UBA地址(Util Block Addressing,应用块地址,类似于LBA)扇区,可以由微处理器自动转换成磁盘区域上对应的物理位置。
PCB固件由两部分组成,分别是处理器内部的掩膜ROM和外部扩展的并行/串行Flash ROM,之所以这样安排可能是因为处理器中的掩膜ROM不容易修改(Flash ROM可以很容易地修改)。处理器从外部扩展Flash ROM开始初始化。如果外部扩展Flash ROM缺失,就从处理器内部ROM启动固件微代码。可能会有这种情况:处理器内部ROM中的微代码属于另一属系,例如CALIPSO驱动器断开扩展ROM后会被识别成“N40P”。Maxtor驱动器有一个安全模式跳线,当设置了安全模式时,只有存储在PCB上的固件会被加载,而位于磁盘固件中的用于启动主轴马达和初始化的那部分固件会被跳过,这样正好可以准确识别PCB固件的版本。将跳线设置为安全模式,然后运行相应程序,在MODEL行驱动器型号名后显示的就是ROM版本号。
将驱动器初始化至操作状态需要使用从磁盘服务区加载的固件完全替换从PCB加载的固件。如果由于某种原因导致从磁盘服务区加载的固件不能运行,可以通过运行LDR文件来强制将它加载至驱动器处理器。使用LDR文件时要记住:LDR文件只包括微代码,即ROM的复本和覆盖(overlay),不包括驱动器运转所需的数据(缺陷表、适配参数和其他设置)。也就是说,可加载的微代码存储在磁盘固件中,需要时可将其加载至微处理器运行,不需要时可用其他代码将其覆盖。PCB微程序和磁盘固件有着不同的版本,这种差异有助于我们了解处理器当前正在运行的是哪个版本。在Poker/Ardent属系驱动器的固件区包含两套驱动器控制程序,即正式版和工厂自测程序。
对Maxtor驱动器来说,通过标签识别固件版本是很复杂的,因为厂商并不严格遵循版本规则,这种事实导致很多不兼容的固件版本拥有相同的识别代码。兼容性问题还可能由磁头读/写适配参数存储在固件微代码中引起。虽然不能保证100%兼容,但是还是可以通过下面的指导规则来确定固件的版本。
简写“MODEL+HDA+PCB+UNIQUE”,如“2B020H1110500”。
标志字母由逗号隔开,如“K, M, B, E”。
IDE接口标签的大写行,如“A4FBA”。
Maxtor驱动器的模块映射中没有模块名。尽管其中一些模块确实有名字,但这种名字存储在它们各自的模块头中,因此不读出模块内容就不可能知道这些模块的名字。但是,对不同属系驱动器的模块引入一个统一的模块编号却是可行的,这就是所谓的位置码(以下称为PN)。通过PN可以方便地识别特定模块的用途。主要活动模块的功能见第4.6.2节表4-3。
表4-3 Maxtor驱动器模块
表注:
“重要性”列的代码含义如下。
A:关键的,与特定HDA(不可替代)相匹配。
B:必须的,但是可以使用其他驱动器上的复本代替。
C:必须的,即使部分模块损坏驱动器也可以启动。
D:如果缺失,驱动器也可正常启动,但是速度会变慢。
E:即使没有,驱动器也可以正常运转。
每个磁头都有一份固件的复本,它们也可以通过不包含在主映射中的“高级”UBA寻址方式来复制。在默认情况下,驱动器可以使用所有的固件复本工作,驱动器有这种能力。读/写模块组可作为一种访问固件区复本的方法。
由检查固件结构命令生成的报告包含以下信息。
一般信息:显示所选驱动器属系以及用户数据区最小/最大物理柱面数。
磁盘配置模块:包含驱动器读/写磁头数及它们与前置放大器/转接器芯片的映射关系。
区域分配表(Zone table):驱动器中物理位置区域的扇区密度。
数据模块:由以下内容组成。
✧ #:数据模块号。
✧ PN:模块的位置码。
✧ 模块起始UBA地址。
✧ 模块长度。
✧ Rd(读标记):读成功则标记为“√”,读失败则标记为“-”。
✧ “ChkSum”(校验和)标记:校验和正确标记为“√”,错误标记为“-”。
✧ “Id”标识字符串:以“*”开头表示模块中包含一个表,并且用一行来标识这个表。如果模块数据标识与从模块头部读出的标识正确,则以“√”开始;如果模块头部包含错误,则以“-”开始,后面跟有一行从模块中实际读出的头部内容。
✧ 注释:用于确定驱动器所需模块的状态。
可加载的ROM:显示初始UBA、ROM版本、标识、读状态和校验和。要可靠地识别ROM版本,也许只有校验和可用。实践证明,几个实际上不同的固件版本在ROM中可能拥有相同的固件版本。如果不同驱动器上的ROM复本的校验和相同,可以说明这些驱动器使用的是相同的微程序。
overlay:其实就是指微代码、微程序,因为它们可以反复加载、覆盖,所以称为overlay,由以下内容组成。
✧ #:overlay号(没有18h模块的驱动器)。
✧ overlay起始UBA地址。
✧ Rd(读标记):“√”表示成功读取,“-”表示不可读。
✧ “Id”标记:“√”表示标识符匹配,“-”表示不匹配。
✧ “ChkSum”标记:“√”表示校验和正确,“-”表示错误。
G-List:反映G-List的状态信息。
密码:用于查看驱动器的密码设置情况。
4.6.2 固件模块
Maxtor驱动器固件模块如表4-3所示,包括位置号、模块功能和重要性3个部分。
PC3000还提供了实现固件区操作的另一个机制,那就是读/写成组的模块。一组模块即根据某种特定的功能特点组合在一起的模块和扇区组。例如,包括微控制器代码(overlay)或数据模块(译码表、适配数据和其他表)的模块可归于同一模块组。这种机制与标准的对模块的操作方式相比有以下不同点。
可以访问模块表中没有标记的固件区。
可以使用另一个物理磁头存取固件复本(如果驱动器只有1个物理磁头则使用同一个磁头)。
S.M.A.R.T属性可以通过从完好的驱动器中复制模块PN=30h的方法清除。
4.6.3 驱动器译码表
译码表是一个将物理扇区翻译成操作系统使用的逻辑扇区的程序。一个通用的规则是所有的驱动器都通过译码表排除缺陷而把工厂缺陷隐藏起来。例如,有一系列物理扇区P0、P1、P2、P3,若P0的LBA为LBA0,而P2有缺陷,那么在P-List中就会有相应的记录。P-List中的记录不是柱面、磁头、扇区,而是一个特殊符号。在RZTBL表中按照增1的顺序记录了P0~P3扇区,以隐藏有缺陷的扇区,这样,操作系统在存取以LBA0开始的一组扇区的时候,译码表会给出如下的一组数据。
LBA0-P0 LBA1-P1 LBA2-P3, ......
因此,对操作系统来说,P2就被排除在可用的LBA扇区之外了。
现在假设没有记录表明P2被隐藏(从其他驱动器复制了一个译码表、进行了热插拔或者清除了缺陷表等操作都会导致这种情况的发生),在这种情况下,P2对操作系统来说就是可用的LBA扇区了。不仅如此,本来LBA2是指向P3的,但是现在它移到了P2,后面的记录就依次递进。这样,当试图读取LBA2以后的扇区时,操作系统就不能读出正确的数据。
在一个驱动器中实际上可能有几千甚至几万个缺陷扇区,因此在驱动器上的文件、目录或FAT的位置可能会有数百个扇区的位移。
对Maxtor驱动器来说,译码表程序存储于U_LIST(PN=37H)、AT_PDL(PN=18H)和RZTBL(PN=78H)模块中。驱动器通过PN=33H的中间表来生成译码表。这个中间表的内容与缺陷扇区的一般表达方式(柱面、磁头、扇区)相同。可以使用重建译码表命令来从中间表生成译码表。PC3000不会直接显示译码表的内容,而是代之以中间表,因此当译码表被覆盖后,PC3000显示的仍然是译码表模块被修改之前的缺陷记录。
G-List缺陷重定位使用的是另外一种方法。G-List不会从LBA地址空间排除缺陷扇区,而是用保留扇区来替代它们。保留扇区从最大LBA地址之后开始。仍以上面的例子为例,就像下面这样。
LBA0-P0 LBA1-P1 LBA2-保留扇区 LBA3-P3, ......
在这个过程中,没有LBA扇区移位,G-List中的信息丢失不会造成磁盘数据的混乱。当然,写进G-List的扇区可能含有对文件系统来说非常重要的数据,不过这种情况很少发生。推荐在恢复固件损坏的驱动器的数据时清除G-List中的缺陷记录。