Corrector: TinyCorrect v0.1 - [tounix spaces toc comments tables images urls epw]
Author: XiakaiPan [email protected]
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)注,寫(xiě)文章領(lǐng)補(bǔ)貼:gitee.com/tinylab/riscv-linux
該活動(dòng)統(tǒng)一采用泰曉社區(qū)自研 Linux Lab 開(kāi)源實(shí)驗(yàn)環(huán)境,也可選用免裝即插即跑 Linux Lab Disk (https://tinylab.org/linux-lab-disk),某寶檢索“泰曉 Linux”可找到。Linux Lab v1.1 Inside —— 內(nèi)核開(kāi)發(fā)從未像今天這般簡(jiǎn)單,!
RISC-V 異常處理在 KVM 中的實(shí)現(xiàn)
前言
Trap 處理是 RISC-V 虛擬化實(shí)現(xiàn)中的重要部分,包括異常和中斷兩個(gè)部分。當(dāng)前 KVM 是 RISC-V 虛擬化擴(kuò)展在軟件層面較為可靠的實(shí)現(xiàn),,本文將結(jié)合 RISC-V 特權(quán)指令集手冊(cè)的規(guī)定,分析 KVM 中有關(guān)異常處理的實(shí)現(xiàn),,中斷部分由于涉及較多驅(qū)動(dòng)層面的內(nèi)容,,故將在之后的文章中結(jié)合 MMIO,timer 等做具體探討,。
軟件版本
KVM 異常處理
異常處理入口
在 KVM 對(duì) RISC-V H 擴(kuò)展的實(shí)現(xiàn)中,,與異常處理相關(guān)的函數(shù)調(diào)用關(guān)系如下圖所示,。目前的實(shí)現(xiàn)中,KVM 能夠處理三類(lèi)異常,。即虛擬機(jī)內(nèi)的 page fault,、虛擬指令異常和系統(tǒng)調(diào)用,三種不同的異常處理分別對(duì)應(yīng)了不同的實(shí)現(xiàn),。
異常分類(lèi)及其定義
kvm_arch_vcpu_ioctl_run 函數(shù)用于實(shí)現(xiàn) vCPU 的運(yùn)行,。其調(diào)用 kvm_riscv_vcpu_enter_exit 函數(shù)進(jìn)入 vCPU 的運(yùn)行,此時(shí) Guest 進(jìn)入運(yùn)行狀態(tài),,CPU 處于 VS 或者 VU 模式,。當(dāng) Guest 發(fā)生無(wú)法處理的異常時(shí),Guest 退出,,CPU 進(jìn)入 HS 模式,,隨后 KVM 調(diào)用 kvm_riscv_vcpu_exit 來(lái)實(shí)現(xiàn)對(duì)異常的處理。
kvm_riscv_vcpu_exit 函數(shù)內(nèi)部包含三個(gè)部分,,分別對(duì)應(yīng)三種異常的處理,,代碼如下:
如上所示,KVM 的實(shí)現(xiàn)中包含了三類(lèi)異常:
虛擬指令異常,;
Guest page fault,;
SBI 系統(tǒng)調(diào)用。
特權(quán)指令集手冊(cè) 中規(guī)定了每種異常對(duì)應(yīng)的編碼(即 scause 的可能的值),,在進(jìn)行異常處理時(shí),,可依據(jù)據(jù) scause 的具體值確定其處理方式,如下表所示,。
cause code
在 KVM 中,,其對(duì)應(yīng)宏的定義如下:
虛擬指令異常
其中,EXC_VIRTUAL_INST_FAULT 即 virtual instruction exception 對(duì)應(yīng)如下情況:
在 VS-Mode 或 VU-Mode 下訪問(wèn)特定 CSR 的特定位,;
在 VS-Mode 或 VU-Mode 下執(zhí)行無(wú)權(quán)限的指令如 HFENCE, HLV, HSV 等,。
KVM 中 virtual instruction 異常的處理如下:
其中用于處理具體指令的函數(shù)其原型或定義如下:
處理非法壓縮指令時(shí),用于從 Guest 獲取合法指令的 kvm_riscv_vcpu_unpriv_read 函數(shù):
對(duì)合法的壓縮指令以及非 SYSTEM 類(lèi)型的非壓縮指令,,不進(jìn)行額外處理,,直接調(diào)用 truly_illegal_insn 函數(shù)處理,保存當(dāng)前 trap 的具體信息,,將 Guest PC 設(shè)置為 Guest 中對(duì)應(yīng)的異常向量,, 然后返回到到 Guest 中對(duì)異常進(jìn)行處理:
其調(diào)用關(guān)系如下圖所示:
SBI 系統(tǒng)調(diào)用
系統(tǒng)調(diào)用的處理通過(guò)調(diào)用 kvm_riscv_vcpu_sbi_ecall 函數(shù)實(shí)現(xiàn),如下方代碼塊所示:
SBI(Supervisor Binary Interface) 是直接運(yùn)行在 Machine Mode 下的,,為上層 OS 提供統(tǒng)一接口的程序,,具有最高權(quán)限。而 Guest 訪問(wèn) SBI 系統(tǒng)調(diào)用,,是在 KVM 中模擬實(shí)現(xiàn),,不是實(shí)際訪問(wèn) Machine Mode 中的 SBI firmware,。KVM 通過(guò)直接訪問(wèn)和設(shè)置寄存器(cp->a7, cp->a0, cp->a0 等)的值來(lái)實(shí)現(xiàn)對(duì) SBI 系統(tǒng)調(diào)用的處理。
總結(jié)
本文結(jié)合 KVM 中有關(guān)異常處理的實(shí)現(xiàn),,討論了在添加 H 擴(kuò)展之后的虛擬指令異常,、guest page fault 以及來(lái)自 guest 的系統(tǒng)調(diào)用的處理。
參考資料
RISC-V 特權(quán)指令集手冊(cè)
RISC-V Linux
首發(fā)地址:https://tinylab.org/riscv-kvm-excp-impl
技術(shù)服務(wù):https://tinylab.org/ruma.tech