什么是扇区:
扇区是硬盘最基本存储单位,一般扇区大小为512字节;
什么是磁道:
硬盘都是由多盘片组成的,盘片表面上以盘片面性中心为圆
心,不同半径的同心圆为磁道。磁道分成多个扇形区域即为扇区;
什么是柱面:
多个不同盘片相同半径的同心圆。
一般柱面和磁道能用;
硬盘容量:
存储容量 = 磁头数*磁道(柱面)数*每道扇区数*每扇区字节数
硬盘的寻址:
老式硬盘采用CHS(cylinder/head/sector )即三维地址模式,由于老式硬盘
每个磁道的扇区数都是相同的,因此外磁道比磁道密度小,就造成了浪费;
现在硬盘采用LBA即扇区的逻辑块地址;不同磁道的扇区密度相等;
LBA模式下,系统把所有的物理扇区按照某种方式看做是一个线性编号。
为了与老式硬盘兼容,在硬盘控制器内部安装了一个地址翻译器,由它负责将CHS参数翻译
成LBA地址;
硬盘操作:
BIOS Int 13H 调用是 BIOS 提供的磁盘基本输入输出中断调用, 它可以完成磁盘(包括硬盘和软盘)的复位, 读写, 校验, 定位, 诊断, 格式化等功能。
磁盘地址数据包 Disk Address Packet (DAP)
DAP 是基于绝对扇区地址的, 因此利用 DAP, Int13H 可以轻松地逾
越 1024 柱面的限制, 因为它根本就不需要 CHS 的概念.
DAP 的结构如下:
struct DiskAddressPacket
{
BYTE PacketSize; // 数据包尺寸(16字节)
BYTE Reserved; // ==0
WORD BlockCount; // 要传输的数据块个数(以扇区为单位)
DWORD BufferAddr; // 传输缓冲地址(segment:offset)
QWORD BlockNum; // 磁盘起始绝对块地址
};
驱动器参数数据包 Drive Parameters Packet
驱动器参数数据包是在扩展 Int13H 的取得驱动器参数子功能调用中
使用的数据包. 格式如下:
struct DriveParametersPacket
{
WORD InfoSize; // 数据包尺寸 (26 字节)
WORD Flags; // 信息标志
DWORD Cylinders; // 磁盘柱面数
DWORD Heads; // 磁盘磁头数
DWORD SectorsPerTrack; // 每磁道扇区数
QWORD Sectors; // 磁盘总扇区数
WORD SectorSize; // 扇区尺寸 (以字节为单位)
};
信息标志用于返回磁盘的附加信息, 每一位的定义如下:
0 位:
0 = 可能发生 DMA 边界错误
1 = DMA 边界错误将被透明处理
如果这位置 1, 表示 BIOS 将自动处理 DMA 边界错误, 也就是说
错误代码 09H 永远也不会出现.
1 位:
0 = 未提供 CHS 信息
1 = CHS 信息合法
如果块设备的传统 CHS 几何信息不适当的话, 该位将置 0.
2 位:
0 = 驱动器不可移动
1 = 驱动器可移动
3 位: 表示该驱动器是否支持写入时校验.
4 位:
0 = 驱动器不具备介质更换检测线
1 = 驱动器具备介质更换检测线
5 位:
0 = 驱动器不可锁定
1 = 驱动器可以锁定
要存取驱动器号大于 0x80 的可移动驱动器, 该位必须置 1
(某些驱动器号为 0 到 0x7F 的设备也需要置位)
6 位:
0 = CHS 值是当前存储介质的值 (仅对于可移动介质), 如果
驱动器中有存储介质, CHS 值将被返回.
1 = CHS 值是驱动器支持的最大值 (此时驱动器中没有介质).
7 - 15 位: 保留, 必须置 0.