查看系列文章点这里: 操作系统真象还原
前言
CPU 要想控制硬盘,就必须要通过硬盘控制器,本文只介绍最基础的使用,以满足《操作系统真象还原》一书中的需要,更详细的内容请参考ATA手册。
一、什么是硬盘控制器?
CPU 要控制的硬件非常多,不可能为每个硬件都设计专门的电路,所以需要一个通用的方法来操作硬盘,因此,硬盘控制器就诞生了。它作为CPU与硬盘间中转站,不仅有帮助CPU控制硬盘的作用,还有缓存的作用,用来解决CPU和硬盘速度不一致的问题。
硬盘控制器属于I/O接口,因此我们需要通过读写硬盘控制器的端口,以此来操作硬盘控制器,完成我们的读写需求。
二、硬盘控制器的部分端口寄存器
端口可以分为两组,Command Block registers 和 Control Block registers ,前者用于想硬盘驱动器写入命令字或者从硬盘控制器获得硬盘状态,后者用于控制硬盘工作状态。
IO端口 | 端口用途 | ||
---|---|---|---|
Primary通道 | Secondary通道 | 读操作时 | 写操作时 |
Command Block registers | |||
0x1F0 | 0x170 | Data | |
0x1F1 | 0x171 | Error | Features |
0x1F2 | 0x172 | Sector Count | |
0x1F3 | 0x173 | LBA Low | |
0x1F4 | 0x174 | LBA Mid | |
0x1F5 | 0x175 | LBA High | |
0x1F6 | 0x176 | Device | |
0x1F7 | 0x177 | Status | Command |
Control Block registers | |||
0x3F6 | 0x376 | Alternate Status | Device Control |
下面依次解释一下每个寄存器的含义:
-
Data:读或写时,存放数据;
-
Error:读取硬盘失败时,记录错误信息;
-
Features:当写硬盘时,存储命令需要的特殊参数;
-
Sector Count:待读或写的扇区数;
-
LBA Low:LBA 0~7位;
-
LBA Mid:LBA 8~15位;
-
LBA High:LBA 16~23位;
-
Device:低4位存储LBA 24~27位,第4位用来指定通道上的主盘(0)或从盘(1),第6位用来设置是否启用 LBA 方式(1代表LBA,0代表CHS),其它两位固定为1;
-
Status:给出硬盘状态信息,具体如下表所示:
位置 0 1 ~ 2 3 4 ~5 6 7 名称 ERR DRQ DRDY BSY 含义 为1表示有错误发生 为1表示数据以及准备好,随时可以输出 为1表示设备准备就绪,等待指令 为1表示硬盘正忙,勿扰 -
Command:存储让硬盘执行的命令,只有把命令写入该寄存器,硬盘就开始工作了,主要使用三个命令:
- 0xEC:硬盘识别
- 0x20:读扇区
- 0x30:写扇区
三、常用的硬盘操作方法
不同硬盘的操作方法会有所不同,具体还是要参考ATA手册,不过总的来说可以概括为以下步骤:
- 选择通道,并往Sector Count寄存器写入待读或写的扇区数;
- 往该通道的LBA寄存器写入起始扇区低24位地址;
- 设置Device寄存器;
- 往该通道的Command寄存器写入命令;
- 读取该通道的status寄存器,判断工作是否完成;
- 若是读硬盘,则将数据读到内存中,否则结束;
硬盘工作完成后,数据以及准备好了,如何获取呢,一般有五种方法:
- 无条件传送方式: 适用与数据不用准备,随取随用;
- 查询传送方式: CPU 去检查数据准备好没有;
- 中断查询方式: 数据好了通知 CPU,CPU来传送数据;
- 直接存储器存取方式(DMA): 数据好了通知 CPU,CPU 通知 DMA传送数据;
- I/O处理机传送方式: 不经过 CPU,直接传输;
持续更新中~~