什么是AHCI?我的个人理解是AHCI定义了传输ATA/ATAPI命令的一个接口规范,当然目前AHCI是比较传统的一个规范,更早期的接口规范是IDE了解的或者听说过的可能不多了,虽然AHCI相对比较传统,但是当下应用还是比较普遍,所以有必要做简单了解。本文帮助大家初步了解AHCI的基本概念,可以让大家掌握基础AHCI概念后,有能力阅读AHCI规范,更详尽的了解AHCI。AHCI支持ATA/ATAPI device,因此相关的命令需要参考ATA/ATAPI规范。AHCI支持PIO/DMA protocol。无论PIO还是DMA数据传输,HBA(Host Bus Adapter)一直作为bus master执行system memory和device的数据传输。因此更进一步可以理解AHCI其实就是定义system memory和SATA device进行数据传输的一个interface!AHCI寄存器介绍 AHCI Memory Structure AHCI Memory Structure Receive FIS Structure Command List Structure Command Table Structure AHCI UEFI Driver Stack 以Identify command为例具体介绍如何透过AHCI 发送ATA/ATAPI命令 Step1 Check Device在哪一个AHCI port上 Example code: PxSSTS寄存器 PortData = ReadMmioDword(Abar+Port*0x80+100+HBA_PORTS_SSTS); if((PortData&0x0f)==3) //Device on this port! Step2 Get Device Type PxSIG寄存器 PortData = ReadMmioDword(Abar+Port*0x80+0x100+HBA_PORTS_SIG); if((PortData&0xffff0000) = 0xeb140000) DeviceType ATAPI else Device Type ATA Step3 Build command table 之CFIS CFIS Structure Type = 0x27 C = 1 Command = 0xec //ATA device identify Sector Number = 1 Step4 Build command table之PRDT table PRDT Structure DBC = Identify data count DW3 BIT0 BIT1 置1 DBA = Identify data buffer address Step5 Build Command List Structure Command List Structure CFL=CFIS长度 = 5 PRDTL = PRDT entry number,对于Identify command PRDTL = 1 CTBA = command table base address Step6: Start Command Register PxCI port command issue 选择command list中的某个command例如: PxCI Bit0 = 1 ,选择command 0 Register PxCMD Set Bit0 to 1,执行命令