談虛擬環境中裝置訪問的實現方法 上

2021-06-15 22:53:42 字數 4293 閱讀 2240

康華 :主要從事 linux 作業系統核心、虛擬機器、linux 技術標準、計算機安全、軟體測試等領域的研究與開發工作,曾就職 mii-hp 軟體實驗室 、瞬聯軟體公司/motorola,現就職於lenovo研究院 。其所合寫的linux專欄見

。 如果需要可以聯絡通過 [email protected] (msn)聯絡我.

摘要:本文首先將對虛擬機器中各種裝置訪問方式進行介紹與分析,然後在此基礎上重點介紹了虛擬機器中模擬光碟機的實現,最後進一步分析虛擬機器中如何使得虛擬光碟機裝置具備燒錄能力。

guest

系統之所以能執行在虛擬機器之上是因為虛擬機器為其提供了看來和真實硬體無異的模擬硬體環境。這些硬體環境包含有

cpu,匯流排,時鐘,以及各種可能的外設,如顯示卡,硬碟,光碟機,網絡卡等等。那麼

guest

系統具體又是如何訪問這些裝置呢?或者說這些裝置具體如何模擬和實現

i/o虛擬化呢

? 下面我們就先來歸納一下虛擬機器中的裝置實現和訪問方式。

1

純模擬裝置,如

pit,

pci匯流排,中斷控制器等。這類裝置完全由軟體模擬,並不和真實的硬體打交道。之所以要將其和真實硬體脫離關係,是因為畢竟虛擬機器作為軟體需要執行於宿主作業系統之上,而宿主作業系統(

host os

)又必須獨占性的使用某些硬體裝置,比如系統時鐘,匯流排,中斷控制器等(這些裝置不同音效卡等外設,可以共享使用)。可以想象,如果虛擬機器之上

guest

系統也對上述裝置訪問(比如寫中斷控制器),那麼兩個系統的狀態就會發生「撞車」,宿主系統就會發生崩潰,

guest

系統自然也不可倖免。所以無法將上述裝置給

guest os

訪問,因此必須完全模擬這些裝置。

至於具體有那些裝置需要純模擬實現呢?這要看具體環境。原則上宿主系**佔使用的都應屬於這類裝置。(引申一下,宿主系統這裡理解成直接操作硬體的最下端作業系統。除了傳統的作業系統外,虛擬機器監控程式(

vmm)從某種意義上說也可看是一種宿主系統,不過一般不這麼叫)。

2

寄生性裝置(找不到合適的名在,暫且這麼叫吧),如硬碟,音效卡,顯示卡,光碟機等。這類裝置需要在虛擬機器中先模擬出來(模擬裝置目的是為了讓

guest

系統看到裝置的資源資訊,以便載入驅動和訪問資源),然後虛擬機會將

guest

系統對這些裝置的訪問命令和資料截獲,然後**給真實硬體(主要通過虛擬機器截獲io、

mmio

等的訪問請求獲得命令和資料)。

這是較為籠統的說法,如果細分又可分成兩種情況:

1 在模擬裝置中直接**

i/o請求到物理裝置,這裡需要做的是將發給

vdi(virtual device inte***ce)

的引數轉化成發給

hdi(hardware device inte***ce)

引數且下發給

hdi(同樣道理請求的資料也是從真實硬體獲得)。例如,將對虛擬裝置的

in/out

操作直接**到物理裝置對應的埠上。可以想象如果我們模擬的是

ide裝置,而真實裝置是

scsi

裝置,那麼轉換則必須了解

ide和

scsi

裝置的具體埠和記憶體對映資訊,才又可能建立起正確的轉換關係。顯然這點不但費力,且移植性不好。

2 借助作業系統提供的較高階的使用者介面完成虛擬到真實裝置的

i/o**。比如借助

linux

作業系統的使用者驅動介面(如

read/ioctl

介面等),實現最終對硬體操作。利用作業系統提供的介面訪問不需要具體熟悉硬體細節(埠,記憶體對映資訊不必知道),因此具有更強的移植性和方便性。比如

vmware

系統實現

cdrom

模擬裝置訪問:當

vmmonitor

截獲了guest

系統給模擬光碟機下發的

i/o指令後,

如果發現

host

系統支援光碟機裝置,那麼

會通過host

系統提供的使用者介面(比如

windows

上的read

介面)對光碟機進行讀操作,而不需要

vmmonitor

自己去具體操作任何

cdrom

的埠。

寄生性裝置一般都不是宿主系統執行必須仰仗的裝置,

guest

系統對其的訪問不會破壞宿主系統的正常執行。比如音效卡,宿主裝置不用的時候,可以讓

guest

系統使用(你用一時,我用一時);硬碟你用一塊,我用一塊互相不影響。這類裝置是可共享使用的。

3

前後端裝置,

如網絡卡,塊裝置(如硬碟),

tpm。這種裝置訪問方式出現在

xen等虛擬環境中。在

xen環境中,在

vmm之上還存在乙個叫做

domain 0

的虛擬機器用於管理硬體裝置(該虛擬機器執行修改過的

linux

作業系統,是特權系統

,可以直接操作硬體裝置),其它

domain

(稱為domainu

,非特權)若要訪問硬體,則需要經過

domain0

中qemu

模擬裝置(如光碟機,時鐘等,當然模擬**也可以放在

xen中)或者就要通過一種被稱為前後端機制的裝置訪問方式。這種機制的服務物件是那些需要在

domain0

和domainu

中併發共享,而且要求高效能的裝置。

前後端機制是指將裝置驅動分成後端(

backend

)和前端(

frontend

),後端處於

domain0

;而前端則處於

domainu

,作為後端的**,並不需要接觸具體硬體細節。前後端通訊通過共享記憶體等方法,前端裝置驅動收到

i/o請求後會將請求**給後端裝置,而後端裝置會負責對以硬體最終操作的(準確的將它也不直接操作,最後直接操作的應該時

linux

自帶的網絡卡驅動)。在我系統中其呼叫過程如下:

dom1 front-end driver -> dom0 back-end driver -> dom0 e1000 driver

。注意:前後端程式都是驅動,執行在核心態直接截獲,修改協議棧以達到高速(相比

qemu

的傳統寄生性網絡卡訪問方式速度要高不少)。

4

訪問真實裝置(在

xen中被稱作

pass through

方式)。這種技術出現在

vt處理器面世之後(主要用於

intel

推出的eit

方案),其特點是虛擬機器不再需要提供裝置模擬,而是讓

guest

系統直接看到真實裝置,並操作真實裝置。這樣做的優點有:

1 由於不需要模擬裝置進行請求轉換,所以訪問速度高;

2 guest

系統能根據最新硬體,載入對應驅動,可充分發揮硬體功能;而使用模擬裝置時,只能載入模擬的驅動,如果模擬裝置功能落後,顯然無法充分利用真實硬體的全部潛能。當然缺點也很顯然:真實裝置只能供乙個

guest

系統使用

,而且要注意

vmm使用的裝置無法

pass through

給guest

系統。從原理上來講

pass through

方式是將

pci裝置的資源(中斷,io,

mmio

)直接暴露給

guest os

並允許其直接訪問。具體做法是,對於

io資源,

vt技術可以允許

guest

系統直接訪問而不會被

vmm捕獲;對於

mmio

,則需要處理相對頁表,使得

guest

能直接訪問到物理裝置真實的

mmio

空間;中斷則需要將真實中斷注射到虛擬中斷控制器中,以便

guest

能收到真實中斷。(除此以外還有很多細節,諸如

dma操作

/iommu

,bios

操作等,這裡步多說了,進一步細節請看

vt手冊和

xen**)。 --

待續  

談虛擬環境中裝置訪問的實現方法 中

康華 主要從事 linux 作業系統核心 虛擬機器 linux 技術標準 計算機安全 軟體測試等領域的研究與開發工作,曾就職 mii hp 軟體實驗室 瞬聯軟體公司 motorola,現就職於lenovo研究院 其所合寫的linux專欄見http www.csdn.net subject linux...

安裝新虛擬環境的方法 訪問國內映象方法

原版本為2.7的環境,以下是增加3.6.1python的過程 在cmd中寫入命令 更新 conda update conda 建立python3.6的環境 conda create name python3 python 3.6 activate python3 在環境中安裝anaconda的庫 c...

flask pycharm安裝虛擬環境中的庫檔案

執行環境 ubuntu14.04 pycharm 5.0.4 python2.7.6 總結 1,在原系統匯出requirements.txt檔案,git push。2,在新系統git clone 檔案 3,安裝前要在pycharm中匯入虛擬環境的python直譯器,詳見具體步驟第3步 4,開啟虛擬環...