RISC-V 异常处理在 KVM 中的实现-世界新要闻
时间:2023-06-16 18:40:47来源:泰晓科技

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 内核剖析

Proposal: RISC-V 虚拟化技术调研与分析

Sponsor: PLCT Lab, ISCAS

本周继续连载 Risc-v Kvm Excp Impl 系列文章,记得收藏分享+关注,写文章领补贴:gitee.com/tinylab/riscv-linux

该活动统一采用泰晓社区自研 Linux Lab 开源实验环境,也可选用免装即插即跑 Linux Lab Disk (https://tinylab.org/linux-lab-disk),某宝检索“泰晓 Linux”可找到。Linux Lab v1.1 Inside —— 内核开发从未像今天这般简单!

RISC-V 异常处理在 KVM 中的实现

前言

Trap 处理是 RISC-V 虚拟化实现中的重要部分,包括异常和中断两个部分。当前 KVM 是 RISC-V 虚拟化扩展在软件层面较为可靠的实现,本文将结合 RISC-V 特权指令集手册的规定,分析 KVM 中有关异常处理的实现,中断部分由于涉及较多驱动层面的内容,故将在之后的文章中结合 MMIO,timer 等做具体探讨。

软件版本

KVM 异常处理

异常处理入口

在 KVM 对 RISC-V H 扩展的实现中,与异常处理相关的函数调用关系如下图所示。目前的实现中,KVM 能够处理三类异常。即虚拟机内的 page fault、虚拟指令异常和系统调用,三种不同的异常处理分别对应了不同的实现。

异常分类及其定义

kvm_arch_vcpu_ioctl_run 函数用于实现 vCPU 的运行。其调用 kvm_riscv_vcpu_enter_exit 函数进入 vCPU 的运行,此时 Guest 进入运行状态,CPU 处于 VS 或者 VU 模式。当 Guest 发生无法处理的异常时,Guest 退出,CPU 进入 HS 模式,随后 KVM 调用 kvm_riscv_vcpu_exit 来实现对异常的处理。

kvm_riscv_vcpu_exit 函数内部包含三个部分,分别对应三种异常的处理,代码如下:

如上所示,KVM 的实现中包含了三类异常:

虚拟指令异常;

Guest page fault;

SBI 系统调用。

特权指令集手册 中规定了每种异常对应的编码(即 scause 的可能的值),在进行异常处理时,可依据据 scause 的具体值确定其处理方式,如下表所示。

cause code

在 KVM 中,其对应宏的定义如下:

虚拟指令异常

其中,EXC_VIRTUAL_INST_FAULT 即 virtual instruction exception 对应如下情况:

在 VS-Mode 或 VU-Mode 下访问特定 CSR 的特定位;

在 VS-Mode 或 VU-Mode 下执行无权限的指令如 HFENCE, HLV, HSV 等。

KVM 中 virtual instruction 异常的处理如下:

其中用于处理具体指令的函数其原型或定义如下:

处理非法压缩指令时,用于从 Guest 获取合法指令的 kvm_riscv_vcpu_unpriv_read 函数:

对合法的压缩指令以及非 SYSTEM 类型的非压缩指令,不进行额外处理,直接调用 truly_illegal_insn 函数处理,保存当前 trap 的具体信息,将 Guest PC 设置为 Guest 中对应的异常向量, 然后返回到到 Guest 中对异常进行处理:

其调用关系如下图所示:

SBI 系统调用

系统调用的处理通过调用 kvm_riscv_vcpu_sbi_ecall 函数实现,如下方代码块所示:

SBI(Supervisor Binary Interface) 是直接运行在 Machine Mode 下的,为上层 OS 提供统一接口的程序,具有最高权限。而 Guest 访问 SBI 系统调用,是在 KVM 中模拟实现,不是实际访问 Machine Mode 中的 SBI firmware。KVM 通过直接访问和设置寄存器(cp->a7, cp->a0, cp->a0 等)的值来实现对 SBI 系统调用的处理。

总结

本文结合 KVM 中有关异常处理的实现,讨论了在添加 H 扩展之后的虚拟指令异常、guest page fault 以及来自 guest 的系统调用的处理。

参考资料

RISC-V 特权指令集手册

RISC-V Linux

首发地址:https://tinylab.org/riscv-kvm-excp-impl

技术服务:https://tinylab.org/ruma.tech

标签:

生活指南
  • Matomo 5.0 Beta 发布,网站访问统计系统 环球视讯

    Matomo是一套基于PHP+MySQL技术构建的开源网站访问统计系统,能够提供

  • 越卖越赔,降价也卖不动!猪价反转无期,养殖户将持续煎熬_环球观察

    今年生猪领域十分艰难,在供强需弱的压力下,养殖业频频承压。自去年四

  • 世界快看点丨推荐一款轻量级全栈式开源测试平台!

    1、RunnerGo介绍今天给大家介绍一个好用的测试平台:RunnerGo(开源)

  • 天天热点评!forest森林的英文,森林用英文怎么说

    请问forest是什么意思?

  • 每日视讯:公开盘点:武汉泌尿疾病的治疗医院 男性健康直击:武汉男科医院泌尿科怎么样

      公开盘点:武汉泌尿疾病的治疗医院男性健康直击:武汉男科医院泌尿

  • 余额宝买了天弘基金怎么把他退回来(我无意中在余额宝中卖了天弘基金能取消吗 怎一样取消)-报道

    1、假如是无意点击开通“余额宝”转入那么随时随地可以“转入 转出”要

  • 喊出“老公气我,喝!”的五个女博士被罚、道歉

    6月14日,此前广告被质疑侮辱女性的“五个女博士”被行政处罚,随后连

  • ​罗山:“罗才之家”揭牌暨招才引智集中签约仪式举行|每日简讯

    近日,河南省信阳市罗山县“罗才之家”揭牌暨招才引智集中签约仪式举行

  • 全球即时:打新债开通条件?打新债和打新股哪个风险大?

    打新债开通条件?打新债(即可转债)不需要特别的条件,只要开通了证券

  • 定金与订金哪个能退?交了定金没签合同能退吗?一文解析!-世界速看料

    定金与订金哪个能退?定金不能退,订金可以退。定金是指双方为了保

  • 今日热文:双肾回声增强一定是有问题吗?双肾回声增强是什么意思?

    双侧肾脏在B超上显示回声增强,说明肾脏有问题,具体是什么问题,需

  • 冰雪皇后可以加盟吗?冰雪皇后加盟商圈特点 热文

    冰雪皇后奶茶店里有奶茶、咖啡、鲜榨果汁、奶昔、冰淇淋等多种多样

  • 环球百事通!冬天汽车开暖风到底费不费油?如何上马路牙子伤害最小?

    冬天开暖风到底费不费油?这个问题是很多车主比较关心的,其实车内的

  • 封闭式理财会不会亏很惨?基金和理财有什么区别?

    封闭式理财会不会亏很惨?会。封闭式净值型理财产品是有可能亏损的。

  • 股权转让如何缴纳印花税?亏损企业股权转让要交什么税?

    股权转让如何缴纳印花税?股权出让方和受让方都要按照协议价格(所载

  • 焦点报道:信用卡逾期一月利息是多少?信用卡逾期三个月如何补救?

    1、逾期在一个月内,算逾期一次,只要逾期,哪怕一次,想提升额度就

  • 民生
    • 速看:执行解纷暖民心 漏水不“冷”邻里情

    • 天天微动态丨工商银行手机银行转账失败什么原因 怎么处理

    • 富士康如果不“跑路”,还有什么选择? 焦点信息

    • 速读:重庆建工:公司全资子公司签订10.93亿元巫山县绿色转型发展及新型城镇化PPP项目施工总承包合同