趙昶宇
(天津津航計(jì)算技術(shù)研究所,天津 300308)
在VxWorks 嵌入式操作系統(tǒng)中,隨著嵌入式設(shè)備功能的日益強(qiáng)大,需要記錄的數(shù)據(jù)量也隨之日益增多。因此,對(duì)相應(yīng)存儲(chǔ)設(shè)備的存儲(chǔ)容量和讀寫速度提出了越來越高的要求。傳統(tǒng)的數(shù)據(jù)存儲(chǔ)接口由于存在數(shù)據(jù)傳輸速度慢,甚至數(shù)據(jù)傳輸不穩(wěn)定等缺陷,已經(jīng)不滿足當(dāng)下嵌入式系統(tǒng)的存儲(chǔ)需求。
串行高級(jí)技術(shù)附件接口(SATA)作為新一代存儲(chǔ)數(shù)據(jù)接口,具有傳輸速度快、可靠性高、支持熱插拔等特點(diǎn),被廣泛應(yīng)用于各種存儲(chǔ)系統(tǒng)中。串行ATA 高級(jí)主機(jī)控制器接口(Serial ATA Advanced Host Controller Interface,AHCI)專為SATA 協(xié)議開發(fā),充分發(fā)揮SATA 協(xié)議的傳輸能力,并極大方便了驅(qū)動(dòng)軟件的移植。
但是,不是所有主板上處理器的存儲(chǔ)接口都支持AHCI。對(duì)于那些僅支持IDE 接口的處理器,在BIOS(Basic Input Output System,基本輸入輸出系統(tǒng))兼容模式下使用SATA 硬盤,其傳輸速度的峰值為30 MB/s,遠(yuǎn)低于SATA 1.0 的理論最高傳輸速率(150 MB/s)。為了提高IDE 驅(qū)動(dòng)模式下SATA 硬盤的傳輸速度,充分發(fā)揮SATA 協(xié)議的傳輸能力,本文提出了一種在VxWorks 系統(tǒng)下提高SATA 硬盤傳輸速度的方法。該方法能夠在IDE 驅(qū)動(dòng)模式下,提高SATA硬盤的傳輸速度,充分發(fā)揮SATA 協(xié)議的傳輸能力。
VxWorks 的文件系統(tǒng)并不是直接與塊設(shè)備驅(qū)動(dòng)交互,VxWorks6.8 以后在塊設(shè)備驅(qū)動(dòng)之上封裝了XBD(Extend Block Device)層,應(yīng)用軟件的讀寫請(qǐng)求通過文件系統(tǒng)提供的標(biāo)準(zhǔn)文件存取控制接口訪問XBD 層,并由XBD 層對(duì)塊設(shè)備發(fā)起讀寫請(qǐng)求,塊設(shè)備根據(jù)接收到的讀寫命令調(diào)用自身的讀寫驅(qū)動(dòng)函數(shù)來操作硬件[1]。
VxWorks 下SATA 驅(qū)動(dòng)的框架結(jié)構(gòu)如圖1 所示。
圖1 VxWorks 下SATA 驅(qū)動(dòng)的框架結(jié)構(gòu)
SATA 驅(qū)動(dòng)和dos 文件系統(tǒng)的交互流程如下。
步驟一:VxWorks 系統(tǒng)上電后,完成必要的初始化后,運(yùn)行usrRoot 函數(shù)開始執(zhí)行第一個(gè)內(nèi)核任務(wù)。
步驟二:usrRoot 函數(shù)中調(diào)用usrDosfsInit 函數(shù)對(duì)dosFs 文件進(jìn)行系統(tǒng)初始化,usrDosfsInit 函數(shù)調(diào)用完dosFsInit 函數(shù)之后會(huì)調(diào)用 fsmProbeInstall(dosFsDiskProbe,dosFsMonitorDevCreate)和底層驅(qū)動(dòng)建立鏈接。
步驟三:usrRoot 函數(shù)然后調(diào)用xbdInit 函數(shù)對(duì)XBD層進(jìn)行初始化,XBD 初始化完后緊接著會(huì)有fsMonitorInit 函數(shù),并且注冊(cè)了關(guān)于XBD 的事件處理函數(shù)[2]。
步驟四:usrRoot 函數(shù)調(diào)用usrAtaInit 函數(shù)完成對(duì)SATA 設(shè)備的初始化,然后調(diào)用usrAtaConfig 函數(shù),主要完成2 件事情,第一件為調(diào)用fsmNameInstall 函數(shù),向文件系統(tǒng)添加SATA 設(shè)備名,添加到fsmNameList列表中;第二件為調(diào)用ataXbdDevCreate 函數(shù),將SATA底層驅(qū)動(dòng)接口函數(shù)注冊(cè)到XBD 層。
在usrAtaConfig 函數(shù)中調(diào)用ataDevCreate 函數(shù)完成BLK_DEV 結(jié)構(gòu)初始化以及所有其他準(zhǔn)備工作。當(dāng)ataXbdDevCreate 函數(shù)返回后,底層塊設(shè)備驅(qū)動(dòng)以及塊設(shè)備本身等待上層設(shè)備操作請(qǐng)求。
BLK_DEV 結(jié)構(gòu)是文件系統(tǒng)層與底層塊設(shè)備驅(qū)動(dòng)層之間信息交互的唯一“媒介”,BLK_DEV 結(jié)構(gòu)包含的信息有:①塊設(shè)備數(shù)據(jù)寫入函數(shù);②塊設(shè)備數(shù)據(jù)讀取函數(shù);③塊設(shè)備控制函數(shù);④塊設(shè)備本身關(guān)鍵參數(shù)信息,如總扇區(qū)數(shù)(或總塊數(shù))、磁道數(shù)、磁頭數(shù)、每磁道扇區(qū)數(shù),對(duì)于非硬盤塊設(shè)備,還需提供每個(gè)塊的字節(jié)數(shù);⑤執(zhí)行完ataDevCreate 函數(shù)之后,底層的SATA 塊設(shè)備驅(qū)動(dòng)就已經(jīng)準(zhǔn)備好,再回看步驟②中的dosFsMonitorDevCreate 函數(shù),dosFS 在初始化之后,先調(diào)用 dosFsMonitorDevCreate 函數(shù),再調(diào)用dosFsDevCreate 函數(shù)。
dosFsDevCreate 函數(shù)的功能如下:完成dosFs 文件系統(tǒng)與底層塊設(shè)備驅(qū)動(dòng)之間的銜接工作,具體是通過傳遞一個(gè)由底層驅(qū)動(dòng)初始化的BLK_DEV結(jié)構(gòu)給dosFs中間層完成的,BLK_DEV 結(jié)構(gòu)包含底層塊設(shè)備驅(qū)動(dòng)的關(guān)鍵信息;完成塊設(shè)備節(jié)點(diǎn)的創(chuàng)建和向系統(tǒng)設(shè)備列表注冊(cè)的工作,這個(gè)工作完成后,底層塊設(shè)備就對(duì)用戶可見了,用戶可以使用標(biāo)準(zhǔn)接口函數(shù)對(duì)塊設(shè)備進(jìn)行操作;對(duì)dosFs 文件系統(tǒng)本身的一些參數(shù)進(jìn)行初始化,如最大文件句柄數(shù),文件系統(tǒng)一致性檢查級(jí)別。
步驟五:dosFsDevCreate 函數(shù)調(diào)用完成后,應(yīng)用層程序就可以對(duì)底層塊設(shè)備進(jìn)行操作了?;赿osFs的塊設(shè)備將以文件和目錄層次性的視圖提供給用戶層,所以用戶只是對(duì)塊設(shè)備中一個(gè)區(qū)域進(jìn)行操作,從上層來看,就是對(duì)某個(gè)文件或者目錄的操作。此時(shí)用戶程序不再是打開整個(gè)設(shè)備,而是打開存儲(chǔ)在底層塊設(shè)備上的某個(gè)文件或者目錄。
ATA 接口具有3 種數(shù)據(jù)傳輸方式:①PIO(Programmable Input-Output)傳輸,可以分為PIO 寄存器傳輸和PIO 數(shù)據(jù)傳輸。PIO 寄存器傳輸主要用于對(duì)ATA 設(shè)備中的寄存器進(jìn)行讀寫。讀寫的數(shù)據(jù)位數(shù)為8 位DD[7:0]。ATA 主機(jī)控制器根據(jù)所要讀寫的寄存器地址設(shè)置CS0_、CS1_、DA[2:0]地址信號(hào),同時(shí)將DIOW_或DIOR_設(shè)為有效,ATA 主機(jī)控制器或ATA設(shè)備驅(qū)動(dòng)數(shù)據(jù)總線釋放數(shù)據(jù)。當(dāng)DIOW_或DIOR_撤銷時(shí),ATA 主機(jī)控制器或ATA 設(shè)備從數(shù)據(jù)總線上讀取數(shù)據(jù)。②MDMA(Multiword Direct Memory Access)傳輸,用于數(shù)據(jù)傳輸。ATA 主機(jī)控制器向ATA 設(shè)備下達(dá)MDMA 傳輸命令后,等待設(shè)備向主機(jī)發(fā)送DMARQ 數(shù)據(jù)傳輸請(qǐng)求信號(hào)。當(dāng)主機(jī)收到DMARQ 信號(hào)后,向設(shè)備發(fā)送DMACK_響應(yīng)信號(hào)。MDMA 數(shù)據(jù)傳輸過程也是通過DIOW_或DIOR_的周期變化來控制數(shù)據(jù)的傳輸。③UDMA(Ultra Direct Memory Access),也是用于數(shù)據(jù)傳輸。這種傳輸方式的傳輸速度比MDMA 要快,ATA/ATAPI-5 協(xié)議中所定義的UDMA 傳輸方式最高數(shù)據(jù)傳輸速率是66 MB/s。UDMA 對(duì)數(shù)據(jù)傳輸?shù)目刂菩盘?hào)重新進(jìn)行了定義。UDMA 還引入了CRC(Cyclic Redundancy Check)數(shù)據(jù)校驗(yàn)機(jī)制,保證了數(shù)據(jù)傳輸過程的正確性。
為了提升SATA 硬盤在IDE 驅(qū)動(dòng)模式下的傳輸速度,需要將BSP(Board Support Package)中的config.h文件作如下修改。
在config.h 中進(jìn)行如下設(shè)置:
若SATA 控制器的個(gè)數(shù)為1,SATA 驅(qū)動(dòng)的個(gè)數(shù)也為1,則按照如下設(shè)置SATA 驅(qū)動(dòng)的數(shù)量、控制器的邏輯類型及中斷類型:
設(shè)置SATA 數(shù)據(jù)傳輸模式為ATA_DMA_AUTO 模式,傳輸位數(shù)為32 位,具體如下:
若SATA 控制器的個(gè)數(shù)為2,SATA 驅(qū)動(dòng)的個(gè)數(shù)也為2,則按照如下設(shè)置SATA 驅(qū)動(dòng)的數(shù)量、控制器的邏輯類型及中斷類型:
在主板BIOS 中設(shè)置SATA 控制器的模式為“IDE模式”或者“兼容模式”,并設(shè)置VxWorks 系統(tǒng)優(yōu)先從SATA 盤啟動(dòng)。
針對(duì)IDE 驅(qū)動(dòng)模式下SATA 硬盤傳輸速度慢的問題,本文提出了一種在VxWorks 系統(tǒng)下提高SATA 硬盤傳輸速度的方法。該方法首先修改BSP 中VxWorks系統(tǒng)缺省的啟動(dòng)路徑,讓它從SATA 盤啟動(dòng);然后設(shè)置SATA 盤的名稱,修改SATA 驅(qū)動(dòng)的數(shù)量,控制器的邏輯類型以及中斷類型,設(shè)置SATA 數(shù)據(jù)傳輸?shù)膫鬏斈J胶蛡鬏斘粩?shù);最后在主板BIOS 中設(shè)置SATA 控制器的模式為“IDE 模式”或者“兼容模式”,并設(shè)置VxWorks 系統(tǒng)優(yōu)先從SATA 盤啟動(dòng)。本文采用DMA模式進(jìn)行SATA 傳輸,能夠充分發(fā)揮SATA 協(xié)議的傳輸能力,將SATA 硬盤在VxWorks 下的讀寫速度提高到120 MB/s 左右,完美解決了在IDE 驅(qū)動(dòng)模式下SATA硬盤的傳輸速度瓶頸問題。