ATA Disk在Linux中的驱动架构对比分析

转自 http://blog.ednchina.com/tiloog/219030/message.aspx     

   这里所说的ATA Disk包含两大类:一类是传统的并行ATAPATA),即IDE接口;另一类是目前流行的串行ATASATA)。对于IDE的驱动,Linux-2.6.28还进行了保留,其可以驱成传统的HD设备,也可以驱成流行的SD设备。对于SATA设备,Linux的标准做法是驱成SD设备,下面对传统ATA的驱动架构和目前流行ATA的驱动架构进行对比分析说明。


       传统ATA的驱动框架如上图所示,传统的ATA Host架构在PCI总线之上,在PCI总线扫描过程中枚举得到。PCI扫描程序ScanATA Host之后会加载该设备的驱动程序,即ATA Host Driver,该Driver亦是一个PCI Device的驱动。ATA Host会被注册到IDE Core Level驱动层,从而生成一条IDE的总线,IDE核心层在对ATA Host初始化完毕之后会扫描该Host,并且加载适合设备的IDE Device Driver。如果Ide Device Driver是一个Ide Disk的驱动,那么ATA磁盘将会被驱成HD设备;如果驱动是Ide-Scsi,那么ATA Device将会被虚拟成一个SCSI Host,并且将该Host加入到Scsi Middle Leve驱动层,同样的原理,Scsi Middle Level驱动层会扫描这个虚拟的Scsi host,然后加载扫描得到设备的驱动,这个驱动通常为scsi disk driver,此时,一个传统IDE设备被驱成了一个SCSI设备。从上述的驱动栈我们可以看出,IDE设备被虚拟成SCSI设备的关键在于IDE Device Driver,在该层对设备进行了虚拟化处理,形成了一条虚拟的SCSI总线,然后再将设备虚拟成了SCSI Device,按照这种思路,我们可以不断的进行设备虚拟和总线层叠扩展。

       从上述驱动框架来看,IDE总线层作用并不是很大,因此,完全可以将IDE总线层抛弃,直接采用如下图所示的驱动框架,这也是目前SATA等驱动常用的驱动模型。


       在上述驱动模型中,ATA Host的枚举过程与第一个模型保持一致,但是ATA Host Driver会直接将ATA Host注册到SCSI Middle Level层,考虑到ATA协议层与SCSI协议层存在差异,因此,通过LibATA驱动作为SCSI Middle LevelATA Host之间的转换层,从而可以很好的将ATA Host直接融入到SCSI的驱动体系中来,可以直接将ATA设备驱成SCSI Device。与第一个模型相比,这个模型的驱动栈变浅了,驱动效率提高了,而且可以无缝的将ATA驱动融入到SCSI驱动体系中。在这个驱动模型中,LibATA驱动无疑是最大的功臣。目前,很多SATA Host驱动以及PATA Host的驱动都采用这种模型。

原文地址:https://www.cnblogs.com/leino11121/p/2381899.html