iT邦幫忙

2022 iThome 鐵人賽

DAY 20
0
Software Development

RISC-V: 深入淺出從入門到放棄系列 第 20

DAY20: RISC-V: Virtual Machines 的 interrupt

  • 分享至 

  • xImage
  •  
tags: 鐵人賽

0. 前言

今日來介紹 VM(virtual machine) 的 interrupt

簡介

當實作 hypervisor extension 時,hart 的特權模式包含 virtual supvisor(VS)以及 virtual user(VU) 用來管理虛擬的 hart。新增了幾個 hypervisor 與 VS 相關的 CSR,前幾日有所介紹,像是:hvien, hvictl, hviprio1, hviprio2, vsiselect, vsireg, vstopei, 以及 vstopi。對於 RV32 還新增了以下 CSR:hidelegh, hvienh, hviph, hviprio1h, hviprio2h, vsiph,以及 vsieh

VS-level external interrupts with a guest interrupt file

當 hart 實現 hypervisor extension 時,建議 hart 也有 IMSIC 當中包含 interrupt file。假設 guest interrupt file 可以使用,每個guest interrupt file 可以被分配到 虛擬 hart 上,以充當 虛擬 hart 的 supervisor interrupt file。如果有 N 個 guest interrupt file,則 N 個虛擬 hart 在實體 hart 上,每個 guest interrupt file 都當作一個 虛擬 supervisor level file。當前 虛擬 hart 的 guest interrupt file 由 CSR hstatus 的 VGEIN 所指示。當 VGEIN 不是有效的數值時,當前虛擬 hart 沒有 guset interrupt file 當作其 supervisor level interrupt file。

當 VEGIN 是有效值時,vsiselect 的值在 0x70~0xff ,選擇範圍內該 guest interrupt file 的暫存器,就像 siselect 在範圍內選擇 IMSIC 的 sueprvisor level interrup file 的暫存器。透過 vsuselectvsiregvstopei 間接 access interrupt file 的暫存器。因為所有的 IMSIC interrupt file 的行為相同,所以虛擬 hart 透過 siselectsiregstopei來 access guest interrupt file, 是無法區分真正的 sueprvisor level interrupt file。

除了每個 hart 的 IMSIC 之外,VM可能含需要查看 PLIC 或是 APLIC。然而,與 IMSIC 為虛擬 hart 提供 guest interupt file 的能力不同,hypervisor 需要為 VM 模擬 PLIC 或 APLIC。

當虛擬 hart 具有 IMSIC 時,因為 guest interrupt file 被分配給它 ,無論是虛擬或是真實的 external interrupt 所有的 external interrupt 都須通過 IMSIC。
hypervisor 可以輕鬆地將模擬的 external interrupt inject 到由 hstatus的 VGEIN選擇的 guest interrupt file 。當虛擬 hart 具有 guest interrupt file 時,通常不期望 hypervisor 在 hvip 設置 VSEIP。

在VM,模擬 APLIC 具有等同於真實 APLIC 的 wire interrupt source特殊情況下,如果此VM運行的軟體將虛擬 APLIC 配置為將 interrupt 轉成 MSI 到指定的虛擬 hart,則 hypervisor 可以配置真正 APLIC 將 interupt 轉為 MSI 發送到虛擬 hart 的guest interrupt file。通過這種方式,雖然 hypervisor 必須trap 和模擬 VM的 memory access,在虛擬 APLIC 上配置 interrutp 的轉發,但 interrupt 本身可以自動轉換為 guest interrupt file 的 真實 MSI,而無須為每個 interrupt 調動 hypervisor。

Direct control of a device by a guest OS

為了確保正確的支援 interrupt,必須滿足以下兩種條件, hypervisor 才能允許在VM當中運行 guest OS 直接控制實際設備發送 MSI:

  1. 每個虛擬 hart 都必須分配到一個 guest interrutp file ,為每個VM提供自己的 IMSIC
  2. 來自設備的 interrutp 必須透過將interrupt 轉換為 MSI 的 APLIC 以 wire的方式發出 signal 或是系統必須有一個 IOMMU,它可以藉由設備本身將 MSI memory 寫入的地址轉換。

如果 guest OS 能夠控制發送 MSI 的設備,它會使用 OS 為其虛擬 hart 的 IMSIC 看到 guest address 在設備上配置 MSI,而不知道這些地址只是虛擬的。當設備為 MSI 進行 memory 寫入時,IOMMU 必須使用 hypervisor 提供的轉換錶,將該寫入的目標地址從 guest OS 分配的 guest 地址,轉換為目標 guest interrupt file 的真實實際地址。

每個虛擬 hart 都分配了一個 guest interrutp file ,該 file 與真正的 supervisor level 的 interrupt file 沒有區別,因此 MSI 寫入 data 時不須用轉換。

Migrating a virtual hart to a different guest interrupt file

當虛擬 hart 從一個實體 hart 轉移到另一個新的實體 hart 時,如果虛擬 hart 正使用 guest interrupt file ,則分配給他的 guest interrupt file 必須從舊的實體 hart 更改為另一個實體 hart。因為各個 guest interrupt file 與各個 實體 hart 綁定,因此虛擬 hart 在轉移時,無法帶著 guest interrupt file 轉移。

將虛擬 hart 從一個 guest interrupt file 遷移到另一個的過程,比移動虛擬 hart 的大多數狀態更複雜,在新的實體 hart 中選擇目標的 guest interrupt file 之後,建議執行以下步驟:

  1. 在舊的 interrupt file 中,將暫存器 eidelivery和 eithreshold 保存到 memory 當中,並設 eidelivery = 0。
  2. 在新的 interrupt file,設定 eidelivery =0 ,並將所有實現的 interrput pending bit 設為0。
  3. 修改所有 IOMMU 的相關轉換表,以便使虛擬 interrupt file 的 MSI 可以發送到新的 guest interrupt file;同樣的,如果 APLIC 的任何 interrupt 由 MSI 轉發到舊的 interrupt file,重新配置 APLIC 使他們能夠發送到新的 interrupt file。
  4. 在舊的 interrupt file 當中,將所有實現的 interupt pending 以及 enable bit 儲存到 memory 當中,此步驟完成之後,舊的 interrupt file 便不再使用。
  5. 在新的 interrupt file 當中,將第四步驟 舉起的 interrupt pending 和 enable bit 寫入到 eip 以及 eie 當中。
  6. 在新的 interrupt file 當中,將步驟1 保存在 memory 當中的 eithreshold 和 eidelivery 的值寫回去新的 interrupt file。

VS-level external interrupts without a guest interrupt

雖然建議實作的 hypervisor extension 的 hart 帶有 guset interrupt file 的 IMSIC,但這並不是必需的。假設 guest interupt file 存在,但實際 hart 上的虛擬 hart 也可能比 guest interrupt 多,從而導致一些虛擬 hart 沒有被分配到。在任何一種情況下, hypervisor 都必須為虛擬 hart 模擬external interrupt controller。

當為虛擬 hart 模擬 external interrupt controller 時,如果虛擬 hart 無法配置 interrupt 的優先順序,則 external interrupt 可以透過 hvip 的 VSEIP 舉起,表示為 VS level。為了模擬 external interrupt controller 以及 non-exterrnal interrupt 的優先順序,hypervisor 可以使用 hvictl

後記

明天繼續~~


上一篇
DAY19: RISC-V: Supervisor level 的 Interrupt
下一篇
DAY21: RISC-V: VS level 的 interrupt
系列文
RISC-V: 深入淺出從入門到放棄30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言