#### 概述

柱面(cylinker)：所有盘片上相同位置的磁道组成了柱面。

磁头(head):一个盘面只能有一个磁头，所以磁头代表了盘面。一个柱面上的磁道数等于磁头数。

扇区(secter):一个盘面被划分为多个扇形区域，所以被称为扇区。

CHS模式：通过柱面、磁头、扇区寻址的模式。

LBA模式：通过逻辑块寻址的模式。

如果每条磁道扇区数都相同，由于每个扇区里存储的字节数是固定的，这使得外层磁道的数据比内层磁道稀疏。为了保存更多的数据，现代硬盘处层磁道比内层磁道有更多的扇区，但IDE驱动器屏蔽了这个差异，从上层的角度来看每条磁道上的扇区数还是相同的。

磁盘控制器是一个特殊的集成电路，被集成在主板上。磁盘控制器的电路比较简单，因为集成在磁盘里的磁盘驱动器做了大部分的工作。

控制器可以在两个以上的驱动器上同时寻道，被叫**重叠寻道**(overlapped seeks)。在设计硬盘驱动程序的时候可以考虑使用这一特性。

在阅读硬盘规范的时候要注意，驱动程序所使用的几何规范和物理格式是不同的。因为最初的IBM PC ROM BIOS对扇区、磁头、柱面的计数分别使用了6比特、4比特、14比特，所以会看到任意硬盘的“建议参数”都是16383个柱面、14个磁头、63个扇区。突破此限制的办法是使用**逻辑块寻址**(logical block addressing, LBA)，仅对扇区从0开始编号，不考虑磁盘的几何规格。

##### RAID

CPU的性能要远高于磁盘的速度，人们认为并行磁盘I/O有助于提高硬盘性能，于是产生了新的I/O设备**RAID**(独立磁盘冗余阵列)。RAID的基本思想是，把磁盘都放在一个盒子里，用RAID控制器来取代磁盘控制器，通过RAID来复制数据，然后其它操作都是一样的。

#### 硬盘控制器和硬盘的接口

假设硬盘有1024个扇区，每个扇区512字节。从硬盘传到硬盘控制器的实际是比特流，这个比特流以**前导符**(preamble)开始，然后是扇区里的4906个比特，最后是一个检验和（也被叫做**纠错码**，ECC）。前导符是在硬盘格式化的时候写入的，包含了柱面号、扇区号、扇区大小这样的信息。

控制器把这串比特流转换了字节块，进行必要的纠错。先在控制器里逐位汇集成块，然后进行检验和的验证，最后把块复制进内存。

现代磁盘控制器通常在控制器内部有许多兆字节的内存。因此，当一个读取被处理时，只要臂到达正确的圆柱体，控制器就开始读取和存储数据，即使它还没有到达它需要的扇区。这些缓存的数据在满足后续请求时可能会派上用场。此外，即使获得了请求的数据，控制器也可能继续缓存来自后续扇区的数据，因为它们可能稍后需要。通过这种方式，可以在没有任何磁盘活动的情况下处理许多磁盘读取操作。

磁盘控制器为什么需要内部的缓冲区呢？有两个原因。

一，通过内部缓冲，磁盘控制器可以在开始传输之前验证校验和。如果校验和不正确，就会发出错误信号，并且不会向内存传输数据。

二，一旦磁盘传输开始，无论控制器是否准备好，比特都会以恒定的速度从磁盘到达。如果控制器试图直接将数据写入内存，它将不得不通过系统总线查找传输的每个字。如果总线由于使用它的其他设备而繁忙，控制器将不得不等待。如果下一个磁盘字在前一个磁盘字存储之前到达，控制器就必须把它存储在某个地方。如果总线非常繁忙，控制器最终可能会存储相当多的字，并有很多管理工作要做。当块在内部进行缓冲时，如果DMA没开始则不需要总线，因此控制器的设计要简单得多，因为DMA传输到内存的时间没有严格要求。

#### 硬盘控制器

硬盘控制器是通过一组寄存器来控制的，这些寄存器在某些系统上以内存映射的形式存在，在IBM兼容机上以I/O端口的形式存在。（ide控制器最多支持4个硬盘）

##### I/O端口与MMIO的区别

1. 输入寄存器和输出寄存器是不同的寄存器，但可以使用同一个I/O端口。因此，写入某个端口的数据未必可以通过读操作检索出来。
2. 对于不同的操作模式，寄存器或寄存器里字段的含义可能是不同的。

##### IBM-AT硬盘控制器的寄存器

| 寄存器 | 执行读功能时的意义              | 执行写功能时的意义              |
| ------ | ------------------------------- | ------------------------------- |
| 0      | 数据                            | 数据                            |
| 1      | 错误                            | 写前补偿                        |
| 2      | 扇区数量                        | 扇区数量                        |
| 3      | 扇区号，或LBA的0~7位            | 扇区号，或LBA的0~7位            |
| 4      | 柱面数低位，或LBA的8~15位       | 柱面数低位，或LBA的8~15位       |
| 5      | 柱面数高位，或LBA的16~23位      | 柱面数高位，或LBA的16~23位      |
| 6      | 驱动器/磁头选择，或LBA的24-27位 | 驱动器/磁头选择，或LBA的24-27位 |
| 7      | 状态                            | 命令                            |

驱动器/磁头选择寄存器：

| 位编号 | 名称     | 值                                    |
| ------ | -------- | ------------------------------------- |
| 7      |          | 固定为1                               |
| 6      | LBA      | 模式选择：0，为CHS模式。1,为LBA模式。 |
| 5      |          | 固定为1                               |
| 4      | D        | 驱动器选择：0,主驱动器。1,从驱动器。  |
| 0~3    | HS0～HS3 | CHS模式：磁头编号。LBA模式：24~27位。 |

