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

2021-04-13 09:17:50 字數 3110 閱讀 2420

康華

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

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

摘要

:上期我們對虛擬機器中各種裝置訪問方式進行介紹與分析歸納。在繼續具體介紹虛擬機器種光碟機燒錄實現之前,先占用一些篇幅介紹一下裝置虛擬化中的乙個關鍵問題:i/o截獲。

vmm截獲

i/o操作是指:

guest

系統傳送的

i/o訪問請求被

vmm攔截,而不是像

native

環境下那樣被直接寫入到物理裝置中。原因是顯而易見的,因為不能讓

guest

系統直接修改硬體狀態,否則有可能會造成系統故障(輕則影響其他

guest

執行,重則會讓整個系統宕機)。所以

vmm會將截獲的

i/o指令進行分析後模擬執行,也就是將「偽造」的資料返回給

guest

系統。目前所有虛擬機器軟體的

i/o虛擬化原理都如上所說,過程大同小異。不過具體的截獲方式又有所差別。這裡就幾種典型的

i/o截獲方式進行介紹和分析。

1

.isa

層的虛擬化技術中的

i/o截獲方法

isa層的虛擬化技術是指採用軟體模擬指令集的方式進行指令虛擬。具體的實現方式是截獲客戶作業系統發出的指令,並把它們「翻譯

」成host

平台上的可用指令進行執行,其中所說的指令既包括處理器內部指令,也包含

io指令。因此

i/o的截獲和其他處理器指令截獲方式一樣,都是在虛擬機器模擬

cpu取指令過程中被發現並被進而模擬處理的。這種虛擬機器的代表是

bochs

和qemu

,都是執行在使用者空間的程序虛擬機器。

2 .

硬體抽象層的虛擬化技術的

i/o截獲方法

硬體抽象層的虛擬化技術是指在

guest

和host

系統isa

相同的情況下,盡可能避免翻譯和模擬

guest

指令,而是讓其直接執行;僅僅在

guest

系統執行特權指令(修改系統資源或執行結果受資源狀態決定)時,虛擬機器才會截獲並接管處理,以免系統發生異常或衝突。

虛擬機器為了能截獲特權指令,要求執行於高特權級別,屬於核心程式。這樣每由使用者態執行的

guest

系統產生

trap

時,就能被

vmm捕獲到。而

i/o指令(

x86中

in/out

等)屬於典型的特權指令,在使用者空間使用將產生

trap

。如果出現特權指令在特權級不夠的情況下執行,並不能方便地產生

trap

的情況。對這一問題的解決方案有3種:一種是指令掃瞄結合動態指令修改的軟體技術,有許多商業的虛擬化產品採用了這種方案。此種虛擬化技術的代表產品是

vmware

;另一種是對

guest

系統進行修改,使得修改資源時能產生必要的

trap

,以便能被

vmm截獲。代表軟體是

xen(

其中的modify方式)

。最後一種方案是修改

x86 cpu

,使它支援虛擬化(即讓所有敏感特權指令都能產生

trap

),也就是

intel

的vanderpool

技術和amd

的pacifica

技術的目標,具體代表是

kvm和

xen (unmodify方式)

。 i/o

請求或讀或寫在被

vmm截獲後都需要模擬執行。模擬即可以在

vmm內部完成,也可以在

host

中完成。

vmm內部完成的好處是速度快,缺點是需要在

vmm中實現模擬裝置,工作量大;且使得

vmm變的臃腫,降低了

vmm的可靠性。在

host

中完成雖然需要將

i/o請求從

vmm**到

host

中的裝置模擬程序,增加了上下文切換和排程時間。但是優點更突出:

1 可以利用已存在的裝置模擬**(如

qemu);2

於宿主性裝置模擬可以借助

host

系統的裝置驅動。

3 保持了

vmm盡量精簡。鑑於以上原因多數虛擬化軟體都採用將裝置模擬紡在

host

中進行。

最後,為了讓大家能更清楚認識

i/o虛擬化過程。我舉

xen中完成

i/o虛擬化的過程進行說明:

首先guest

系統執行

i/o請求命令(如

out ***);

由於guest

處於使用者空間,

i/o訪問會引發

trap

,這時處於特權級執行的

vmm會將捕獲該

trap,

然後vmm

可能在自己內部模擬執行該

i/o請求(如對中斷控制器的請求或簡單的

pit模擬等都實現在

vmm內部),或者將

i/o請求向上傳送給處於

domain0

中執行的

qemu

程序模擬

i/o操作(具體是通過

event channel

傳送模擬中斷通知

domain0

中的qemu

)。qemu

程序當監聽到上發的

i/o請求後,會調對應埠註冊的處理函式進行

i/o模擬處理,並將模擬結果送回

vmm,從而返回給

guest

系統。

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

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

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

原版本為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,開啟虛擬環...