VxWorks 系统下提高SATA 硬盘传输速度的方法
2023-10-09赵昶宇
赵昶宇
(天津津航计算技术研究所,天津 300308)
在VxWorks 嵌入式操作系统中,随着嵌入式设备功能的日益强大,需要记录的数据量也随之日益增多。因此,对相应存储设备的存储容量和读写速度提出了越来越高的要求。传统的数据存储接口由于存在数据传输速度慢,甚至数据传输不稳定等缺陷,已经不满足当下嵌入式系统的存储需求。
串行高级技术附件接口(SATA)作为新一代存储数据接口,具有传输速度快、可靠性高、支持热插拔等特点,被广泛应用于各种存储系统中。串行ATA 高级主机控制器接口(Serial ATA Advanced Host Controller Interface,AHCI)专为SATA 协议开发,充分发挥SATA 协议的传输能力,并极大方便了驱动软件的移植。
但是,不是所有主板上处理器的存储接口都支持AHCI。对于那些仅支持IDE 接口的处理器,在BIOS(Basic Input Output System,基本输入输出系统)兼容模式下使用SATA 硬盘,其传输速度的峰值为30 MB/s,远低于SATA 1.0 的理论最高传输速率(150 MB/s)。为了提高IDE 驱动模式下SATA 硬盘的传输速度,充分发挥SATA 协议的传输能力,本文提出了一种在VxWorks 系统下提高SATA 硬盘传输速度的方法。该方法能够在IDE 驱动模式下,提高SATA硬盘的传输速度,充分发挥SATA 协议的传输能力。
1 SATA 驱动和dos 文件系统的交互流程
VxWorks 的文件系统并不是直接与块设备驱动交互,VxWorks6.8 以后在块设备驱动之上封装了XBD(Extend Block Device)层,应用软件的读写请求通过文件系统提供的标准文件存取控制接口访问XBD 层,并由XBD 层对块设备发起读写请求,块设备根据接收到的读写命令调用自身的读写驱动函数来操作硬件[1]。
VxWorks 下SATA 驱动的框架结构如图1 所示。
图1 VxWorks 下SATA 驱动的框架结构
SATA 驱动和dos 文件系统的交互流程如下。
步骤一:VxWorks 系统上电后,完成必要的初始化后,运行usrRoot 函数开始执行第一个内核任务。
步骤二:usrRoot 函数中调用usrDosfsInit 函数对dosFs 文件进行系统初始化,usrDosfsInit 函数调用完dosFsInit 函数之后会调用 fsmProbeInstall(dosFsDiskProbe,dosFsMonitorDevCreate)和底层驱动建立链接。
步骤三:usrRoot 函数然后调用xbdInit 函数对XBD层进行初始化,XBD 初始化完后紧接着会有fsMonitorInit 函数,并且注册了关于XBD 的事件处理函数[2]。
步骤四:usrRoot 函数调用usrAtaInit 函数完成对SATA 设备的初始化,然后调用usrAtaConfig 函数,主要完成2 件事情,第一件为调用fsmNameInstall 函数,向文件系统添加SATA 设备名,添加到fsmNameList列表中;第二件为调用ataXbdDevCreate 函数,将SATA底层驱动接口函数注册到XBD 层。
在usrAtaConfig 函数中调用ataDevCreate 函数完成BLK_DEV 结构初始化以及所有其他准备工作。当ataXbdDevCreate 函数返回后,底层块设备驱动以及块设备本身等待上层设备操作请求。
BLK_DEV 结构是文件系统层与底层块设备驱动层之间信息交互的唯一“媒介”,BLK_DEV 结构包含的信息有:①块设备数据写入函数;②块设备数据读取函数;③块设备控制函数;④块设备本身关键参数信息,如总扇区数(或总块数)、磁道数、磁头数、每磁道扇区数,对于非硬盘块设备,还需提供每个块的字节数;⑤执行完ataDevCreate 函数之后,底层的SATA 块设备驱动就已经准备好,再回看步骤②中的dosFsMonitorDevCreate 函数,dosFS 在初始化之后,先调用 dosFsMonitorDevCreate 函数,再调用dosFsDevCreate 函数。
dosFsDevCreate 函数的功能如下:完成dosFs 文件系统与底层块设备驱动之间的衔接工作,具体是通过传递一个由底层驱动初始化的BLK_DEV结构给dosFs中间层完成的,BLK_DEV 结构包含底层块设备驱动的关键信息;完成块设备节点的创建和向系统设备列表注册的工作,这个工作完成后,底层块设备就对用户可见了,用户可以使用标准接口函数对块设备进行操作;对dosFs 文件系统本身的一些参数进行初始化,如最大文件句柄数,文件系统一致性检查级别。
步骤五:dosFsDevCreate 函数调用完成后,应用层程序就可以对底层块设备进行操作了。基于dosFs的块设备将以文件和目录层次性的视图提供给用户层,所以用户只是对块设备中一个区域进行操作,从上层来看,就是对某个文件或者目录的操作。此时用户程序不再是打开整个设备,而是打开存储在底层块设备上的某个文件或者目录。
2 VxWorks 下提高SATA 硬盘传输速度
ATA 接口具有3 种数据传输方式:①PIO(Programmable Input-Output)传输,可以分为PIO 寄存器传输和PIO 数据传输。PIO 寄存器传输主要用于对ATA 设备中的寄存器进行读写。读写的数据位数为8 位DD[7:0]。ATA 主机控制器根据所要读写的寄存器地址设置CS0_、CS1_、DA[2:0]地址信号,同时将DIOW_或DIOR_设为有效,ATA 主机控制器或ATA设备驱动数据总线释放数据。当DIOW_或DIOR_撤销时,ATA 主机控制器或ATA 设备从数据总线上读取数据。②MDMA(Multiword Direct Memory Access)传输,用于数据传输。ATA 主机控制器向ATA 设备下达MDMA 传输命令后,等待设备向主机发送DMARQ 数据传输请求信号。当主机收到DMARQ 信号后,向设备发送DMACK_响应信号。MDMA 数据传输过程也是通过DIOW_或DIOR_的周期变化来控制数据的传输。③UDMA(Ultra Direct Memory Access),也是用于数据传输。这种传输方式的传输速度比MDMA 要快,ATA/ATAPI-5 协议中所定义的UDMA 传输方式最高数据传输速率是66 MB/s。UDMA 对数据传输的控制信号重新进行了定义。UDMA 还引入了CRC(Cyclic Redundancy Check)数据校验机制,保证了数据传输过程的正确性。
为了提升SATA 硬盘在IDE 驱动模式下的传输速度,需要将BSP(Board Support Package)中的config.h文件作如下修改。
在config.h 中进行如下设置:
若SATA 控制器的个数为1,SATA 驱动的个数也为1,则按照如下设置SATA 驱动的数量、控制器的逻辑类型及中断类型:
设置SATA 数据传输模式为ATA_DMA_AUTO 模式,传输位数为32 位,具体如下:
若SATA 控制器的个数为2,SATA 驱动的个数也为2,则按照如下设置SATA 驱动的数量、控制器的逻辑类型及中断类型:
在主板BIOS 中设置SATA 控制器的模式为“IDE模式”或者“兼容模式”,并设置VxWorks 系统优先从SATA 盘启动。
3 结束语
针对IDE 驱动模式下SATA 硬盘传输速度慢的问题,本文提出了一种在VxWorks 系统下提高SATA 硬盘传输速度的方法。该方法首先修改BSP 中VxWorks系统缺省的启动路径,让它从SATA 盘启动;然后设置SATA 盘的名称,修改SATA 驱动的数量,控制器的逻辑类型以及中断类型,设置SATA 数据传输的传输模式和传输位数;最后在主板BIOS 中设置SATA 控制器的模式为“IDE 模式”或者“兼容模式”,并设置VxWorks 系统优先从SATA 盘启动。本文采用DMA模式进行SATA 传输,能够充分发挥SATA 协议的传输能力,将SATA 硬盘在VxWorks 下的读写速度提高到120 MB/s 左右,完美解决了在IDE 驱动模式下SATA硬盘的传输速度瓶颈问题。