news 2026/6/17 14:26:22

OpenSBI相关内容理解与分析系列(4):Kernel中的SBI代码分析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
OpenSBI相关内容理解与分析系列(4):Kernel中的SBI代码分析

Kernel中SBI代码分析

一、ecall指令详解

在RISC-V指令集架构中,ecall指令是用于请求特权级别切换的指令。当一个应用程序(位于用户态)需要访问操作系统或者进行其他特权级别的操作时,它会使用ecall指令触发一个系统调用,请求切换到更高特权级别(例如,从用户态切换到内核态)。类似于x86架构的syscall指令。

在处理器的特权级别切换时,ecall指令会触发一个异常,引发处理器从用户态切换到更高特权级别(比如机器态或超级用户态),并且控制转移到预定义的异常处理程序,通常是操作系统内核中的一个处理程序。在处理器处理完特权级别的操作后,通过特定的机制返回到用户态继续执行。

ecall指令用于向执行环境发出请求,在不同的特权等级中执行ecall指令有不同的效果:

  • 在User模式下执行ecall指令时,会引发environment-call-from-U-mode异常,进而切换到更高特权级别(如Supervisor-mode)
  • 在S模式下执行ecall指令时,会引发environment-call-from-S-mode异常,进而切换到更高特权级别(如Machine-mode)
  • 在M模式下执行ecall指令时,会引发environment-call-from-M-mode异常,这意味着在机器态中发出了请求,通常需要由硬件或者相关的特权级别的软件进行处理。

二、内核中SBI源码分析

ecall指令在Linux内核中用于SBI调用。sbi_ecall指令接受8个参数,分别是:

  • ext: SBI extension ID (EID)
  • fid: SBI function ID (FID)
  • arg0-arg5: SBI调用参数

Linux内核中的SBI调用实现

// linux/arch/riscv/kernel/sbi.cstructsbiretsbi_ecall(intext,intfid,unsignedlongarg0,unsignedlongarg1,unsignedlongarg2,unsignedlongarg3,unsignedlongarg4,unsignedlongarg5){structsbiretret;registeruintptr_ta0asm("a0")=(uintptr_t)(arg0);registeruintptr_ta1asm("a1")=(uintptr_t)(arg1);registeruintptr_ta2asm("a2")=(uintptr_t)(arg2);registeruintptr_ta3asm("a3")=(uintptr_t)(arg3);registeruintptr_ta4asm("a4")=(uintptr_t)(arg4);registeruintptr_ta5asm("a5")=(uintptr_t)(arg5);registeruintptr_ta6asm("a6")=(uintptr_t)(fid);registeruintptr_ta7asm("a7")=(uintptr_t)(ext);asmvolatile("ecall":"+r"(a0),"+r"(a1):"r"(a2),"r"(a3),"r"(a4),"r"(a5),"r"(a6),"r"(a7):"memory");ret.error=a0;ret.value=a1;returnret;}

代码分析

对上述代码做简单分析:

  • 使用ecall指令时,将异常类型写在a7寄存器,参数写在a0-a5寄存器,后面会根据异常类型的不同调用不同的异常处理函数
  • register关键字表明后面的变量直接存储在寄存器中
  • asm (“ax”)表明将后面的变量与ax寄存器进行绑定
  • asm volatile表明嵌入汇编代码进入C代码中,并且将a0和a1寄存器既作为输入寄存器又作为输出寄存器传给ecall指令,而a2-a6寄存器作为输入寄存器传递给ecall
  • ecall函数返回两个值a0和a1,sbi_ecall函数将这两个值作为错误和返回值传递给调用它的函数

三、SBI调用示例

比如实现一个putchar函数用于打印一个字符到系统控制台,就通过如下sbi_ecall调用来实现:

// linux/arch/riscv/kernel/sbi.cvoidsbi_console_putchar(intch){sbi_ecall(SBI_EXT_0_1_CONSOLE_PUTCHAR,0,ch,0,0,0,0,0);}

SBI扩展ID定义

// linux/arch/riscv/include/asm/sbi.henumsbi_ext_id{#ifdefCONFIG_RISCV_SBI_V01SBI_EXT_0_1_SET_TIMER=0x0,SBI_EXT_0_1_CONSOLE_PUTCHAR=0x1,SBI_EXT_0_1_CONSOLE_GETCHAR=0x2,SBI_EXT_0_1_CLEAR_IPI=0x3,SBI_EXT_0_1_SEND_IPI=0x4,SBI_EXT_0_1_REMOTE_FENCE_I=0x5,SBI_EXT_0_1_REMOTE_SFENCE_VMA=0x6,SBI_EXT_0_1_REMOTE_SFENCE_VMA_ASID=0x7,SBI_EXT_0_1_SHUTDOWN=0x8,#endifSBI_EXT_BASE=0x10,SBI_EXT_TIME=0x54494D45,SBI_EXT_IPI=0x735049,SBI_EXT_RFENCE=0x52464543,SBI_EXT_HSM=0x48534D,};

四、Linux与OpenSBI的交互

当以sbi_console_putchar为例:

交互流程分析

上层调用中相当于使用C语言的printf函数(①),自然而然我们陷入了内核态,然后 Linux Kernel 去调用 OpenSBI 提供的sbi_ecall()函数(②),并且在调用过程中将eidfid以及之前提到的5个参数传递给 OpenSBI(③),之后由 OpenSBI 去真正的操作硬件。

最后操作完成之后,一级一级地向上返回执行结果(④ ⑤),完成整个向 console 进行输出的过程。

完整调用链

用户空间应用 │ ▼ (① printf) 内核态 printf 实现 │ ▼ (② sbi_console_putchar) sbi_ecall(SBI_EXT_0_1_CONSOLE_PUTCHAR, 0, ch, ...) │ ▼ (③ ecall 指令触发异常) OpenSBI 异常处理程序 │ ▼ 硬件操作:输出字符到控制台 │ ▼ (④ 返回结果) sbi_ecall 返回 │ ▼ (⑤ 返回用户空间) printf 返回

交互层次结构

层次组件职责
用户态C库 printf格式化输出字符串
内核态Linux Kernel系统调用处理、缓冲区管理
SBI层OpenSBI特权级切换、硬件抽象
硬件层UART/Console实际字符输出

这种分层设计体现了RISC-V架构的层次化特权模型,通过SBI层实现了操作系统与硬件之间的隔离,提高了系统的安全性和可移植性。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/17 14:25:02

计算机网络基础:公钥的分配

📌目录⚖️ 公钥的分配:从公钥密码到PKI体系的信任构建🎯 一、公钥分配的核心问题(一)公钥密码的信任困境(二)信任模型的本质(三)公钥分配的基本要求📦 二、公…

作者头像 李华
网站建设 2026/6/17 14:18:10

从 Client 到 Storage Location,Material Master 层级图背后的主数据建模思想

我看这张图,第一反应不是 SAP 画了一棵普通组织树,而是 SAP 在提醒我们,物料主数据不能被粗暴地塞进一张平面大表里。它必须顺着企业的组织边界分层保存,哪些字段在全集团通用,哪些字段只在某个法人、某个工厂、某个库存地点成立,都要有清楚的作用域。SAP 官方对 Materia…

作者头像 李华
网站建设 2026/6/17 14:15:01

3分钟搞定Windows 11安装:Rufus USB启动盘制作终极指南

3分钟搞定Windows 11安装:Rufus USB启动盘制作终极指南 【免费下载链接】rufus The Reliable USB Formatting Utility 项目地址: https://gitcode.com/GitHub_Trending/ru/rufus 想象一下,你的旧电脑因为硬件限制无法安装Windows 11,或…

作者头像 李华
网站建设 2026/6/17 14:10:57

144、展锐影像平台概述:虎贲系列 ISP 架构与适配要点

144、展锐影像平台概述:虎贲系列 ISP 架构与适配要点 去年秋天,我接手一个项目,客户要求在展锐T760平台上跑一颗三星的50M传感器。按理说,这种组合在MTK和高通上都有成熟方案,但展锐这边,第一版预览画面直接偏绿,自动白平衡像喝醉了酒,晃来晃去。更诡异的是,HDR模式下…

作者头像 李华
网站建设 2026/6/17 14:04:49

[机器学习]Machine learning algorithm recommendation chart

💎个人主页:星柚程 🚀精选文章:《MATLAB多目标优化》,《Kaggle:CV、Public LB 》、《我的第一次 Kaggle》、《C构造传参》、《蛇形机械臂的模拟退火优化》 🛠️专栏建设:|深度学习|、|Python量…

作者头像 李华