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