摘要:我院開設了基于Virtual Box虛擬機的硬盤DMA實驗,覆蓋了DMA傳輸機制、PCI設備配置空間、PCI-IDE控制器編程、ATAPI協議等多個知識點,構成一個軟硬件結合的綜合性實驗。應用Virtual Box虛擬機軟件,避免了不同微機系統中的硬件配置差異,實驗過程不會破壞物理硬盤上的系統數據,保證了實驗環境的穩定和安全。本文介紹了我院的教學經驗。
關鍵詞:虛擬機;硬盤;DMA;VirtualBox
中圖分類號:G642文獻標識碼:B
1引言
DMA(Direct Memory Access,直接內存訪問)是外圍設備和內存之間的數據傳送方式,在匯編語言、計算機原理、接口技術、操作系統等課程中均涉及到這部分知識。DMA實驗的開設,使學生從實際應用和底層的角度理解DMA技術在計算機系統的地位,對于多門課程知識的融合、提高學生的實踐創新能力具有十分重要的意義。
早期的IBM PC機中使用集中式的DMA控制器,總線控制和地址產生的邏輯由系統中的2個DMA控制器(8237芯片)完成,外部設備需要向8237發送請求信號,由8237來控制DMA傳輸。軟盤控制器使用DMA通道2,常采用軟盤扇區讀寫作為DMA實驗。然而,現代微機已不再配置軟盤驅動器,已經不具備采用軟盤DMA實驗的條件。軟盤控制器所依賴的集中式的DMA控制器也已經過時。因此,有必要重新設計DMA實驗,使它適合現代微機技術的發展。
計算機系統的外部設備日趨智能化,PCI總線主設備能自主地產生總線周期和內存地址,DMA控制器作為設備接口控制器的內部模塊,而不再采用集中式DMA控制器。為此,需要在研究現代微機DMA機制的基礎上,開設出與之相適應的課程實驗。作者所在的課程組結合科研實踐中所取得的成果,選擇了硬盤作為DMA實驗的外部設備,并采用VirtualBox虛擬機解決了不同微機存在配置差異和實驗環境的安全保障兩方面的問題。
2硬盤DMA傳輸
硬盤一般采取IDE(Integrated Drive Electronics)接口,硬盤控制器與硬盤盤體集成在一起。現代微機的主板上一般都集成了2個IDE控制器,每個控制器上可以連接2個硬盤(或光驅),其中的一個作為主盤,而另一個作為從盤。在編程控制接口方面,硬盤、CD/DVD設備采用了ATAPI標準。
硬盤有2種數據傳輸模式:PIO模式和DMA傳輸模式。在PIO模式下,由CPU執行IN/OUT指令訪問IDE控制器的端口,將數據從硬盤讀出或者寫入到硬盤。在DMA模式下,數據的傳送在IDE控制器的端口和內存之間直接進行,不需要通過CPU中轉。
主機對硬盤的讀寫操作是通過IDE控制器上的兩組寄存器來實現,第一組寄存器中占用8個端口(例如1F0H~1F7H),包括數據寄存器、特征寄存器、錯誤寄存器、扇區數寄存器、扇區號寄存器、低位柱面寄存器、高位柱面寄存器、設備/磁頭寄存器、狀態寄存器、命令寄存器。第二組寄存器中只有一個有效端口(例如3F6H),為設備控制寄存器。
每一個控制器上可以連接兩個ATA設備,這兩個設備使用同樣的端口地址,在設備/磁頭寄存器中用DEV位來區分這兩個設備。DEV=0時,表示主盤;DEV=1時,表示從盤。
硬盤的每個扇區的大小為512字節。主機在讀寫硬盤時,需要指定它要讀寫的是哪一個扇區,即扇區地址。
PCI-IDE控制器中含有一個DMA控制器,它能夠在硬盤和內存之間直接傳送數據。在數據傳送期間,這個DMA控制器接管PCI總線,產生對硬盤的I/O操作和對內存的讀寫操作,根據設定的傳送字節數,在全部數據傳送完成后,結束DMA傳輸。
PCI-IDE控制器作為一個PCI設備,在256字節的配置空間中,偏移020h處的基地址寄存器4(BAR4)作為DMA主控寄存器的首地址。每個通道有3個寄存器,主控命令寄存器、主控狀態寄存器和描述符指針表寄存器。PCI-IDE控制器支持2個IDE通道(主通道和次通道),每個通道占用8個字節的端口地址。設BAR4中的首地址為0C000H,這些寄存器的端口地址如表1所示。

主控命令寄存器控制DMA的傳輸方向(從IDE設備到內存,或者從內存到IDE設備)、啟動或停止DMA傳輸。
主控狀態寄存器中保存了DMA是否正在傳輸、是否出現錯誤、IDE設備是否產生了一個中斷請求,主盤或從盤是否能夠執行DMA操作等狀態信息。
描述符表指針寄存器是一個指向描述符表的指針。描述符表中包含一個或多個物理區域描述符。每個描述符占8個字節,包括32位的內存緩沖區物理地址及16位緩沖區長度,以及緩沖區是否是最后一個等信息。例如,讀寫一個扇區時,內存緩沖區地址為00060000H,長度為200H(512)字節。需要構造的描述符表如圖1所示,描述符表的地址為00070000H,表中只有1個描述符,說明物理區域的起始地址和長度。

通過DMA讀、寫硬盤扇區的步驟為:
(1) 在內存中構造一個描述符表,指向緩沖區。
(2) 把描述符表的地址寫入描述符表指針寄存器。
(3) 設置主控命令寄存器的讀寫位。讀硬盤扇區時,設為1;寫硬盤扇區時,設為0。
(4) 將1寫入主控狀態寄存器的中斷(Interrupt)和錯誤(Error)位,將這2個位復位為0。
(5) 要傳輸的扇區數、扇區地址等寫入ATA設備寄存器。將命令碼(如0C8H、0CAH)寫入ATA命令寄存器。0C8H命令硬盤以DMA方式讀取扇區;0CAH命令硬盤以DMA方式寫入扇區。
(6) 將1寫入主控命令寄存器的啟動/停止位。之后,PCI-IDE控制器就會在內存緩沖區和硬盤之間進行DMA數據傳輸。
(7) 傳輸完畢后,硬盤發出一個中斷請求。PCI-IDE控制器隨之向CPU發出中斷請求。
(8) 響應中斷請求后,將0寫入主控命令寄存器的啟動/停止位,將1寫入主控狀態寄存器的中斷位,清除PCI-IDE控制器的中斷請求。
(9) 讀取PCI-IDE控制器的主控狀態寄存器和ATA狀態寄存器,確認命令是否成功。
3VirtualBox虛擬機在硬盤實驗中的應用
在上述硬盤DMA實驗中,如果直接對硬盤的物理扇區進行讀寫操作,容易破壞硬盤分區表或操作系統文件,破壞實驗環境;另外,實驗室所配備的微機型號各異,所集成的PCI-IDE控制器的端口地址不同,導致實驗環境不能統一,而且部分微機還與實驗程序存在兼容問題。因此,不宜直接在計算機物理硬盤上完成DMA實驗。
在國內外高校的教學實踐中,已經成功地將虛擬機技術應用在操作系統、計算機網絡等課程中,構建出可迅速恢復、環境統一、單機硬件上的多操作系統獨立運行等實驗環境。虛擬機軟件可在一臺計算機(稱為宿主機)上模擬出若干臺計算機,模擬出的計算機(稱為客戶機)都有自己單獨的硬件配置,可以安裝單獨的操作系統。例如,宿主計算機運行Windows操作系統,在上面運行虛擬機軟件,虛擬出的計算機可以運行Linux操作系統。這2個操作系統各自獨立運行,互不干擾。
目前,比較流行的虛擬機軟件為VMWare。VMWare虛擬機的硬盤采用了PCI-SCSI控制器,其編程控制接口與PCI-IDE控制器完全不同,不能用于上述DMA實驗。VirtualBox是德國InnoTek公司開發的虛擬機軟件,可以運行在Windows和Linux上,客戶機上可以安裝Windows、DOS、Linux、OpenBSD等操作系統。VirtualBox虛擬了PCI-IDE控制器,符合硬盤DMA實驗要求。更為重要的是,VirtualBox的源代碼完全公開,便于了解其技術細節以及功能擴展。VirtualBox軟件及其源程序可以從www.virtualbox.org網站下載。
編寫了PCI設備枚舉程序,在虛擬機中運行。搜索基類型等于01h(表示大容量存儲控制器)并且子類型也等于01h(表示IDE控制器)的設備,再獲取基地址寄存器5的值。在VirtualBox中,BAR5的內容為“01 C0 00 00”,即0000C001H。最后1位等于1,表示這個基地址屬于I/O空間。DMA主控寄存器的首地址為0000C000H。因此,PCI-IDE控制器的主控命令寄存器的端口地址為0C000H,主控狀態寄存器為0C002H,描述符指針表寄存器的地址0C004H。
如圖2所示,VirtualBox的虛擬硬盤作為主通道上的主盤,即“主IDE控制器”。因此,其ATA設備寄存器地址為(1F0~1F7H,3F6H)。硬盤大小設置為80MB,由于VirtualBox采用了動態分配技術,HDD0.vdi并沒有占據80MB存儲空間,在客戶機向硬盤不斷寫入數據時,該文件才會逐漸增大。
4結束語
本文針對目前的微機DMA實驗所存在的問題,探討了通過匯編編程手段控制PCI-IDE控制器完成硬盤DMA

實驗。利用虛擬機軟件,實驗的對象為一個虛擬硬盤,避免了硬盤讀寫實驗對物理硬盤數據的破壞;不同微機中運行虛擬機軟件,虛擬出的PCI-IDE控制器、硬盤具有相同的I/O地址和編程模式,保證了實驗環境的統一性。課程組所設計的微機硬盤DMA實驗,作為多層次、遞進式的實驗教學體系的重要一環,幫助學生從寄存器I/O編程等底層出發了解DMA傳輸的PCI-IDE控制器、硬盤、ATAPI協議等各種要素,培養學生利用匯編語言解決復雜問題的能力,加深學生對PCI總線、DMA、硬盤等典型功能部件的認識。開設了以硬盤DMA實驗為代表的一系列實驗,通過課程內容和實驗教學兩個環節的緊密結合,著重培養學生的實踐能力,形成系統的知識觀念,提高綜合應用和創新能力。
參考文獻:
[1] 譚毓安,張雪蘭,李元章. Windows匯編語言程序設計實驗指導[M]. 北京:清華大學出版社,2008.
[2] 譚毓安,王娟,張全新,張凱. Pentium微機原理與接口技術[M]. 北京:機械工業出版社,2008.
[3] 胡志剛,徐益海. 基于虛擬機的操作系統教學工具的架構設計[J]. 企業技術開發,2007,(7).