摘要:我院開設(shè)了基于Virtual Box虛擬機(jī)的硬盤DMA實(shí)驗(yàn),覆蓋了DMA傳輸機(jī)制、PCI設(shè)備配置空間、PCI-IDE控制器編程、ATAPI協(xié)議等多個(gè)知識點(diǎn),構(gòu)成一個(gè)軟硬件結(jié)合的綜合性實(shí)驗(yàn)。應(yīng)用Virtual Box虛擬機(jī)軟件,避免了不同微機(jī)系統(tǒng)中的硬件配置差異,實(shí)驗(yàn)過程不會破壞物理硬盤上的系統(tǒng)數(shù)據(jù),保證了實(shí)驗(yàn)環(huán)境的穩(wěn)定和安全。本文介紹了我院的教學(xué)經(jīng)驗(yàn)。
關(guān)鍵詞:虛擬機(jī);硬盤;DMA;VirtualBox
中圖分類號:G642文獻(xiàn)標(biāo)識碼:B
1引言
DMA(Direct Memory Access,直接內(nèi)存訪問)是外圍設(shè)備和內(nèi)存之間的數(shù)據(jù)傳送方式,在匯編語言、計(jì)算機(jī)原理、接口技術(shù)、操作系統(tǒng)等課程中均涉及到這部分知識。DMA實(shí)驗(yàn)的開設(shè),使學(xué)生從實(shí)際應(yīng)用和底層的角度理解DMA技術(shù)在計(jì)算機(jī)系統(tǒng)的地位,對于多門課程知識的融合、提高學(xué)生的實(shí)踐創(chuàng)新能力具有十分重要的意義。
早期的IBM PC機(jī)中使用集中式的DMA控制器,總線控制和地址產(chǎn)生的邏輯由系統(tǒng)中的2個(gè)DMA控制器(8237芯片)完成,外部設(shè)備需要向8237發(fā)送請求信號,由8237來控制DMA傳輸。軟盤控制器使用DMA通道2,常采用軟盤扇區(qū)讀寫作為DMA實(shí)驗(yàn)。然而,現(xiàn)代微機(jī)已不再配置軟盤驅(qū)動器,已經(jīng)不具備采用軟盤DMA實(shí)驗(yàn)的條件。軟盤控制器所依賴的集中式的DMA控制器也已經(jīng)過時(shí)。因此,有必要重新設(shè)計(jì)DMA實(shí)驗(yàn),使它適合現(xiàn)代微機(jī)技術(shù)的發(fā)展。
計(jì)算機(jī)系統(tǒng)的外部設(shè)備日趨智能化,PCI總線主設(shè)備能自主地產(chǎn)生總線周期和內(nèi)存地址,DMA控制器作為設(shè)備接口控制器的內(nèi)部模塊,而不再采用集中式DMA控制器。為此,需要在研究現(xiàn)代微機(jī)DMA機(jī)制的基礎(chǔ)上,開設(shè)出與之相適應(yīng)的課程實(shí)驗(yàn)。作者所在的課程組結(jié)合科研實(shí)踐中所取得的成果,選擇了硬盤作為DMA實(shí)驗(yàn)的外部設(shè)備,并采用VirtualBox虛擬機(jī)解決了不同微機(jī)存在配置差異和實(shí)驗(yàn)環(huán)境的安全保障兩方面的問題。
2硬盤DMA傳輸
硬盤一般采取IDE(Integrated Drive Electronics)接口,硬盤控制器與硬盤盤體集成在一起?,F(xiàn)代微機(jī)的主板上一般都集成了2個(gè)IDE控制器,每個(gè)控制器上可以連接2個(gè)硬盤(或光驅(qū)),其中的一個(gè)作為主盤,而另一個(gè)作為從盤。在編程控制接口方面,硬盤、CD/DVD設(shè)備采用了ATAPI標(biāo)準(zhǔn)。
硬盤有2種數(shù)據(jù)傳輸模式:PIO模式和DMA傳輸模式。在PIO模式下,由CPU執(zhí)行IN/OUT指令訪問IDE控制器的端口,將數(shù)據(jù)從硬盤讀出或者寫入到硬盤。在DMA模式下,數(shù)據(jù)的傳送在IDE控制器的端口和內(nèi)存之間直接進(jìn)行,不需要通過CPU中轉(zhuǎn)。
主機(jī)對硬盤的讀寫操作是通過IDE控制器上的兩組寄存器來實(shí)現(xiàn),第一組寄存器中占用8個(gè)端口(例如1F0H~1F7H),包括數(shù)據(jù)寄存器、特征寄存器、錯(cuò)誤寄存器、扇區(qū)數(shù)寄存器、扇區(qū)號寄存器、低位柱面寄存器、高位柱面寄存器、設(shè)備/磁頭寄存器、狀態(tài)寄存器、命令寄存器。第二組寄存器中只有一個(gè)有效端口(例如3F6H),為設(shè)備控制寄存器。
每一個(gè)控制器上可以連接兩個(gè)ATA設(shè)備,這兩個(gè)設(shè)備使用同樣的端口地址,在設(shè)備/磁頭寄存器中用DEV位來區(qū)分這兩個(gè)設(shè)備。DEV=0時(shí),表示主盤;DEV=1時(shí),表示從盤。
硬盤的每個(gè)扇區(qū)的大小為512字節(jié)。主機(jī)在讀寫硬盤時(shí),需要指定它要讀寫的是哪一個(gè)扇區(qū),即扇區(qū)地址。
PCI-IDE控制器中含有一個(gè)DMA控制器,它能夠在硬盤和內(nèi)存之間直接傳送數(shù)據(jù)。在數(shù)據(jù)傳送期間,這個(gè)DMA控制器接管PCI總線,產(chǎn)生對硬盤的I/O操作和對內(nèi)存的讀寫操作,根據(jù)設(shè)定的傳送字節(jié)數(shù),在全部數(shù)據(jù)傳送完成后,結(jié)束DMA傳輸。
PCI-IDE控制器作為一個(gè)PCI設(shè)備,在256字節(jié)的配置空間中,偏移020h處的基地址寄存器4(BAR4)作為DMA主控寄存器的首地址。每個(gè)通道有3個(gè)寄存器,主控命令寄存器、主控狀態(tài)寄存器和描述符指針表寄存器。PCI-IDE控制器支持2個(gè)IDE通道(主通道和次通道),每個(gè)通道占用8個(gè)字節(jié)的端口地址。設(shè)BAR4中的首地址為0C000H,這些寄存器的端口地址如表1所示。
主控命令寄存器控制DMA的傳輸方向(從IDE設(shè)備到內(nèi)存,或者從內(nèi)存到IDE設(shè)備)、啟動或停止DMA傳輸。
主控狀態(tài)寄存器中保存了DMA是否正在傳輸、是否出現(xiàn)錯(cuò)誤、IDE設(shè)備是否產(chǎn)生了一個(gè)中斷請求,主盤或從盤是否能夠執(zhí)行DMA操作等狀態(tài)信息。
描述符表指針寄存器是一個(gè)指向描述符表的指針。描述符表中包含一個(gè)或多個(gè)物理區(qū)域描述符。每個(gè)描述符占8個(gè)字節(jié),包括32位的內(nèi)存緩沖區(qū)物理地址及16位緩沖區(qū)長度,以及緩沖區(qū)是否是最后一個(gè)等信息。例如,讀寫一個(gè)扇區(qū)時(shí),內(nèi)存緩沖區(qū)地址為00060000H,長度為200H(512)字節(jié)。需要構(gòu)造的描述符表如圖1所示,描述符表的地址為00070000H,表中只有1個(gè)描述符,說明物理區(qū)域的起始地址和長度。
通過DMA讀、寫硬盤扇區(qū)的步驟為:
(1) 在內(nèi)存中構(gòu)造一個(gè)描述符表,指向緩沖區(qū)。
(2) 把描述符表的地址寫入描述符表指針寄存器。
(3) 設(shè)置主控命令寄存器的讀寫位。讀硬盤扇區(qū)時(shí),設(shè)為1;寫硬盤扇區(qū)時(shí),設(shè)為0。
(4) 將1寫入主控狀態(tài)寄存器的中斷(Interrupt)和錯(cuò)誤(Error)位,將這2個(gè)位復(fù)位為0。
(5) 要傳輸?shù)纳葏^(qū)數(shù)、扇區(qū)地址等寫入ATA設(shè)備寄存器。將命令碼(如0C8H、0CAH)寫入ATA命令寄存器。0C8H命令硬盤以DMA方式讀取扇區(qū);0CAH命令硬盤以DMA方式寫入扇區(qū)。
(6) 將1寫入主控命令寄存器的啟動/停止位。之后,PCI-IDE控制器就會在內(nèi)存緩沖區(qū)和硬盤之間進(jìn)行DMA數(shù)據(jù)傳輸。
(7) 傳輸完畢后,硬盤發(fā)出一個(gè)中斷請求。PCI-IDE控制器隨之向CPU發(fā)出中斷請求。
(8) 響應(yīng)中斷請求后,將0寫入主控命令寄存器的啟動/停止位,將1寫入主控狀態(tài)寄存器的中斷位,清除PCI-IDE控制器的中斷請求。
(9) 讀取PCI-IDE控制器的主控狀態(tài)寄存器和ATA狀態(tài)寄存器,確認(rèn)命令是否成功。
3VirtualBox虛擬機(jī)在硬盤實(shí)驗(yàn)中的應(yīng)用
在上述硬盤DMA實(shí)驗(yàn)中,如果直接對硬盤的物理扇區(qū)進(jìn)行讀寫操作,容易破壞硬盤分區(qū)表或操作系統(tǒng)文件,破壞實(shí)驗(yàn)環(huán)境;另外,實(shí)驗(yàn)室所配備的微機(jī)型號各異,所集成的PCI-IDE控制器的端口地址不同,導(dǎo)致實(shí)驗(yàn)環(huán)境不能統(tǒng)一,而且部分微機(jī)還與實(shí)驗(yàn)程序存在兼容問題。因此,不宜直接在計(jì)算機(jī)物理硬盤上完成DMA實(shí)驗(yàn)。
在國內(nèi)外高校的教學(xué)實(shí)踐中,已經(jīng)成功地將虛擬機(jī)技術(shù)應(yīng)用在操作系統(tǒng)、計(jì)算機(jī)網(wǎng)絡(luò)等課程中,構(gòu)建出可迅速恢復(fù)、環(huán)境統(tǒng)一、單機(jī)硬件上的多操作系統(tǒng)獨(dú)立運(yùn)行等實(shí)驗(yàn)環(huán)境。虛擬機(jī)軟件可在一臺計(jì)算機(jī)(稱為宿主機(jī))上模擬出若干臺計(jì)算機(jī),模擬出的計(jì)算機(jī)(稱為客戶機(jī))都有自己單獨(dú)的硬件配置,可以安裝單獨(dú)的操作系統(tǒng)。例如,宿主計(jì)算機(jī)運(yùn)行Windows操作系統(tǒng),在上面運(yùn)行虛擬機(jī)軟件,虛擬出的計(jì)算機(jī)可以運(yùn)行Linux操作系統(tǒng)。這2個(gè)操作系統(tǒng)各自獨(dú)立運(yùn)行,互不干擾。
目前,比較流行的虛擬機(jī)軟件為VMWare。VMWare虛擬機(jī)的硬盤采用了PCI-SCSI控制器,其編程控制接口與PCI-IDE控制器完全不同,不能用于上述DMA實(shí)驗(yàn)。VirtualBox是德國InnoTek公司開發(fā)的虛擬機(jī)軟件,可以運(yùn)行在Windows和Linux上,客戶機(jī)上可以安裝Windows、DOS、Linux、OpenBSD等操作系統(tǒng)。VirtualBox虛擬了PCI-IDE控制器,符合硬盤DMA實(shí)驗(yàn)要求。更為重要的是,VirtualBox的源代碼完全公開,便于了解其技術(shù)細(xì)節(jié)以及功能擴(kuò)展。VirtualBox軟件及其源程序可以從www.virtualbox.org網(wǎng)站下載。
編寫了PCI設(shè)備枚舉程序,在虛擬機(jī)中運(yùn)行。搜索基類型等于01h(表示大容量存儲控制器)并且子類型也等于01h(表示IDE控制器)的設(shè)備,再獲取基地址寄存器5的值。在VirtualBox中,BAR5的內(nèi)容為“01 C0 00 00”,即0000C001H。最后1位等于1,表示這個(gè)基地址屬于I/O空間。DMA主控寄存器的首地址為0000C000H。因此,PCI-IDE控制器的主控命令寄存器的端口地址為0C000H,主控狀態(tài)寄存器為0C002H,描述符指針表寄存器的地址0C004H。
如圖2所示,VirtualBox的虛擬硬盤作為主通道上的主盤,即“主IDE控制器”。因此,其ATA設(shè)備寄存器地址為(1F0~1F7H,3F6H)。硬盤大小設(shè)置為80MB,由于VirtualBox采用了動態(tài)分配技術(shù),HDD0.vdi并沒有占據(jù)80MB存儲空間,在客戶機(jī)向硬盤不斷寫入數(shù)據(jù)時(shí),該文件才會逐漸增大。
4結(jié)束語
本文針對目前的微機(jī)DMA實(shí)驗(yàn)所存在的問題,探討了通過匯編編程手段控制PCI-IDE控制器完成硬盤DMA
實(shí)驗(yàn)。利用虛擬機(jī)軟件,實(shí)驗(yàn)的對象為一個(gè)虛擬硬盤,避免了硬盤讀寫實(shí)驗(yàn)對物理硬盤數(shù)據(jù)的破壞;不同微機(jī)中運(yùn)行虛擬機(jī)軟件,虛擬出的PCI-IDE控制器、硬盤具有相同的I/O地址和編程模式,保證了實(shí)驗(yàn)環(huán)境的統(tǒng)一性。課程組所設(shè)計(jì)的微機(jī)硬盤DMA實(shí)驗(yàn),作為多層次、遞進(jìn)式的實(shí)驗(yàn)教學(xué)體系的重要一環(huán),幫助學(xué)生從寄存器I/O編程等底層出發(fā)了解DMA傳輸?shù)腜CI-IDE控制器、硬盤、ATAPI協(xié)議等各種要素,培養(yǎng)學(xué)生利用匯編語言解決復(fù)雜問題的能力,加深學(xué)生對PCI總線、DMA、硬盤等典型功能部件的認(rèn)識。開設(shè)了以硬盤DMA實(shí)驗(yàn)為代表的一系列實(shí)驗(yàn),通過課程內(nèi)容和實(shí)驗(yàn)教學(xué)兩個(gè)環(huán)節(jié)的緊密結(jié)合,著重培養(yǎng)學(xué)生的實(shí)踐能力,形成系統(tǒng)的知識觀念,提高綜合應(yīng)用和創(chuàng)新能力。
參考文獻(xiàn):
[1] 譚毓安,張雪蘭,李元章. Windows匯編語言程序設(shè)計(jì)實(shí)驗(yàn)指導(dǎo)[M]. 北京:清華大學(xué)出版社,2008.
[2] 譚毓安,王娟,張全新,張凱. Pentium微機(jī)原理與接口技術(shù)[M]. 北京:機(jī)械工業(yè)出版社,2008.
[3] 胡志剛,徐益海. 基于虛擬機(jī)的操作系統(tǒng)教學(xué)工具的架構(gòu)設(shè)計(jì)[J]. 企業(yè)技術(shù)開發(fā),2007,(7).