首先介紹用於Dom0和DomU通信的相關技術
事件通道:用於Dom和Xen之間、Dom和Dom之間異步事件通知機制
I/O 共享環:I/O 共享環是在不同Domain 之間存在的一塊固定的共享內存,用於在DomainU 和Domain0 之間傳遞I/O 請求和響應。I/O 共享環利用生產者和消費者的機理,來產生髮送以及響應I/O 請求。
授權表(Grant Table):授權表(Grant Table)是在不同Domain 之間高效傳輸I/O 數據的機制。
以DomU 向I/O 設備寫入數據爲例:
- DomU產生IO請求,在IO共享環中添加請求。
- 然後將IO數據放入授權表指向的內存中,等待Dom0來取。
- 一切準備就緒,通過事件通道通知Dom0開始處理。
- Dom0收到事件通道的通知,知道有數據需要處理。
- 然後,Dom0從IO共享環中取出IO請求,分析下到底DomU想要Dom0爲他做什麼。
- 明白要做什麼後,將授權表中的數據取出進行處理。
- 數據處理完成後,Dom0將處理後信息放入IO共享環,然後通過事件通道發送通知給DomU,告訴他處理完成了。
- DomU收到事件通道的通知,從IO共享環中取出相應,進而處理之。
詳細說明:
- DomainU 的應用程序訪問虛擬I/O 設備,DomainU 內核調用對應前端驅動。前端驅動生成I/O 請求,該請求描述了要寫入數據的地址和長度等信息,將其寫入共享環。
- 前端驅動將要寫入的數據放入Grant Table , 給Domain0 訪問的權限。
- 前端驅動通過事件通道通知Domain0。
- Xen 調度Domain0 運行時,檢查事件,發現有新的I/O請求,調用後端驅動進行處理。
- 後端驅動從共享環中拿出I/O 請求,分析I/O 請求。
- 後端驅動通過Grant Table 的操作取得DomainU 要寫入的數據。
- 後端驅動將I/O 請求預處理後調用真實的設備驅動執行寫入操作。
- I/O 請求完成後,後端驅動產生I/O 響應,將其放入共享環,並通過事件通道機制通知DomainU。
- Xen 調度DomainU 運行時,檢查事件,發現有新的I/O 響應,則爲DomainU 產生模擬中斷。
- 中斷處理函數檢查事件通道,並根據具體的事件調用對應前端驅動的響應處理函數。
- 前端驅動從共享環中讀出I/O 響應,處理I/O 響應。
參考自:《基於Xen 的I/O 準虛擬化驅動研究》胡冷非,李小勇