第23卷第ll 期  计算机应用与软件
VoI.23,No.ll
2006年ll 月  Computer AppIications and Software Nov.2006
SATA 及ADMA 控制器Linux 操作系统驱动的设计与实现
孙文波 尤晋元
(上海交通大学软件学院 上海200030)
收稿日期:2004-09-27。基金项目:国家自然科学基金(项目编号:60l73033)的资助。孙文波,硕士生,主研领域:嵌入式系统,软件工程。
摘 要  信息时代,数据的存储及远程备份尤为重要。为了满足用户对存储系统产品的高性能及低费用的需求,设计和实现了一种新型存储外设的操作系统驱动,该存储系统采用SATA 磁盘及ADMA 控制器并基于Linux 系统。着重于如何驱动SATA 磁盘及ADMA 控制器并实现一些关键功能,以大幅提升数据存储性能。实验结果表明,性能已远超过采用IDE 磁盘的存储系统,对于大批量数据存取,性能更为显著。
关键词  SATA 及ADMA 控制器 ADMA NCO ADMA 命令标记 热插拔
DESIGN AND IMPLEMENTATI N  LINUX DEVICE
DRIVER BASED  N SATA&ADMA C NTR LLER
Sun Wenbo You Jinyuan
(School of Software ,Shanghai Jiaotong Uniuersity ,Shanghai 200030,China )
linux内核设计与实现 pdfAbstract  At the age of information ,it s very important for the IocaI or remote data storage and backup.For meeting the needs of users on the storage system product that is high performance and Iow cost ,in this paper ,the 0S device driver of a new storage peripheraI that is SATA Hard-Disk and ADMA controIIer has been designed and impIemented under Linux 0S.This paper highIights how to drive SATA and ADMA controIIer based on some important functions for high performance.The resuIts of experiment indicate :the performance of system exceeds far-ther that of system based on IDE hard-disk ,especiaIIy in a Iarge data transfer.
Keywords  SATA and ADMA controIIer ADMA NCO ADMA tagged command Hot-pIug
1 前 言
在Linux 系统里,I /0设备被分为三类:块设备、字符设备和网络设备。本文属于块设备驱动。块设备用来存储定长且可随机访问的数据块,对块设备的所有操作都以块为单位进行。在高性能系统的块设备I /0控制方式中,DMA 和I /0通道方式较为常用,前者由DMA 控制器接管CPU 总线控制权,数据不经过CPU 而直接在内存和I /0设备之间进行成块传输,从而在一定程度上提高了系统的数据传输效率;后者可以获得CPU 和外设之间更高的并行能力,它的引入使得数据的输入输出成为一个独立的系统。但它的成本较高。
2 SATA 及ADMA 控制器及其功能简介
从以上两种I /0控制方式优缺点比较可以看出,其功能和
性能的提升还有很大空间,尤其是随着一种新型块设备SeriaI ATA (SATA )的出现,促使设计开发一种功能与性能更强的I /0控制器来发挥高性能SATA 的潜力,这种I /0控制器就是本文所要介绍的ADMA 控制器,它采用一种新的I /0控制方式。
2.1 SATA
SATA 相对于并行ATA 硬盘内部总线而言,它是一种串行
架构。同IDE /ATA 及SCSI 接口的块设备相比较而言,
SATA 有许多显著优点。(l )针脚减少使连接更便捷、信号干扰变小使传输更稳定,准确性提高;(2)传输速度更快,SATAl.0可达lS0MB /s ,SATA3.0可达600MB /s ,同时SATA 支持热插拔;(3)SATA 扩展性良好,技术也更成熟。就成本而言,远低于SCSI 产品,甚至比一些IDE /ATA 产品的成本还要低。因此,适用范围更广。
2.2 ADMA
ADMA 即Automatic Direct Memory Access 。它在I /0控制方式上使用ADMA 方式,
在数据I /0传输方式上等同于DMA ,但ADMA 在功能和性能上又远强于DMA ,DMA 处理大批量数据传输,而ADMA 则是处理大量DMA 的数据传输,即若干个DMA 数据传输形成DMA 链交由ADMA 控制与处理,数据校验及结果检查都由ADMA 来完成。CPU 基本上不干预数据的传送操作,只是在ADMA 操作开始和结束时,花费极短的时间参与控制管理工作。
2.3 ADMA 控制器
ADMA 控制器管理多个SATA 设备,它主要实现了ADMA
计算机应用与软件2006年
功能,为了发挥ADMA 的性能,主板上一般采用速度和频率更高的64位PCI-X 总线,因为ADMA 控制器是以板卡的形式插在PCI 或PCI-X 总线插槽上的。ADMA 控制器包含若干个ADMA Engine ,ADMA Engine 是其核心部分,它实现了重要的CPB (Command Parameter BIock )命令链及APRD (ADMA PhysicaI Re-gion Descriptor )数据链架构并包含大量的控制、状态和数据寄存器以及用于传输数据的FIF0等。此外,ADMA 控制器还包含对命令标记功能的支持。图l 为CPB 及APRD 结构图。
图 l
2.4 SATA 命令排队及ADMA 命令标记
命令排队在优化驱动器命令执行次序、最小化驱动器机械定位延迟及提高系统性能方面起到了非常重要及显著的作用。在SATA 设备中,命令排队被称为NCO (Native Command Oueu-ing )。NCO 是一个命令协议,它允许同时对一个SATA 驱动器发出多条命令,这些命令进入驱动器形成命令队列,驱动器可以动态地对命令队列中的未完成的命令重排序或重新调度,同时跟踪未完成的命令和已完成的命令。
ADMA 命令标记功能实现在ADMA Engine 的CPB 命令链中,每个CPB 均可加上标记,一旦启动ADMA Engine 进行数据传输,若当前CPB 不能马上得到执行,那么该CPB 的地址信息被暂时存入CPB Lookup TabIe (见图l )中,后续CPB 不受该CPB 的影响继续运行,若该CPB 随后又得到了运行时机,那么根据其标记从CPB Lookup TabIe 中再到该CPB 并将其投入运行。反之,若不使用ADMA 命令标记功能,则CPB 不加标记,那么当前CPB 若不能马上得到执行,那么就等待,直到其完成为止,然后后续的CPB 才能运行。
3 SATA 及ADMA 控制器Linux 操作系统驱
动的设计与实现
以上介绍了SATA 与ADMA 设备及其功能,那么在相应的Linux 系统驱动的设计与实现中,则必然要发挥SATA 与ADMA 设备的功能和体现其优越的性能,同时向操作系统提供强有力的支持。在本文的设计与实现中,主要涉及协议选型、ADMA Engine 控制、命令链与数据链及一些关键数据结构的构造与操作,数据I /0的实现及中断处理、命令标记及Hot-pIug 的功能实现等。如下将做一一介绍。
3.1 总线技术及协议选取(IDE 比较SCSI )
IDE 即ATA 。IDE 控制器实现了寄存器模型,其命令寄存器是非常重要的一类寄存器,因为当对磁盘进行操作时,是通过发命令方式进行的。在Linux 系统中,IDE 架构有一个显著特
点,即上层经驱动对IDE 设备进行读写数据时,每次只能发送一个命令,只有当前命令完成并返回后,上层才会发送第二个命令下来。SCSI 在标准上被分解为接口、协议、设备模型和命令集。SCSI 块设备模型遵循整个SCSI 体系结构模型,在SCSI 块设备模型中,命令集非常重要,它表示了该类设备功能的强弱。在Linux 系统SCSI 架构下,当上层经驱动对SCSI 块设备进行读写数据时,每次可以发送多个读写命令下来,当这些命令操作完成后可一并返回,这样减少了系统开销。对于大批量数据传输,采用SCSI 结架构的数据传输机制其性能优势尤为明显。鉴于以上分析,采用SCSI 的驱动架构比较合理且切实可行。
3.2 驱动架构及流程的设计与实现
SATA 及ADMA 的SCSI 驱动架构分两部分作以介绍:驱动架构部分和驱动流程部分。在Linux 系统中,SCSI 子系统架构分三个层次:SCSI Upper LeveI (SUL )、SCSI MiddIe LeveI (SML )和SCSI Low-LeveI Drivers (LLD )。SUL 处于SCSI 子系统的最上层,对上同II_rw_bIk 层交互,对下同SML 层衔接。SUL 层的任务就是把上层传来的请求转换为SCSI 格式的请求,并提交给
SML 层,同时等待处理结果。SML 处于中间层,对下同LLD 层通信。LLD 是最低层,同硬件打交道,它负责在Initiator (启动器)和Target (目标器)之间传送命令、数据、状态及消息等,启动器和目标器是SCSI 子系统的设备模型。本文的SATA 及AD-MA 控制器的Linux 系统驱动设计与实现就属于LLD 层的设计与实现,ADMA 控制器对应启动器,SATA 设备对应目标器,图2为SATA 及ADMA 控制器的SCSI 子系统功能结构图。
图 2
LLD 层驱动的主要任务是控制SATA 及ADMA 控制器,它负责启动SATA 及ADMA 设备,捕获设备中断并进行I /0中断处理以及实现设备无关性等。驱动直接与硬件打交道,并向SML 层提供一组访问接口,LLD 驱动就是要设计和实现这组接口。图3为两层之间的接口示意图。
图 3
在LLD 驱动架构中,驱动接口和功能的设计与实现尤为重要。驱动与外界的接口分三部分:(l )驱动与Linux 系统内核的接口,这里即为与SML 层的接口;(2)驱动与系统引导的接口,这部分对SATA 及ADMA 设备进行初始化,入口为Detect 函数;(3)驱动与SATA 及ADMA 设备的接口,驱动通过SATA 及AD-
2
第ll期孙文波等:SATA及ADMA控制器Linux操作系统驱动的设计与实现
MA控制器的接口寄存器及ADMA Engine的命令链和数据链(见图l)同SATA及ADMA设备进行信息交互。驱动的功能分为五个部分:(l)驱动注册与注销。驱动注册通过使用函数Scsi _register向SML层注册并提供一组访问接口(见图3)。驱动注销刚好相反,释放软硬件资源。(2)ADMA控制器的设备识别及资源初始化。设备识别通过设备的Vendor ID、Device ID以及系统函数调用Pci_find_device来实现。若ADMA控制器被到,则在系统中被标识为一个PCI设备。随后,可以获取设备中断资源、I/0及Memory地址空间等,同时注册中断处理函数。(3)SATA设备识别及其寄存器设置。SATA设备识别是通过SML层向LLD层发送命令的方式进行的,成功执行三条命令即可识别一个SATA设备并可向该设备进行读写操作,这三个命令为:Inguiry、Test_Unit_Ready和ReadCapacity。然后设置其寄存器为数据I/0做准备,通常设置数据传输模式及设备特性等。(4)SATA及ADMA设备读写操作。ADM
A的数据传输机制见2.2的相关内容。在数据传输之前,先要构造和初始化其命令链与数据链(见图l),驱动程序根据SML层下传的命令及数据地址信息填充CPB链和APRD链,在完成填充后,就可启动AD-MA Engine进行数据传输。(5)SATA及ADMA设备中断处理。当数据传输完成后,就会触发一个中断,并调用中断处理函数进行处理,在中断处理函数中,检查数据传输后的结果是否异常,并通报SML层。
驱动流程部分如下:(l)SML层调用驱动的Detect函数对SATA及ADMA设备进行初始化,其中包括向上层注册一组访问接口;(2)构造和初始化ADMA Engine的命令链与数据链,一旦需要数据传输,就填充CPB链和APRD链,同时启动ADMA Engine;(3)在ADMA Engine完成数据传输以后,会触发一个中断,并调用中断处理函数;(4)系统卸载某个ADMA控制器HBA 时,则先要释放该HBA初始化时所获取的软硬件资源。卸载该驱动时,则先得卸载所有HBA。以上介绍了驱动架构及流程的设计与实现。下面将着重一些重要功能的实现。
3.3 ADMA命令标记实现
ADMA命令标记的思想见2.4。在构造CPB命令链时,可在每个CPB的命令控制标志字段加入标记,当ADMA Engine启动运行时,若某个CPB不能马上得到执行,那么该CPB的地址信息被暂存入CPB Lookup Tabie(见图3)中,CPB Lookup Tabie 是一段内存空间,它在驱动初始化时被分配好同时它
的首地址被放入ADMA Engine的CPB地址寄存器中。随后若该CPB的数据传输操作可以被SATA设备执行,那么SATA设备就会触发一个中断,驱动在得到中断通知后,检查SATA设备的相关寄存器位的值是否正确,若正确它就从SATA设备中读取未执行命令的标记,驱动根据命令标记、所要读写数据的设备以及CPB 地址寄存器中的地址信息就可以从CPB Lookup Tabie中到未执行的CPB并将其投入运行。
3.4 Hot-plug功能实现
SATA标准定义了Hot-piug(热插拔),因此SATA设备可具有热插拔功能。在驱动程序中,SATA设备的热插拔功能是靠中断机制来实现的。当一个SATA设备接入ADMA控制器时,会触发一个中断,然后进入中断处理程序(该处理程序在ADMA 控制器初始化时就已经向系统作了注册)更新ADMA控制器
HBA的资源及对应的数据结构信息,同时报告上层有新的设备插入。随后驱动程序发送命令对新的设备进行识别,正确识别后即可进入正常的数据I/0阶段。反之,SATA设备拔出ADMA 控制器,则驱动执行过程同上述正好相反。
4 实验测试
实验测试环境为CPU PIII l.2G,内存256M,操作系统Red-Hat9(kernei2.4),主板PCI总线频率66MHz。
为了检验ADMA系统的性能,分别对Uitrai33系统和AD-MA系统做性能测试且对比两者的读写性能。所有的测试都进行三遍,然后对于测试结果取平均值。测试结果如图4所示。实验结果显示,与Uitrai33系统的读写性能相比,ADMA系统将读写性能提高了将近0.5倍,因此,它对数据存储性能的提升是
显而易见的。
(Uitral33系统代表Uitral33控制器,具有PATA接口,连接两个S0GB7200RPM Maxtor磁盘且磁盘不支持TCO功能以及它们的驱动程序。ADMA系统代表ADMA控制器,具有SATA接口,连接两个74GB l0000RPM WD SATA磁盘且磁盘支持TCO功能以及它们的驱协程序)
图4
5 结论与展望
在存储系统中,外设一直存在着性能瓶颈问题,从而严重影响整个系统性能的提高。而本文的ADMA存储系统则使这一现状大有改观。实验结果显示,ADMA存储系统对数据存取性能的提升是非常显著的。这使得它在高端存储系统以及对数据存储性能要求很高的场合,ADMA存储系统均能提供良好的支持,若要进一步扩展其功能和性能,则还需要在此基础上做软硬件的再开发。比如硬件RAID和iSCSI网络存储的支持,RAID 可实现RAID0/l/l0/5,iSCSI除实现本身的协议外,还可以实现T0E。总之,基于如上技术可以开发不同形式的存储系统产品提供个人、家庭及企业用户使用,同时实现更好的性价比,来满足市场的需求!
参考文献
[l]Seriai ATA Advanced Host Controiier Interface(AHCI),Intei Corpora-tion,Apr,2004.
[2]Seriai ATA Native Command Oueuing,Intei Corporation and Seagate Teclnoiogy,Jui,2003.
[3]PCI Seriai-ATA Host Bus Adapters Specification Working Draft Revision
0.3,LSI Design&Integration Corporation,May,2003.
[4]ATA/ATAPI Host Adapters Standard(ATA-Adapter)Working Draft Re-vision l.0,Pacific Digitai Corporation,Jan,2003.
3
SATA及ADMA控制器Linux操作系统驱动的设计与实现
作者:孙文波, 尤晋元, Sun Wenbo, You Jinyuan
作者单位:上海交通大学软件学院,上海,200030
刊名:
计算机应用与软件
英文刊名:COMPUTER APPLICATIONS AND SOFTWARE
年,卷(期):2006,23(11)
1.ATA/ATAPI Host Adapters Standard(ATA-Adapter) Working Draft Revision 1.0 2003
2.PCI Serial-ATA Host Bus Adapters Specification Working Draft Revision 0.3 2003
3.Serial ATA Native Command Queuing,Intel Corporation and Seagate Technology 2003
4.Serial ATA Advanced Host Controller Interface(AHCI) 2004
本文链接:d.g.wanfangdata/Periodical_jsjyyyrj200611001.aspx

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。