英語

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 請求的處理流程

  1. 當用戶虛擬機器中發生捕獲的 I/O 訪問時,虛擬機器監控器的 I/O 處理程式將填充一個 PENDING 狀態的 I/O 請求。

  2. 虛擬機器監控器向上呼叫服務虛擬機器,這是一個通知中斷。

  3. 向上呼叫處理程式排程一個工作執行緒來分發 I/O 請求。

  4. 該工作執行緒查詢 PENDING 狀態的 I/O 請求,根據 I/O 訪問的地址將它們分配給不同的註冊客戶端,將其狀態更新為 PROCESSING,並通知相應的客戶端進行處理。

  5. 被通知的客戶端處理分配的 I/O 請求。

  6. HSM 將 I/O 請求狀態更新為 COMPLETE,並透過超呼叫通知虛擬機器監控器完成。