I/O 請求處理¶
使用者虛擬機器 (User VM) 的 I/O 請求由虛擬機器監控器構建,並透過 ACRN 虛擬機器監控器服務模組分發到與 I/O 請求地址範圍對應的 I/O 客戶端。 以下章節描述了 I/O 請求處理的詳細資訊。
1. I/O 請求¶
對於每個使用者虛擬機器,都有一個共享的 4 KB 記憶體區域,用於虛擬機器監控器和服務虛擬機器之間的 I/O 請求通訊。 I/O 請求是一個 256 位元組的結構緩衝區,即 'struct acrn_io_request',當用戶虛擬機器中發生捕獲的 I/O 訪問時,由虛擬機器監控器的 I/O 處理程式填充。 服務虛擬機器中的 ACRN 使用者空間首先分配一個 4 KB 頁面,並將緩衝區的 GPA(客戶物理地址)傳遞給虛擬機器監控器。 該緩衝區用作 16 個 I/O 請求槽的陣列,每個 I/O 請求槽為 256 位元組。 該陣列由 vCPU ID 索引。
2. I/O 客戶端¶
I/O 客戶端負責處理使用者虛擬機器的 I/O 請求,這些請求訪問的 GPA 落在某個範圍內。 多個 I/O 客戶端可以與每個使用者虛擬機器關聯。 每個使用者虛擬機器都有一個特殊的客戶端,稱為預設客戶端,它處理所有不適合任何其他客戶端範圍的 I/O 請求。 ACRN 使用者空間充當每個使用者虛擬機器的預設客戶端。
下圖顯示了 I/O 請求共享緩衝區、I/O 請求和 I/O 客戶端之間的關係。
+------------------------------------------------------+
| Service VM |
|+--------------------------------------------------+ |
|| +----------------------------------------+ | |
|| | shared page ACRN userspace | | |
|| | +-----------------+ +------------+ | | |
|| +----+->| acrn_io_request |<-+ default | | | |
|| | | | +-----------------+ | I/O client | | | |
|| | | | | ... | +------------+ | | |
|| | | | +-----------------+ | | |
|| | +-|--------------------------------------+ | |
||---|----|-----------------------------------------| |
|| | | kernel | |
|| | | +----------------------+ | |
|| | | | +-------------+ HSM | | |
|| | +--------------+ | | | |
|| | | | I/O clients | | | |
|| | | | | | | |
|| | | +-------------+ | | |
|| | +----------------------+ | |
|+---|----------------------------------------------+ |
+----|-------------------------------------------------+
|
+----|-------------------------------------------------+
| +-+-----------+ |
| | I/O handler | ACRN Hypervisor |
| +-------------+ |
+------------------------------------------------------+
3. I/O 請求狀態轉換¶
ACRN I/O 請求的狀態轉換如下。
FREE -> PENDING -> PROCESSING -> COMPLETE -> FREE -> ...
FREE:此 I/O 請求槽為空
PENDING:此槽中有一個有效的 I/O 請求掛起
PROCESSING:I/O 請求正在被處理
COMPLETE:I/O 請求已被處理
處於 COMPLETE 或 FREE 狀態的 I/O 請求由虛擬機器監控器擁有。 HSM 和 ACRN 使用者空間負責處理其他狀態的請求。
4. I/O 請求的處理流程¶
當用戶虛擬機器中發生捕獲的 I/O 訪問時,虛擬機器監控器的 I/O 處理程式將填充一個 PENDING 狀態的 I/O 請求。
虛擬機器監控器向上呼叫服務虛擬機器,這是一個通知中斷。
向上呼叫處理程式排程一個工作執行緒來分發 I/O 請求。
該工作執行緒查詢 PENDING 狀態的 I/O 請求,根據 I/O 訪問的地址將它們分配給不同的註冊客戶端,將其狀態更新為 PROCESSING,並通知相應的客戶端進行處理。
被通知的客戶端處理分配的 I/O 請求。
HSM 將 I/O 請求狀態更新為 COMPLETE,並透過超呼叫通知虛擬機器監控器完成。