|
对 IDE 接口来说,它有两个通道:IDE0 和 IDE1 。每个通道可以连接两个设备,分别为 Master 和 Slave。一个 PC 最多可接 4 个 IDE 设备。
在 PC 中,IDE0 通道的 I/O 端口地址是 0x1F0~0x1F7 以及 0x376~0x377 。通过读写这些端口地址就能与 IDE 硬盘进行通信。下面是这些端口的使用说明:
Task File Registers 命令寄存器组
I/O 地址 | 从硬盘读数据 | 写数据到硬盘 | 0x1F0 | 数据寄存器 | 数据寄存器 | 0x1F1 | 错误寄存器(只读寄存器) | 特征寄存器 | 0x1F2 | 扇区计数寄存器 | 扇区计数寄存器 | 0x1F3 | 扇区号寄存器或LBA块地址0~7 | 扇区号或LBA块地址0~7 | 0x1F4 | 磁道数低8位或LBA块地址8~15 | 磁道数地8位或LBA块地址8~15 | 0x1F5 | 磁道数高8位或LBA块地址8~15 | 磁道数高8位或LBA块地址8~15 | 0x1F6 | 驱动器/磁头或LBA块地址24~27 | 驱动器/磁头或LBA块地址24~27 | 0x1F7 | 状态寄存器 | 命令寄存器 |
Control/Diagnostic Registers 控制/诊断寄存器
I/O 地址 | 读 | 写 | 0x3f6 | 交换状态寄存器(制度寄存器) | 设备控制寄存器(复位) | 0x3f7 | 驱动器地址寄存器 |
|
以读取 1000 号逻辑扇区开始的 8 个扇区为例:
第 0x1f3~0x1f6 4个字节的端口地址用来写入 LBA 地址,那么 1000 号逻辑扇区的 LBA 地址为 0x000003E8 ,所以我们需要往 0x1F3, 0x1F4 里写入 0x00,往 0x1F5 写入 0x03,往 0x1F6 写入 0xE8 。
0x1F2 这个地址用来写入命令所需要读写的扇区数,比如读取 8 个扇区就写入 8 。
0x1F7 这个地址用来写入要执行的操作的命令码,对于读操作,命令字为 0x20 。
综合起来,执行的命令序列为:out 0x1F3, 0x00
out 0x1F4, 0x00
out 0x1F5, 0x03
out 0x1F6, 0xE8
out 0x1F2, 0x08
out 0x1F7, 0x20 在硬盘收到这些命令序列后,它就会执行相应的操作,并且将数据读取到事先设置好的内存地址中,该内存地址也是通过类似的命令方式设置。
上面作为一种示例是比较简单的一种情况,实际情况要复杂得多,驱动程序要考虑硬件状态,比如忙碌或读取出错等。 |
|