admin管理员组

文章数量:1540283

2024年6月23日发(作者:)

本文说明:最近学了南桥spec中有关SATA的部分,这里就总结了近期所学到的内容,希望能对向

我这样入门阶段的新手起到借鉴作用。文中大部分内容都出自文档,文档中没有的或者我没有读到的,

都是凭借个人臆想。这里的文档指南桥spec和ATA/ATAPI-7 Draft。由于本人没有什么基础,又喜欢妄

加推测,所以错误的地方肯定很多很多。完全可以认为文中所有的内容都是值得怀疑的。若发现错误之

处,请您指正。

一、概念说明

控制器支持三种模式,IDE、AHCI、RAID,模式选择的寄存器是MAP,bit[7:6]为SMS(SATA

Mode Select)。IDE模式就是将SATA设备当作普通的IDE设备使用; AHCI(Advanced Host Controller

Interface)模式也就是SATA设备模式,另外支持很多新的功能,如Native Command Queuing、Auto

Activate for DMA等等; RAID(Redundant Array of Independent Disk),就我所了解的,IDE与

AHCI都只支持一个硬盘(只能一个端口接SATA硬盘,其余的端口只能接硬盘以外的SATA设备,如CD

ROM) ,唯有RAID可支持多个硬盘

2. IDE模式下又可以细分为Legacy IDE与Native IDE,区分它们的寄存器是PI,bit[3:0]。关于

Legacy IDE、Native IDE以及AHCI这三种模式的区别,我猜测是这样的。在SATA推出来之后已经是

Windows Xp时代了,为了使得过去的操作系统及应用程序能够使用SATA设备,需要做一些兼容性的措

施,所以就有了Legacy IDE;而新的系统就不需要这些措施,称为Native IDE;不论是Legacy IDE还是

Native IDE,都需要进行串行到并行的转换以兼容过去的PATA模式。AHCI模式推出后就不需要这种转

换,并有了新的特性,它能很好的发挥到SATA的优势。可以这样说Legacy IDE对比于Native IDE,是为

了对过去软件上的兼容;IDE(Legacy IDE和Native IDE)对比于AHCI,是为了对过去硬件上的兼容。

3. 过去常说的IDE (IDE与ATA同义) 通常是并行传输,称之为PATA,相对的串行传输的为SATA。

所谓并行就是一次传输多位数据,串口就是一次传输1位数据。很多地方,串行接口渐渐地取代了并行

接口。一来是串行总线占用空间更小;二来串行传输的电磁干扰较小,出错概率少,传输频率可以很

高,所以传输速度反而会比并行的更快。

4. ICH9中SATA有6个端口,Native IDE模式用D31:F2来操作0-3端口,用D31:F5来操作4-5端口;

legacy IDE只能使用D31:F2来操作0-3端口;AHCI和RAID模式用D31:F2支持所有的6个端口。PCS寄存

器中的从PxP位中可以反映当前哪些端口已经连接了SATA设备。另外端口又有Primary与Secondary之

分,Primary与Secondary底下又有Master与Slave之分。

端口号类型

0

2

1

3

Primary Master

Primary Slave

Secondary Master

Secondary Slave

5. 关于ATAPI。最初ATA只针对磁盘,后来出现ATAPI,能够使ATA接口连接磁盘以外的设备,

比如CDROM。在ATA/ATAPI-7 Draft文档中是这样描述的:A device implementing the Packet

Command Feature Set。也就是实现了包指令集的设备。现在所有的SATA设备当然都支持ATAPI。

ATA控制器通过向ATA设备发送命令来与ATA设备交互,ATA设备都支持General Feature Set,实现

ATAPI接口的设备除了支持通用指令集外还支持包指令集。下图列举了部分指令集。如何判断是否ATA

设备是否支持ATAPI?通过发送命令“EXECUTE DEVICE DIAGNOSTIC”。可以参考ATA/ATAPI-7

Draft。

-EXECUTE DEVICE DIAGNOSTIC

-FLUSH CACHE

General Feature Set:-IDENTIFY DEVICE

-READ DMA

-......

Packet Command Feature Set:

-PACKET

-DEVICE RESET

-IDENTIFY PACKET DEVICE

二、控制器与设备间的交互 (采用Block Command Registers)

Block Command Registers有8个寄存器,在Legacy IDE的模式下,它们处在IO Space的1F0H的位

置;在Native IDE或者AHCI模式下,它们在PCMD_BAR和SCMD_BAR所指定的位置。如何判断硬盘处

于哪种模式,请查看MAP以及PI寄存器的说明。如何判断是PCMD_BAR还是SCMD_BAR,可以先从

PCS中找到连接了SATA设备的端口号,端口0和2是Primary,端口1和3是Secondary。那Master与Slave该

如何区分?后面再说。

寻址方式有两种,LBA(Logic Block Address)和CHS(Cylinder/Head/Sector),前者是一个线性

地址,后者是一个3维地址,前者的起始位置是0,后者的起始位置是0磁道0磁头1扇区。

Block Command Registers的说明如下表:

第一步,读取寄存器7,判断bit7和bit6是否分别是0和1。如果不是,则需要循环等待并继续读取判

断。注意这个寄存器在读的时候为状态寄存器,写的时候为命令寄存器。

76543210

BSYDRDYDF/SE#DRQ## ERR

Bit7为BUSY位,0表示设备空闲,1表示设备忙

Bit6为Device Ready为,0表示没有准备好,1表示已经准备好接受命令

第二步,设置Device/Head寄存器,设置为E0,为什么设置为E0,如下,

7

1

6543210

L/C1DEV

Bit6为选择寻址方式,0表示CHS方式,1表示LBA方式

Bit4为设备选择,0表示选择Master,1表示选择Slave

Bit3-0为地址,LBA方式则为高位地址,CHS方式则为磁头号

第三步,设置Sector Count寄存器,指定读取的扇区数量。这里指定为1,表示读取1个扇区。

第四步,设置LBA Low/Mid/High这几个寄存器为0,0,0。这样就指定完了LBA为0。(如果是

CHS方式,第一个扇区应该是0磁头0磁道1扇区)

第五步,写寄存器7为20H,表示发送READ SECTORS命令。为什么写20h表示这个命令?其实这

些命令是已经规范好了的,不同的数值代指不同的命名。具体细节可以查看ATA/ATAPI-7 Draft.

第六步,读取寄存器7,循环判断bit7与bit6是否为01,以表示命令执行结束,以及bit0是否为1(为

1则表示命令执行出错)。若出错,则读取寄存器1,以了解具体错误。该寄存器在出错的情况下反映具

体错误,在正确的情况下反映的是数据高8位。不同的命令错误所需要判断的位不同 。具体请查看

ATA/ATAPI-7 Draft。

第七步,假如命令执行结束且没有错误,循环读取Data[15-0]共256次,因为1个扇区是512字节。

本文标签: 设备寄存器表示