《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 嵌入式技術(shù) > 業(yè)界動態(tài) > RISC-V 異常處理在 KVM 中的實現(xiàn)

RISC-V 異常處理在 KVM 中的實現(xiàn)

2023-06-16
作者: 曉泰
來源: 泰曉科技
關(guān)鍵詞: RISC-V KVM

  Corrector: TinyCorrect v0.1 - [tounix spaces toc comments tables images urls epw]

  Author: XiakaiPan 13212017962@163.com

  Date: 2022/10/21

  Revisor: walimis, Falcon

  Project: RISC-V Linux 內(nèi)核剖析

  Proposal: RISC-V 虛擬化技術(shù)調(diào)研與分析

  Sponsor: PLCT Lab, ISCAS

  本周繼續(xù)連載 Risc-v Kvm Excp Impl 系列文章,記得收藏分享+關(guān)注,寫文章領(lǐng)補(bǔ)貼:gitee.com/tinylab/riscv-linux

  該活動統(tǒng)一采用泰曉社區(qū)自研 Linux Lab 開源實驗環(huán)境,也可選用免裝即插即跑 Linux Lab Disk (https://tinylab.org/linux-lab-disk),某寶檢索“泰曉 Linux”可找到。Linux Lab v1.1 Inside —— 內(nèi)核開發(fā)從未像今天這般簡單!

  RISC-V 異常處理在 KVM 中的實現(xiàn)

  前言

  Trap 處理是 RISC-V 虛擬化實現(xiàn)中的重要部分,包括異常和中斷兩個部分。當(dāng)前 KVM 是 RISC-V 虛擬化擴(kuò)展在軟件層面較為可靠的實現(xiàn),本文將結(jié)合 RISC-V 特權(quán)指令集手冊的規(guī)定,分析 KVM 中有關(guān)異常處理的實現(xiàn),中斷部分由于涉及較多驅(qū)動層面的內(nèi)容,故將在之后的文章中結(jié)合 MMIO,timer 等做具體探討。

  軟件版本

 微信截圖_20230616161548.png

  KVM 異常處理

  異常處理入口

  在 KVM 對 RISC-V H 擴(kuò)展的實現(xiàn)中,與異常處理相關(guān)的函數(shù)調(diào)用關(guān)系如下圖所示。目前的實現(xiàn)中,KVM 能夠處理三類異常。即虛擬機(jī)內(nèi)的 page fault、虛擬指令異常和系統(tǒng)調(diào)用,三種不同的異常處理分別對應(yīng)了不同的實現(xiàn)。

  微信截圖_20230616161931.png

  異常分類及其定義

  kvm_arch_vcpu_ioctl_run 函數(shù)用于實現(xiàn) vCPU 的運(yùn)行。其調(diào)用 kvm_riscv_vcpu_enter_exit 函數(shù)進(jìn)入 vCPU 的運(yùn)行,此時 Guest 進(jìn)入運(yùn)行狀態(tài),CPU 處于 VS 或者 VU 模式。當(dāng) Guest 發(fā)生無法處理的異常時,Guest 退出,CPU 進(jìn)入 HS 模式,隨后 KVM 調(diào)用 kvm_riscv_vcpu_exit 來實現(xiàn)對異常的處理。

  kvm_riscv_vcpu_exit 函數(shù)內(nèi)部包含三個部分,分別對應(yīng)三種異常的處理,代碼如下:

 微信截圖_20230616162055.png

微信截圖_20230616162245.png

  如上所示,KVM 的實現(xiàn)中包含了三類異常:

  虛擬指令異常;

  Guest page fault;

  SBI 系統(tǒng)調(diào)用。

  特權(quán)指令集手冊 中規(guī)定了每種異常對應(yīng)的編碼(即 scause 的可能的值),在進(jìn)行異常處理時,可依據(jù)據(jù) scause 的具體值確定其處理方式,如下表所示。

  微信截圖_20230616162009.png

  cause code

  在 KVM 中,其對應(yīng)宏的定義如下:

 微信截圖_20230616162306.png

  虛擬指令異常

  其中,EXC_VIRTUAL_INST_FAULT 即 virtual instruction exception 對應(yīng)如下情況:

  在 VS-Mode 或 VU-Mode 下訪問特定 CSR 的特定位;

  在 VS-Mode 或 VU-Mode 下執(zhí)行無權(quán)限的指令如 HFENCE, HLV, HSV 等。

  KVM 中 virtual instruction 異常的處理如下:

  微信截圖_20230616162355.png

      微信截圖_20230616162434.png

 

  其中用于處理具體指令的函數(shù)其原型或定義如下:

  處理非法壓縮指令時,用于從 Guest 獲取合法指令的 kvm_riscv_vcpu_unpriv_read 函數(shù):

 微信截圖_20230616162634.png

  對合法的壓縮指令以及非 SYSTEM 類型的非壓縮指令,不進(jìn)行額外處理,直接調(diào)用 truly_illegal_insn 函數(shù)處理,保存當(dāng)前 trap 的具體信息,將 Guest PC 設(shè)置為 Guest 中對應(yīng)的異常向量, 然后返回到到 Guest 中對異常進(jìn)行處理:

 微信截圖_20230616162706.png

     微信截圖_20230616162738.png

  其調(diào)用關(guān)系如下圖所示:

  微信截圖_20230616162900.png

  SBI 系統(tǒng)調(diào)用

  系統(tǒng)調(diào)用的處理通過調(diào)用 kvm_riscv_vcpu_sbi_ecall 函數(shù)實現(xiàn),如下方代碼塊所示:

  SBI(Supervisor Binary Interface) 是直接運(yùn)行在 Machine Mode 下的,為上層 OS 提供統(tǒng)一接口的程序,具有最高權(quán)限。而 Guest 訪問 SBI 系統(tǒng)調(diào)用,是在 KVM 中模擬實現(xiàn),不是實際訪問 Machine Mode 中的 SBI firmware。KVM 通過直接訪問和設(shè)置寄存器(cp->a7, cp->a0, cp->a0 等)的值來實現(xiàn)對 SBI 系統(tǒng)調(diào)用的處理。

  微信截圖_20230616163251.png

        微信截圖_20230616163337.png

微信截圖_20230616163445.png

  總結(jié)

  本文結(jié)合 KVM 中有關(guān)異常處理的實現(xiàn),討論了在添加 H 擴(kuò)展之后的虛擬指令異常、guest page fault 以及來自 guest 的系統(tǒng)調(diào)用的處理。

  參考資料

  RISC-V 特權(quán)指令集手冊

  RISC-V Linux

  首發(fā)地址:https://tinylab.org/riscv-kvm-excp-impl

  技術(shù)服務(wù):https://tinylab.org/ruma.tech


本站內(nèi)容除特別聲明的原創(chuàng)文章之外,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點(diǎn)。轉(zhuǎn)載的所有的文章、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無法一一聯(lián)系確認(rèn)版權(quán)者。如涉及作品內(nèi)容、版權(quán)和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當(dāng)措施,避免給雙方造成不必要的經(jīng)濟(jì)損失。聯(lián)系電話:010-82306118;郵箱:aet@chinaaet.com。