「Assembly」- 从 ATA 中,读取扇区数据

  CREATED BY JENKINSBOT

在个人计算机中,主硬盘控制器(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 汇编语言 从实模式到保护模式》