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