半虛擬化guest os無論如何都需要修改才能執行,因此,虛擬化環境必須使用guest os系統現有驅動要求就不存在了,然而讓客戶作業系統開發人員編寫大量**同樣也不是乙個很好的設計方案,因此xen的方式是提供抽象裝置,抽象裝置實現了針對特定裝置類的高階介面,如xen提供了抽象的塊裝置,而不是提供scsi裝置和ide裝置,塊裝置只支援兩種操作:讀和寫。
分離裝置模型
對於xen來說,支援商用pc中大量硬體產品是一件令人畏懼的任務,所幸大部分要支援的硬體一件被domain0所支援。那麼xen將免費獲得大量的硬體相容能力。
作業系統中提供多路復用已經是十分平常的啦,作業系統提供乙個真實裝置的抽象。現代作業系統的特性之一便是使用者應用程式通常互相不可見,兩個程序可以使用同乙個裝置,而彼此無需知道對方的存在。xen通過這種方法可以避免編寫大量的新的和未經測試的**。這種復用能力非常重要,高階系統尤其是大型機中的一些裝置提供了虛擬化可知特性(virtulization-aware)特性,他們能夠在韌體中被區分出來,從而每個執行中的作業系統都可以之間與其通訊,消費級別的裝置這種虛擬化特性不常見。
在我的其他部落格中有提到了i/0 ring的機制,前面理解不夠透徹,應為這方面的介紹的文章很少,這裡加深了理解在再來介紹一下。hypervisor提供了裝置發現和domain間移動資料的機制。xen裝置需要注意的內容之一是,他們實際並不是xen的一部分。
hypervisor提供了裝置發現和domain間轉移資料的機制,驅動在一對 guest domain之間被分割開來,這種成對的domain通常由domain0和domainu組成,當然可以使用過driver domain來代替domainu,xen定義了介面,實現這一架構。
單獨的共享記憶體環自身需要大量的查詢操作,通常效率比較低,由於xen允許非同步通知的事件機制,從而消除了這種需求。最後一部分是xenstore,這是乙個簡單的分層結構,xenstore的乙個主要用途就是發現裝置,類似於openfirmware提供裝置樹。
driver domain
xen提供了非domain0的domain委託訪問硬體裝置的機制,該domain被稱為driver domain,在不提供iommu或者提供iommu保護功能的類似硬體平台上,通常不能安全的實現這一目標。hypervisor能夠通過mmu來隔離用於記憶體對映的i/o的記憶體區域並將該記憶體區域授權給driver domain,它同樣可以阻止處於ring 1的過程使用i/o端操作指令,並且強迫這些指令**獲通過hypervisor模擬它們的實際i/o操作,從而增加了開銷。但是沒有二外的硬體支援的情況下,這一機制並不能放置driver domain發出的dma請求,這使得傳統的硬體上大部分驅動domain是不安全的。
driver domain提供兩大優勢,首先是為系統提供了額外的隔離性。在標準配置下domain 0具有以下兩個職責:
1、支援硬體平台,並執行後端裝置驅動
2、提供xen的管理介面
通過減少domain 0的**,提高了系統的安全性和穩定性,並且另乙個優勢就是可以提供對更多裝置的支援。
share memory ring buffer
ring buffer是乙個相當標準的無鎖資料結構,用於提供生產者的通訊。xen中使用的變體有些不同,它使用了自由執行計數器。典型的環形緩衝區有乙個生存者和消費者指標,有消費者進行檢測,有生產者進行累加,當乙個指標越過了緩衝區末尾的時候,他需要捲回。這帶來的開銷相對較大,並且由於它涉及到許多邊界程式設計,因此很容易照成錯誤。
如果能保證緩衝區的大小為2的冪指數,xen中的快取區就可以避免這一問題。意味著計數器的最低n位可以用作緩衝區中的索引值,計算器可以執行到大於緩衝區的大小,因此使用者不需要動手計算溢位;只需將計算器的值進行簡單的減法運算就可以算出緩衝區中的資料量。xen的環形緩衝區只有兩種資料:請求資料和響應資料通過驅動的兩端來完成更新。通常來說會造成一些問題:如果響應資料快於請求資料,那麼響應資料指標將會趕上請求指標,那麼就會阻止請求資料的寫入。xen通過只允許覆蓋寫入的方式防止這種情況的發生,也就是說,響應只能寫入哪些請求的buffer,如下圖:
環形緩衝區只有在沒有等待處理的請求時,才會出現沒有空間可以填充響應資料的情況,但在這種情況下不許要產生任何響應。如果沒有空間可以填充請求資料的時候,這以為著兩種情況。或者環形緩衝區已經填滿了請求,在這種情況需要請求指標等候片刻等後端程式處理這些請求;或者環形緩衝區包含了一些響應,在這種情況下前端驅動需要考慮在繼續提交請求之前處理其中的一些響應。
為了使用環形緩衝區機制,驅動的兩端都需要訪問它,這意味著儲存器必須能夠共享,完成共享的機制就是grant table。xen分離驅動模型約定是前端裝置驅動需要提供grant reference,同時後端驅動來對映它,這意味著前端將不需要發出hypercall來設定環形驅動緩衝區。除了一致性外,這同時提供了優勢,使得hvm的guest domain可以實現泛虛擬化驅動而不需要任何 grant table hypercall。這同時有助於虛擬機器的遷移,因此當前端驅動被移到另外一台機器上,他們的 為實體地址在同樣的位置,從而方便重新對映。
memory barriers實現順序操作
對於環形緩衝區的一些操作需要系統中的記憶體屏障。在純粹的順序架構(in-order)中,記憶體操作保證以他們被發射的順序來完成,這也意味著,只要資料在計數器增加之前寫入環形緩衝區,那麼一切都將是正常的。x86開始是順序架構,隨著發展,它必須維護對傳統**的相容性,因此現代x86處理器依然是強順序型別。xen支援的平台中並不是所有體系結構都是很順序結構,例如ia64是乙個弱順序型別架構,為了防止重排序,大部分體系結構提供了記憶體屏障指令,它強制所有的load store或者load和store組織了必須在繼續執行之前完成。
處理來自訊息的通知
真實的硬體通過中斷通道來通知cpu有非同步事件發生,他們使cpu進入特權模式並跳轉到被配置為該事件的處理程式的地方繼續處理。xen提供了類似的機制,也就是事件通道(event channels)的形式,他們被非同步傳遞到guest os ,與中斷不通過,當客戶機不在執行的時候他們被排隊,而中斷是不知道虛擬機器的存在,因此立刻傳遞。在xen中,事件機制同樣代替為通知分離裝置驅動的後端,應為通訊雙方是domain間的通訊。與中斷比事件有兩個主要的區別,它們是雙向的,並且是面向連線的,中斷請求被傳遞給指定的處理程式,但是連線的概念是不會出現的,什麼可以發起中斷請求時硬體層上的定義,中斷符描述表指出乙個程式需要哪些特權級別才可以觸發乙個中斷,而硬體定義了哪個裝置可以外部觸發他們。
事件必須更好進行訪問控制,乙個惡意的客戶機可能通過觸發大量虛擬的事件而引發嚴重的問題,因此事件只能在給定的通道上由兩個domain之間傳遞連線的另乙個domian。當事件通道被乙個domain分配,它就明確規定了另一端domain的序號。其他domain必須明確要求繫結該事件通道上,那麼這時事件才可以在通道兩端傳遞。
Xen的虛擬網路裝置
作為虛擬機器與外界通訊的途徑,虛擬網路裝置在xen的虛擬裝置中具有代表性。虛擬網路裝置的前後端須要通過共享記憶體進行通訊。由於後端須要為多個虛擬機器提供網路服務,因此後端具有網橋的功能。每個虛擬機器擁有乙個或多個網路裝置,通過軟體模擬的網橋進行資料報 虛擬網路裝置包含位於dom n中的前端和位於do...
裝置驅動例項 字元裝置驅動
在整個linux裝置驅動學習中,字元裝置驅動較為基礎。通過對它的學習,對裝置驅動進一步加深了解 cdev 結構體struct cdev 講下比較重要的成員變數 dev t dev 定義了32位的裝置號,其中12位是主裝置號,20位是從裝置號。獲取主裝置號 major dev t dev 獲取從裝置號...
驅動 linux裝置驅動 字元裝置驅動開發
preface 前面對linux裝置驅動的相應知識點進行了總結,現在進入實踐階段!linux 裝置驅動入門篇 linux 裝置驅動掃盲篇 fedora下的字元裝置驅動開發 開發乙個基本的字元裝置驅動 在linux核心驅動中,字元裝置是最基本的裝置驅動。字元裝置包括了裝置最基本的操作,如開啟裝置 關閉...