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