在上一篇笔记SATA学习笔记1 - Link Layer初认识中,我们简单了解了FIS是如何在不同的layer中进行传输和接收的,在这篇笔记中,我将进一步讲解FIS的相关知识。
在讲FIS前,我们先来看看SATA中的registers。SATA规定了一系列的registers,其中包括command register, control register和SATA registers。其中我们将command register和control register统称为shadow register,FIS的产生、传输、接收都和shadow register有很大的关系(在Device端是task file,它们的结构是一样的)。下图是一个简化的SATA shadow register的示意图:
从图中我们可以看出,HOST和Device之间的信号传输,在硬件层面和shadow register和task file有很大的关系。除了shadow register包含的command和control register,我们可以看到还有一个SATA registers,SATA registers其实是一系列的registers。在SATA 2中,一共有5个SATA register,下图是这五个register:
这5个register的详细介绍请参看SATA Specification 3.2 P764.
有了这些register的介绍后,我们就可以来看看如何使用shadow register了。
在application layer,当我们要发送一个命令时,application会根据命令的类型来给shadow register赋值,这其中也包含了给command register写入我们需要发送的命令。一旦我们对command或者control register进行了写操作后,shadow register中的内容就会被送到transport layer,transport layer再根据接收到的内容生成FIS(FIS中元素的值都来自于shadow register或者task file),然后通过Link Layer, Physical Layer将FIS发送给Device。当Device接收到该FIS后,它会进行一系列的操作,包括1) 在task file中更新command register;2) 根据command的运行情况更新task file;3) 将更新后的task file作为数据源产生一个新的FIS用于发送给HOST等。当HOST接收到Device发送过来的FIS后,它会根据FIS的值更新shadow register,并对Error等异常情况作出相应的处理。
下面是一个简化版的command sequence: