文獻(xiàn)標(biāo)識碼: A
DOI:10.16157/j.issn.0258-7998.2016.11.009
中文引用格式: 尹加豹. VxWorks5.5下電子盤DMA驅(qū)動程序設(shè)計與實(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í)時操作系統(tǒng),其中VxWorks5.5版本具有較高的可靠性和卓越的實(shí)時性,在很多領(lǐng)域都有廣泛的應(yīng)用[2]。但是VxWorks5.5系統(tǒng)原生電子盤驅(qū)動僅支持過程輸入輸出(Process Input Output,PIO)方式,存取速度較慢,無法滿足某些應(yīng)用的實(shí)時性要求,需要設(shè)計基于直接存儲器存?。―irect Memory Access,DMA)方式的驅(qū)動,以提升電子盤讀寫速度,擴(kuò)展其應(yīng)用領(lǐng)域。
1 硬件環(huán)境
硬件平臺為中船重工第七一六研究所生產(chǎn)的CM6066單板加固計算機(jī)。該計算機(jī)主板采用Intel Core Duo L2400/L2500低功耗處理器, 配以Intel 945GM芯片組,南橋芯片為ICH7-M(82801GBM),提供的接口包括SATA、ATA/IDE、USB2.0、千兆以太網(wǎng)及串口等,主要功能框圖見圖1。
該計算機(jī)模塊搭載的電子盤為源科公司生產(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è)備接口上的寄存器實(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è)備以“塊”為單位進(jìn)行數(shù)據(jù)操作,可大大提高數(shù)據(jù)的訪問速度,但也帶來了巨大的數(shù)據(jù)維護(hù)工作量,因此,塊設(shè)備驅(qū)動程序與I/O系統(tǒng)之間還存在一個中間層,即文件系統(tǒng)[4]。VxWorks使用的dosFs文件系統(tǒng)是一種與MS_DOS文件系統(tǒng)兼容的文件系統(tǒng),能夠滿足實(shí)時應(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ù)寄存器進(jìn)行數(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ā)送指令來進(jìn)行操作。發(fā)送指令時, CPU先填寫各種指令參數(shù)到相關(guān)寄存器中, 然后向命令寄存器發(fā)送命令字啟動指令, 之后設(shè)備開始執(zhí)行指令[9]。
指令執(zhí)行一般要經(jīng)過以下幾種狀態(tài):
(1)發(fā)送指令, 進(jìn)入等待狀態(tài);
(2)設(shè)備執(zhí)行完指令后發(fā)出中斷,檢驗設(shè)備狀態(tài);
(3)如狀態(tài)正確, 則進(jìn)行后續(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)才可以進(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,清除錯誤、中斷等狀態(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單板加固計算機(jī)(南橋芯片為ICH7-M,即82801GBM)上測試新設(shè)計的DMA模式驅(qū)動,測試結(jié)果顯示可成功讀寫電子盤文件,接著對讀寫速度進(jìn)行測試,并與原生PIO方式驅(qū)動的讀寫速度進(jìn)行對比。測試方法如下:采用系統(tǒng)自帶函數(shù)tickGet()進(jìn)行計時,測試寫速度時將一段內(nèi)存數(shù)據(jù)(200 MB)寫入電子盤中;測試讀速度時將電子盤中文件(200 MB)讀入內(nèi)存中,由此可計算出讀寫速度[11]。分別使用兩種驅(qū)動進(jìn)行測試,結(jié)果表明,采用DMA方式的驅(qū)動可顯著提升電子盤讀寫速度,具體數(shù)值見表4。
5 結(jié)束語
本文開展的基于VxWorks5.5系統(tǒng)的電子盤DMA驅(qū)動軟件的研究具有很大的實(shí)用價值,以Intel ICH7-M芯片為硬件平臺,完成了新驅(qū)動的設(shè)計與實(shí)現(xiàn),并通過應(yīng)用測試證明該設(shè)計行之有效,能夠顯著提升電子盤性能。該驅(qū)動程序工作穩(wěn)定、性能可靠、實(shí)時性較好,目前已應(yīng)用在某電子海圖項目中,可大幅縮短海圖文件的加載時間,實(shí)現(xiàn)了海圖的快速拖拽及縮放功能。該驅(qū)動亦可應(yīng)用于其他要求高實(shí)時性的工業(yè)控制領(lǐng)域。
參考文獻(xiàn)
[1] 潘惠芹.電子盤的設(shè)計及實(shí)現(xiàn)[J].計算機(jī)工程,2004,30(16):194-197.
[2] 陳學(xué)兵,沈毅男,張振華.VxWorks5.5在龍芯2號處理器的移植和性能分析[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ī)信息,2008,24(32):85-87.
[6] 張輝,陳昕,沈晶晶,等.大容量機(jī)載存儲系統(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] 李志鵬,王立強(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ī),2013,26(11):129-133.