本帖最后由 L3777 于 2018-2-26 13:22 编辑
基础知识-固件理(lǐ)论固件理(lǐ)论基础
一、硬盘是一台微型计算机 一直以来,硬盘的发展趋势是容量越来越大,技术越来越先进,功能(néng)也越来越复杂。现代硬盘早已不是简单 的外设,而是复杂的智能(néng)设备。实际上,现在的硬盘拥有(yǒu)完整的 CPU 和内存,固件上也采用(yòng)了类似于操作系统 的分(fēn)层次的复杂管理(lǐ)程序,因此完全可(kě)以看做一台微型计算机。只不过由于硬盘是专用(yòng)于数据存储用(yòng)途,不需要 连接像传统 PC 一样的键盘和鼠标进行操作,因此可(kě)以看做是一台专门用(yòng)途的计算机。
二、硬盘的固件结构 由于硬盘是计算机系统,所以要使得它运行起来就必须要有(yǒu)软件。这里的“软件”定义的范畴不同于当我们 在 PC 机上使用(yòng)硬盘时,我们在硬盘中存储的用(yòng)户软件。使得硬盘正确运行的内部软件对上层设备和操作系统来 说是透明的,為(wèi)了區(qū)别于用(yòng)户软件,我们通常把它们称為(wèi)“固件”。固件是硬盘内部的软件,由硬盘自己的 CPU 来运行。所以,如果我们将硬盘看做一台独立的计算机的话,硬盘的固件就好比 Windows 操作系统,以及上面安 装的一系列程序。 由于固件是最底层的软件,所以依赖于具體(tǐ)的硬件。不同的硬盘厂商(shāng)使用(yòng)的固件结构各不相同,就好比 PC 机上 Windows 和 Linux 操作系统的區(qū)别一样。但是,各种固件都有(yǒu)一些共同点,使得我们可(kě)以将固件大體(tǐ)分(fēn)為(wèi)几 个部分(fēn),大部分(fēn)厂商(shāng)硬盘的固件系统,都会大致遵循这样的设计原则。一般来说,可(kě)以将硬盘固件分(fēn)為(wèi)如下几个 部分(fēn): 1.伺服子系统。当我们為(wèi) PC 机安装打印机、扫描仪、网卡等设备的时候,我们是不是都要安装对应的 打印机驱动程序、扫描仪驱动程序和网卡驱动程序等。计算机需要有(yǒu)驱动程序,才能(néng)驱动硬件进行工 作。对硬盘来说也是这样。对于硬盘,主轴電(diàn)机和磁头组件等都是重要的硬件,它们也是需要驱动程 序才能(néng)工作的。固件中的伺服子系统,就可(kě)以通俗的理(lǐ)解為(wèi)磁头和電(diàn)机驱动程序。伺服子系统驱动電(diàn) 机旋转,也控制磁头进行寻道。通常,它需要伺服配置参数才能(néng)进行工作。如果这一部分(fēn)固件损坏, 很(hěn)明显,就会造成硬盘的電(diàn)机和磁头工作不正常。由于这一部分(fēn)固件是最接近硬件层的,因此伺服固 件损坏有(yǒu)时候看起来非常像是硬盘的硬件损坏(比如電(diàn)机不转或者磁头敲头)。 2.读写子系统。在大多(duō)数硬盘的固件设计中,通常在伺服子系统都是使用(yòng)最底层的物(wù)理(lǐ)参数来驱动磁头, 这时候还没有(yǒu)磁道的概念。而读写子系统的工作,就是建立磁道、扇區(qū)的概念,為(wèi)上层提供 CHS 和 LBA 寻址方式。读写子系统非常复杂,通常有(yǒu)两种最重要的数据是读写子系统正常工作所必要的,它 们分(fēn)别是 ZONE 表(也叫區(qū)域分(fēn)配表)和缺陷表(比如 G-List 和 P-List),可(kě)以统称為(wèi)读写参数。 3.主固件(Main FW)。这是固件中承担综合管理(lǐ)和任務(wù)调度的部分(fēn),类似于操作系统的核心。它使得固 件的各部分(fēn)有(yǒu)效结合在一起并协同工作。 4.各种功能(néng)例程。这一部分(fēn)程序多(duō)种多(duō)样,就好比是電(diàn)脑中安装的应用(yòng)程序那样。常见的有(yǒu)低级格式化 例程、自检诊断例程等等,它们由主固件进行调用(yòng)。 5.Interface / Shell 程序。这是固件最顶层的部分(fēn),负责 SATA 接口通信,或者终端 COM 接口通信等工作。 它们是硬盘与主机通信的桥梁。
固件的设计是分(fēn)层的,通常上层依赖于下层的功能(néng),而下层又(yòu)為(wèi)上层提供服務(wù)。底层的固件损坏,会导致上层无法正常工作,而固件的不同部分(fēn)损坏,也会表现為(wèi)不同的故障现象。因此理(lǐ)解固件层次结构,有(yǒu)助于理(lǐ)解硬盘固件故障的机制,并快速定位故障点。硬盘的固件层次大體(tǐ)上可(kě)以表示為(wèi)下图:
三、固件的物(wù)理(lǐ)存储位置 早期的硬盘通常将固件完全存储在 PCB 板上的 ROM 芯片中,后来由于硬盘越来越复杂,固件越来越大,ROM 芯片无法再存储完整的固件。现代硬盘通常将固件分(fēn)為(wèi)两部分(fēn)进行存储:将最重要的基本固件存放在 PCB 板上 的 ROM 芯片中,而将外围部分(fēn)存储在硬盘盘片上的系统區(qū)(又(yòu)叫服務(wù)區(qū))磁道中。硬盘在启动时,ROM 中的基 本固件最先启动,然后再从服務(wù)區(qū)磁道中载入外围部分(fēn),这样整个固件就启动完成了。这样设计后,盘片上的磁 道就被划分(fēn)為(wèi)用(yòng)户區(qū)和系统區(qū),用(yòng)户區(qū)磁道是操作系统可(kě)以访问的,而系统區(qū)磁道对操作系统则是透明的。
四、硬盘固件的启动流程 和 PC 机开机启动一样,硬盘也有(yǒu)一个启动过程,那么硬盘从上電(diàn)到开始工作,会经历哪些步骤呢(ne)?下面我 们从固件的角度来进行讲解。 1. 上電(diàn)后,Boot Loader 首先取得控制权。Boot Loader 是一段固化在硬盘主控芯片中的程序,在嵌入式设备 中,通常 Boot Loader 负责启动系统,并将 ROM 中的程序载入内存。在大多(duō)数资料中,通常将硬盘的 ROM 类比為(wèi) PC 机的主板 BIOS。实际上,从计算机體(tǐ)系结构的观点来看,硬盘中真正行使主板 BIOS 功能(néng)的应该是 Boot Loader 程序——在上電(diàn)最开始就获得控制权,执行系统最早期的初始化工作,并负责 载入“操作系统”。不过 Boot Loader 比主板 BIOS 要简单得多(duō),它最主要的任務(wù)就是将 ROM 芯片中的代 码载入内存,然后转交控制权到 ROM 代码。 2. ROM 程序被载入后,主固件就开始执行自己的启动过程。最先被激活的是伺服子系统。此时主轴電(diàn)机开 始旋转,磁头开始飞行,并做好寻道准备。 3. 接下来读写子系统被激活。此时 ZONE 區(qū)域分(fēn)配表被加载,主固件会先初始化完成一个“最小(xiǎo)化读写子 系统”。最小(xiǎo)化读写子系统已经具备访问硬盘物(wù)理(lǐ)磁道和盘片上的服務(wù)區(qū)的能(néng)力,但还不够访问用(yòng)户扇區(qū), 因為(wèi)此时 P-List 表或者地址译码器模块还没有(yǒu)加载。 4. 然后主固件会调用(yòng)读写子系统访问盘片上的服務(wù)區(qū)磁道,将服務(wù)區(qū)磁道上的外围固件加载到内存。这些 外围固件通常包含 APP code,地址译码器模块和 SMART 模块等,都是较顶层的功能(néng)。当地址译码器模 块载入完毕后,最小(xiǎo)化读写子系统就变成了完整的读写子系统,具备了访问用(yòng)户扇區(qū)和提供線(xiàn)性 LBA 地 址转换的能(néng)力。 5. 当所有(yǒu)固件载入完毕后,此时硬盘就完成了启动,进入就绪状态,等待主机发来的命令。
|