在个人计算机中,主硬盘控制器(ATA)被分配 8 个端口,0x01F0-0x01FF:
端口的作用及使用方法
0x01F0
作用:数据端口,用于从中读取数据。
端口长度:该端口为 16 bits
0x01F1
作用:错误寄存器,保存硬盘驱动器在最后一次执行命令后的状态(错误原因)。
0x01F2
作用:设置要读取的扇区数
该端口 8 bits,写入 0 表示读取 256 个扇区。
每成功读取一个扇区,该数值将减一。该端口的最终数值,为读取失败的扇区数。
0x01F3 / 0x01F4 / 0x01F5 / 0x01F6
作用:设置起始的 LBA28 扇区号
端口长度:每个端口为 8 bits
其中 0x01F3-0x01F5 保存 LBA 的第 00-23 位,而 LBA 的第 24-27 位保存在 0x01F6 的 00-03 位;
端口 0x01F6 的第 04 位,用于指定要读取主盘(0)还是从盘(1)。(旧的 PATA/IDE 接口,可以挂接两块硬盘;新的 SATA 接口,只能挂接一块硬盘)
端口 0x01F6 的高 05-07 位,为 111 表示使用 LBA 寻址,为 101 表示 CHS 寻址。
0x01F7
作用:既是命令端口,也是状态端口。
端口长度:该端口为 8 bits
写入 0x0020 表示读取请求,然后硬盘便开始工作,进行读取数据。
端口 0x01F7 的第 07 位为 1 表示磁盘正在工作,此时我们还不能读取数据(需要我们在程序中处理,即等待)。
端口 0x01F7 的第 07 位为 0 表示工作结束,并且第 03 位为 1 表示准备完成,此时我们可以读取数据。
端口 0x01F7 的第 00 位表示前个命令执行是否出现错误,错误原因保存在 0x00F1 端口中。
从磁盘中读取数据(汇编实现)
参考文献
ATA (Advanced Technology Attachment) Definition
ATA read/write sectors – OSDev Wiki
《x86 汇编语言 从实模式到保护模式》