文獻標(biāo)識碼: A
DOI:10.16157/j.issn.0258-7998.2016.11.009
中文引用格式: 尹加豹. VxWorks5.5下電子盤DMA驅(qū)動程序設(shè)計與實現(xiàn)[J].電子技術(shù)應(yīng)用,2016,,42(11):40-43.
英文引用格式: Yin Jiabao. Development of flash disk DMA driver on VxWorks5.5 operating system[J].Application of Electronic Technique,,2016,42(11):40-43.
0 引言
電子盤又稱電子硬盤,它采用符合硬盤接口技術(shù)(Advanced Technology Attachment,,ATA)工業(yè)標(biāo)準(zhǔn)的控制技術(shù),,克服了傳統(tǒng)機械硬盤的弊病,能夠提供高性能和高可靠的數(shù)據(jù)儲存,,被廣泛應(yīng)用于工業(yè)控制,、軍工、航空航天等領(lǐng)域[1],。VxWorks是風(fēng)河公司開發(fā)的嵌入式實時操作系統(tǒng),,其中VxWorks5.5版本具有較高的可靠性和卓越的實時性,在很多領(lǐng)域都有廣泛的應(yīng)用[2],。但是VxWorks5.5系統(tǒng)原生電子盤驅(qū)動僅支持過程輸入輸出(Process Input Output,,PIO)方式,存取速度較慢,,無法滿足某些應(yīng)用的實時性要求,,需要設(shè)計基于直接存儲器存取(Direct Memory Access,,DMA)方式的驅(qū)動,以提升電子盤讀寫速度,,擴展其應(yīng)用領(lǐng)域,。
1 硬件環(huán)境
硬件平臺為中船重工第七一六研究所生產(chǎn)的CM6066單板加固計算機。該計算機主板采用Intel Core Duo L2400/L2500低功耗處理器, 配以Intel 945GM芯片組,,南橋芯片為ICH7-M(82801GBM),,提供的接口包括SATA,、ATA/IDE、USB2.0,、千兆以太網(wǎng)及串口等,,主要功能框圖見圖1。
該計算機模塊搭載的電子盤為源科公司生產(chǎn)的飛龍V系列閃存硬盤,,它采用NandFlash閃存芯片,,基于標(biāo)準(zhǔn)的ATA/IDE端口,支持ATA-6協(xié)議,。
2 硬盤工作原理分析
硬盤的讀寫是一個復(fù)雜的過程,,它涉及到硬盤的接口方式、尋址方式,、控制寄存器模型等,。硬盤的存儲介質(zhì)也從最初的磁性材料、光磁介質(zhì)發(fā)展到半導(dǎo)體存儲材料,,但不同硬盤的讀寫方法和尋址方式都一樣,,因為不同硬盤都遵循ATA協(xié)議。ATA協(xié)議的最新版本為ATA-8,,ATA-6及之前的版本僅支持IDE接口,,從ATA-7開始,協(xié)議增加了對SATA接口的支持,。在ATA-6協(xié)議中,,硬盤參數(shù)信息共占用512 B,分為256個WORD,,表1簡單說明了部分字節(jié)代表的意義,。
在ATA-6協(xié)議中,CPU與硬盤設(shè)備的通信是通過讀寫設(shè)備接口上的寄存器實現(xiàn)的,。接口寄存器分為兩組,,一組為命令塊寄存器,用于CPU向設(shè)備發(fā)送命令或從設(shè)備讀取狀態(tài),;另一組為控制塊寄存器,,用于CPU控制設(shè)備或獲取備用狀態(tài),如表2所示,。
各接口寄存器功能如下所述:
數(shù)據(jù)寄存器:用于CPU與硬盤設(shè)備之間的數(shù)據(jù)交換,,該種方式即PIO模式,DMA傳輸不使用該寄存器,;
錯誤寄存器:用于記錄硬盤執(zhí)行命令后的出錯信息,;
特征寄存器:用于存儲命令代碼;
扇區(qū)計數(shù)寄存器:用于存儲要讀/寫的扇區(qū)總數(shù);
LBA高/中/低8位寄存器:用于LBA尋址,;
設(shè)備寄存器:用于使能被選設(shè)備并提供配置信息,;
狀態(tài)寄存器:用于記錄硬盤設(shè)備執(zhí)行命令后的狀態(tài);
命令寄存器:用于執(zhí)行命令,;
備用寄存器:其內(nèi)部數(shù)據(jù)與狀態(tài)寄存器相同,;
設(shè)備控制寄存器:用于控制硬盤設(shè)備。
3 驅(qū)動程序設(shè)計
3.1 驅(qū)動與文件系統(tǒng)關(guān)系
VxWorks下的設(shè)備包括字符設(shè)備,、塊設(shè)備和網(wǎng)絡(luò)設(shè)備等,,電子盤等存儲設(shè)備屬于塊設(shè)備,此類型設(shè)備以“塊”為單位進行數(shù)據(jù)操作,,可大大提高數(shù)據(jù)的訪問速度,,但也帶來了巨大的數(shù)據(jù)維護工作量,因此,,塊設(shè)備驅(qū)動程序與I/O系統(tǒng)之間還存在一個中間層,,即文件系統(tǒng)[4]。VxWorks使用的dosFs文件系統(tǒng)是一種與MS_DOS文件系統(tǒng)兼容的文件系統(tǒng),,能夠滿足實時應(yīng)用的多種需求[5],。dosFs文件系統(tǒng)以簇為單位讀寫數(shù)據(jù),每簇包含64個扇區(qū),,每一個扇區(qū)(512 B)為一個存儲塊,,所以一次讀寫4 KB數(shù)據(jù)[6]。應(yīng)用程序訪問電子盤數(shù)據(jù)時,,I/O系統(tǒng)會調(diào)用文件系統(tǒng)計算出相應(yīng)扇區(qū)的地址及數(shù)量,,而后文件系統(tǒng)再調(diào)用電子盤驅(qū)動程序訪問電子盤,完成讀寫操作,。以讀操作為例,,具體過程如圖2所示[7]。
3.2 初始化
電子盤在PIO模式下,,僅使用命令塊寄存器中的數(shù)據(jù)寄存器進行數(shù)據(jù)交換,,傳輸過程十分簡單,但在DMA模式下需要專用的IDE控制器,,傳輸過程比較復(fù)雜,。IDE控制器集成在ICH7-M芯片組中,是標(biāo)準(zhǔn)PCI設(shè)備,,在256 B的配置空間中,,偏移0x20的寄存器配置為IDE主控寄存器組基地址。主控寄存器組包含3個寄存器,,分別為主控命令寄存器,、主控狀態(tài)寄存器,、物理設(shè)備描述符表指針寄存器,各寄存器地址映射如表3所示,。
在初始化過程中,首先搜尋PCI-IDE控制器并獲取寄存器基地址,、中斷信號量等信息,,之后分配必要的資源,如同步信號量,、看門狗,、PRDT表等,然后掛接中斷服務(wù)程序,,建立CPU與控制器的連接,。連接成功后首先獲取電子盤參數(shù)信息,然后根據(jù)參數(shù)設(shè)置讀寫傳輸模式和其他一些支持的屬性,,如電源管理,、SMART指令等。在電子盤設(shè)備初始化過程中,,CPU會向設(shè)備發(fā)送指令來進行操作,。發(fā)送指令時, CPU先填寫各種指令參數(shù)到相關(guān)寄存器中, 然后向命令寄存器發(fā)送命令字啟動指令, 之后設(shè)備開始執(zhí)行指令[9]。
指令執(zhí)行一般要經(jīng)過以下幾種狀態(tài):
(1)發(fā)送指令, 進入等待狀態(tài),;
(2)設(shè)備執(zhí)行完指令后發(fā)出中斷,檢驗設(shè)備狀態(tài),;
(3)如狀態(tài)正確, 則進行后續(xù)操作;否則返回,。
設(shè)置數(shù)據(jù)傳輸模式時,,為保證電子盤能夠更高效工作,優(yōu)先選擇UDMA傳輸模式,;若電子盤不支持UDMA,,則選擇MDMA模式;若不支持MDMA,,則選擇SDMA模式,;若不支持SDMA,則選擇PIO模式,。
3.3 DMA讀寫設(shè)計
每一次DMA傳輸都需要設(shè)置一系列寄存器,,使得開銷很大,然而文件系統(tǒng)對硬盤的I/O請求是不連續(xù)的,,物理內(nèi)存中的數(shù)據(jù)也是不連續(xù)的,。為了提高傳輸效率,需要將不連續(xù)的數(shù)據(jù)組合在一起,,再啟用DMA操作,,這些數(shù)據(jù)就能夠一次傳輸完成,。為此,DMA傳輸使用了物理設(shè)備描述符表(Physical Region Descriptor Table,,PRDT),,表中的描述符指向內(nèi)存緩沖區(qū)的起始地址和長度,這樣一次DMA傳輸,,即可將表中記錄的數(shù)據(jù)都傳輸完成,,PRDT表結(jié)構(gòu)示意圖如圖3所示。
在PRDT表中,,每個描述符占8 B,,前4 B指向緩沖區(qū)地址,后4 B低16 bit表示緩沖區(qū)長度,,地址和長度的第0位必須為0,,當(dāng)緩沖區(qū)長度為0時,數(shù)據(jù)長度為64 KB,,EOT位為緩沖區(qū)結(jié)束標(biāo)志位(為1表示當(dāng)前緩沖區(qū)為最后一個),。當(dāng)執(zhí)行DMA讀時,控制器將電子盤中扇區(qū)數(shù)據(jù)讀到各個內(nèi)存緩沖區(qū)中,;當(dāng)執(zhí)行DMA寫時,,控制器將各個緩沖區(qū)中數(shù)據(jù)寫入對應(yīng)的扇區(qū)中。
通常情況下,,硬盤的DMA讀寫過程一般需要如下幾個步驟:
(1)首先判斷硬盤狀態(tài),,當(dāng)其處于就緒狀態(tài)才可以進行操作;
(2)填寫控制器相關(guān)寄存器指定起始邏輯塊(LBA尋址方式)和扇區(qū)總數(shù),;
(3)啟動控制器,,開始讀寫操作;
(4)讀寫完畢后,,提起中斷通知,。
在VxWorks5.5中,電子盤驅(qū)動讀寫硬盤的接口讀函數(shù)定義為ataBlkRd,,寫函數(shù)定義為ataBlkWrt,,讀寫函數(shù)最終調(diào)用ataBlkRW實現(xiàn)讀寫功能。該函數(shù)定義為STATUS ataBlkRW(ATA_DEV *pDev,,sector_t startBlk,,UINT32 nBlks,char *pBuf,,int direction)[10],。該接口函數(shù)僅使用PIO模式進行讀寫操作,需要使用DMA讀寫模式將其重新實現(xiàn),。具體過程如下:
(1)將主控狀態(tài)寄存器的Interrupt及Error位置1,,清除錯誤,、中斷等狀態(tài)值;
(2)設(shè)置主控命令寄存器的R/W位,,讀電子盤時,,設(shè)為1,寫電子盤時,,設(shè)為0,;
(3)將PRDT表地址寫入描述符表指針寄存器,并根據(jù)緩沖區(qū)地址及長度配置PRDT表,;
(4)將要傳輸?shù)纳葏^(qū)地址、數(shù)量等信息寫入ATA設(shè)備寄存器,,方法如下:在LBA 48b尋址模式下,,首先將要讀取(寫入)的扇區(qū)數(shù)高8位,、低8位寫入Sector Count寄存器,,然后將LBA(31:24)、LBA(7:0)寫入LBA Low寄存器,;將LBA(39:32),、LBA(15:8)寫入LBA Mid寄存器;將LBA(47:40),、LBA(23:16)寫入LBA High寄存器,;接著配置Device寄存器,其bit 4表示設(shè)備號,,主盤置0,,從盤置1,bit 6表示LBA尋址,,需置1,;最后將操作指令寫入Command寄存器,讀操作指令為0x25,,寫操作指令為0x35,;
(5)主控命令寄存器的Start/Stop位置1,開啟DMA傳輸,;
(6)待傳輸結(jié)束后,,硬盤發(fā)出一個中斷請求,PCI-IDE控制器隨之向CPU提起中斷,;
(7)響應(yīng)中斷后,,將主控狀態(tài)寄存器的Interrupt位置1,清除中斷信息,;
(8)最后將主控命令寄存器的Start/Stop位置0,,關(guān)閉DMA傳輸,。
4 試驗結(jié)果與分析
在CM6066單板加固計算機(南橋芯片為ICH7-M,即82801GBM)上測試新設(shè)計的DMA模式驅(qū)動,,測試結(jié)果顯示可成功讀寫電子盤文件,,接著對讀寫速度進行測試,并與原生PIO方式驅(qū)動的讀寫速度進行對比,。測試方法如下:采用系統(tǒng)自帶函數(shù)tickGet()進行計時,,測試寫速度時將一段內(nèi)存數(shù)據(jù)(200 MB)寫入電子盤中;測試讀速度時將電子盤中文件(200 MB)讀入內(nèi)存中,,由此可計算出讀寫速度[11],。分別使用兩種驅(qū)動進行測試,結(jié)果表明,,采用DMA方式的驅(qū)動可顯著提升電子盤讀寫速度,,具體數(shù)值見表4。
5 結(jié)束語
本文開展的基于VxWorks5.5系統(tǒng)的電子盤DMA驅(qū)動軟件的研究具有很大的實用價值,,以Intel ICH7-M芯片為硬件平臺,,完成了新驅(qū)動的設(shè)計與實現(xiàn),并通過應(yīng)用測試證明該設(shè)計行之有效,,能夠顯著提升電子盤性能,。該驅(qū)動程序工作穩(wěn)定、性能可靠,、實時性較好,,目前已應(yīng)用在某電子海圖項目中,可大幅縮短海圖文件的加載時間,,實現(xiàn)了海圖的快速拖拽及縮放功能,。該驅(qū)動亦可應(yīng)用于其他要求高實時性的工業(yè)控制領(lǐng)域。
參考文獻
[1] 潘惠芹.電子盤的設(shè)計及實現(xiàn)[J].計算機工程,,2004,,30(16):194-197.
[2] 陳學(xué)兵,沈毅男,,張振華.VxWorks5.5在龍芯2號處理器的移植和性能分析[J].計算機測量與控制,,2012,20(9):2542-2545.
[3] MCLEAN P T.AT attachment with packet interface-6(ATA/ATAPI-6)[R].USA:American National Standards Institute,,2002:115-126.
[4] WindRiver.VxWorks programmer′s guide 5.5[M].USA:WindRiver,,2002.
[5] 王晉東,黃海,,王坤,,等.基于VxWorks的dosFs文件系統(tǒng)分析與實現(xiàn)[J].微計算機信息,2008,,24(32):85-87.
[6] 張輝,,陳昕,,沈晶晶,等.大容量機載存儲系統(tǒng)設(shè)計與仿真評價[J].電光與控制,,2014,,21(5):104-108.
[7] 張楊,于銀濤.VxWorks內(nèi)核,、設(shè)備驅(qū)動與BSP開發(fā)詳解[M].北京:人民郵電出版社,,2009.
[8] Intel Corporation.Intel ICH7 family datasheet[M].USA:Intel,2006.
[9] 李志鵬,,王立強,,康建斌,等.連續(xù)數(shù)據(jù)記錄系統(tǒng)中IDE數(shù)據(jù)接口的實現(xiàn)[J].無線電工程,,2010,,40(2):48-50.
[10] 曹桂平.VxWorks設(shè)備驅(qū)動開發(fā)詳解[M].北京:電子工業(yè)出版社,2011.
[11] 毛曉梅.基于VxWorks6.6系統(tǒng)的SATA控制器驅(qū)動技術(shù)研究[J].工業(yè)控制計算機,,2013,26(11):129-133.