kernel是如何调用sbi里面的函数

linux 内核死机 堆栈,高通平台Linux kernel死机解题心得 1、前言1.1 目的能够借助相关调试工具,使用一般分析手段分析、定位解决项目过程中遇到的死机类系统稳定性问题,提升工作效率持续积累,拓宽知识深度和广度1.2 死机?指系统发生致命性异常导致主动或者被动进入系统完全不可用的状态,导致系统死机的问题原因有很多,排除硬件问题,还有这些大模块:Android、Linux kenrel、modem、TZ 等等,各个子系统都有可能导致系统死机重启,我们这里主要... 阅读详情

本文以OpenSBI 0.9版本为参考进行讲解

现在分析kernel是如何调用sbi里面的函数的

  1. 在sbi的初始化过程中,在fw_base.S里面会设置M mode的异常处理函数:
    la a4, _trap_handler
    …
    csrw CSR_MTVEC, a4
    设置完成后,只要发生M mode的异常就会进入到_trap_handler里面处理,
    _trap_handler这个函数在fw_base.S里面有定义,是汇编代码,实现了异常/中断调用的各个流程,
    _trap_handler:
    TRAP_SAVE_AND_SETUP_SP_T0

     TRAP_SAVE_MEPC_MSTATUS 0
    
     TRAP_SAVE_GENERAL_REGS_EXCEPT_SP_T0
    
     TRAP_CALL_C_ROUTINE   --------------------------这里进入异常处理的c函数,也就是sbi_trap_handler
    
     TRAP_RESTORE_GENERAL_REGS_EXCEPT_SP_T0
    
     TRAP_RESTORE_MEPC_MSTATUS 0
    
     TRAP_RESTORE_SP_T0
    
     mret
    

    sbi_trap_handler函数实现在/lib/sbi/sbi_trap.c里面。
    发生异常/中断的时候会进入到sbi_trap_handler函数,根据 mcause = csr_read(CSR_MCAUSE);
    的值,进入不同的处理分支,kernel下发的ecall会进入到:
    case CAUSE_SUPERVISOR_ECALL:
    case CAUSE_MACHINE_ECALL:
    rc = sbi_ecall_handler(regs);
    这里面,接着调用 sbi_ecall_find_extension(extension_id);
    struct sbi_ecall_extension *sbi_ecall_find_extension(unsigned long extid)
    {
    struct sbi_ecall_extension *t, *ret = NULL;

     	sbi_list_for_each_entry(t, &ecall_exts_list, head) {
     		if (t->extid_start <= extid && extid <= t->extid_end) {
     			ret = t;
     			break;
     		}
     	}
    
     	return ret;
     }
    

    通过extid获取到具体extension的handler,所有的异常处理在sbi初始化阶段,调用sbi_ecall_init
    的时候,全部注册在了ecall_exts_list里面。这个时候会从ecall_exts_list里面找到
    对应的handler。

  2. 以sbi_ecall_init()为例,介绍异常处理handler的处理过程
    2.1 注册了很多的异常回调handler
    int sbi_ecall_init(void)
    {
    int ret;

     	/* The order of below registrations is performance optimized */
     	ret = sbi_ecall_register_extension(&ecall_time);
     	if (ret)
     		return ret;
     	ret = sbi_ecall_register_extension(&ecall_rfence);
     	if (ret)
     		return ret;
     	ret = sbi_ecall_register_extension(&ecall_ipi);
     	if (ret)
     		return ret;
     	ret = sbi_ecall_register_extension(&ecall_base);
     	if (ret)
     		return ret;
     	ret = sbi_ecall_register_extension(&ecall_hsm);
     	if (ret)
     		return ret;
     	ret = sbi_ecall_register_extension(&ecall_srst);
     	if (ret)
     		return ret;
     	ret = sbi_ecall_register_extension(&ecall_legacy);
     	if (ret)
     		return ret;
     	ret = sbi_ecall_register_extension(&ecall_vendor);
     	if (ret)
     		return ret;
    
     	return 0;
     }
    

    2.2
    sbi_ecall_register_extension(&ecall_hsm);
    int sbi_ecall_register_extension(struct sbi_ecall_extension *ext)
    {
    struct sbi_ecall_extension *t;

     		if (!ext || (ext->extid_end < ext->extid_start) || !ext->handle)
     			return SBI_EINVAL;
    
     		sbi_list_for_each_entry(t, &ecall_exts_list, head) {
     			unsigned long start = t->extid_start;
     			unsigned long end = t->extid_end;
     			if (end < ext->extid_start || ext->extid_end < start)
     				/* no overlap */;
     			else
     				return SBI_EINVAL;
     		}
    
     		SBI_INIT_LIST_HEAD(&ext->head);
     		sbi_list_add_tail(&ext->head, &ecall_exts_list);
    
     		return 0;
     	}
     会把ecall_hsm放到ecall_exts_list链表里面,ecall_hsm里面有extid和具体的handler。
     struct sbi_ecall_extension ecall_hsm = {
     	.extid_start = SBI_EXT_HSM,
     	.extid_end = SBI_EXT_HSM,
     	.handle = sbi_ecall_hsm_handler,
     };
    

到这里,sbi中M mode的异常处理已经注册完成,这时候只要出发M mode的异常就会进入M mode,进入对应的handler。

  1. kernel是如何出发M mode的异常的:
    3.1
    在arch/riscv/kernel/sbi.c里面有sbi_ecall()调用函数,kernel可以通过sbi_ecall来出发M mode的异常处理。
    struct sbiret sbi_ecall(int ext, int fid, unsigned long arg0,
    unsigned long arg1, unsigned long arg2,
    unsigned long arg3, unsigned long arg4,
    unsigned long arg5)
    {
    struct sbiret ret;

     	register uintptr_t a0 asm ("a0") = (uintptr_t)(arg0);
     	register uintptr_t a1 asm ("a1") = (uintptr_t)(arg1);
     	register uintptr_t a2 asm ("a2") = (uintptr_t)(arg2);
     	register uintptr_t a3 asm ("a3") = (uintptr_t)(arg3);
     	register uintptr_t a4 asm ("a4") = (uintptr_t)(arg4);
     	register uintptr_t a5 asm ("a5") = (uintptr_t)(arg5);
     	register uintptr_t a6 asm ("a6") = (uintptr_t)(fid);
     	register uintptr_t a7 asm ("a7") = (uintptr_t)(ext);
     	asm volatile ("ecall"
     			  : "+r" (a0), "+r" (a1)
     			  : "r" (a2), "r" (a3), "r" (a4), "r" (a5), "r" (a6), "r" (a7)
     			  : "memory");
     	ret.error = a0;
     	ret.value = a1;
    
     	return ret;
     }
    
     各种异常都是通过sbi_ecall来实现的,在sbi.c以及cpu_ops_sbi.c里面已经封装了各种的实现,
     如启动core的函数sbi_hsm_hart_start -> 
     sbi_ecall(SBI_EXT_HSM, SBI_EXT_HSM_HART_START, hartid, saddr, priv, 0, 0, 0);
     最终调用的就是sbi里面注册的ecall_hsm。
    
OpenSBI简介-4 阅读详情

相关推荐

centos7.5英伟达驱动:unable to find the kernel source tree for current running kernel;nvidia-smi has faild

1 安装cuda_10.0.130_410.48_linux.run自带的410.48 driver成功,但是nvidia-smi显示 查看NVIDIA显卡驱动版本 cat /proc/driver/nvidia/version 显示驱动安装成功 lspci | grep -i nvidia显示pci插槽有两块nvidia显卡 2. /usr/bin/nvidia-uninstall卸载驱动 然...

王某的博客 1万+

RIAC-V架构开发——ecall函数调用分析

(1)sbi_ecall函数是内核调用SBI的接口,在RISC-V架构中定义了SBI规范,内核通过ecall指令来调用SBI接口进而操作硬件;(2)SBI规范参考官网文档《riscv-sbi.pdf》;

weixin_42031299的博客 4811

[coreboot] How to run coreboot + BBL/opensbi (provide SBI support) + Linux kernel on HiFive Unleashe

【代码】[coreboot] How to run coreboot + BBL/opensbi (provide SBI support) + Linux kernel on HiFive Unleashe。

wangyijieonline的博客 419

RISCV-OpenSBI 主流程分析与总结

OpenSBI的简要分析:

tugouxp的专栏 9739

NVIDIA Jetson Xavier NX刷机+ROS安装+深度学习配置

.NVIDIA Jetson Xavier NX 完整说明流程 V1.0.0 – by Holden Date : 2021-03-19 文章目录.NVIDIA Jetson Xavier NX 完整说明流程1. Jetson Xavier NX简介2. Jetson Xavier NX刷机介绍2.1 工具准备工作2.2 下载镜像以及烧录工具2.3 烧录原生镜像到TF卡2.4 开机启动2.5 组件配置4. 镜像克隆制作5. 镜像重烧写6. NX调控命令 1. Jetson Xavier NX简介 ​ NVI

李老板Holden的博客 7619

毕设别再硬肝了:我用 GPT + Codex 做项目、写论文,效率直接起飞

这个也是神器。你项目做完之后,最怕的是老师一问就懵。这时候你直接把你的项目发给它,让它模拟老师提问。这是我的毕业设计题目和项目简介,请你站在答辩老师角度,提出20个高频问题,并给出简洁好背的回答。要求:问题尽量贴近计算机专业本科毕业答辩。为什么选这个题目?技术选型为什么这样定?你的创新点是什么?系统难点是什么?数据库怎么设计的?你的模型为什么选这个?如果继续优化,下一步怎么做?这个对答辩真的帮助很大。说实话,如果没有 GPT + Codex,

m0_74100417的博客 1846

Linux系统移植:Kernel 启动流程

Linux系统移植:Kernel 启动流程

嵌入式学习记录站点 2439

实测有效防止colab自动断开连接

实测有效防止colab自动断开连接

Thebest_jack的博客 1万+

riscv架构下linux4.15实现early打印

适配内核到新的平台,基本环境搭建好之后,首要的就是要调通串口,方便后面的信息打印。正常流程 init/main.c 中 start_kernel 入口,要到 console_init 之后才能真正打印,前面的打印,都是缓存在 printk 的 ringbuffer 中的。

百里杨的博客 1351

ESP32水墨屏日历实战:低功耗自动更新与HTTPS数据解析

本文详细介绍了ESP32水墨屏日历项目的开发实践,重点讲解了低功耗自动更新与HTTPS数据解析的实现方法。通过ESP32的自动休眠功能和水墨屏的零功耗特性,结合HTTPS请求安全获取网络数据,实现了高效节能的桌面日历应用。项目代码开源,适合物联网开发者参考。

xx56789的博客 777

零基础教程:用Python给试卷照片自动切题(有道OCR+PIL完整流程)

本文为零基础用户提供了一套完整的Python自动化切题方案。通过调用有道OCR API识别试卷照片中的题目坐标,并利用PIL库进行精准裁剪,将杂乱的试卷图片自动分割为独立的题目图像。教程详细涵盖了环境搭建、图像预处理、API调用、坐标解析与批量处理全流程,帮助教育工作者和技术爱好者高效处理大量试卷,实现工作流程自动化。

grpc6streamer的博客 1174

riscv kernel会什么时候调用opensbi的代码

在RISC-V架构下,Linux内核会在多种情况下调用OpenSBI的代码。OpenSBI(Open Source Supervisor Binary Interface)是RISC-V平台上提供M模式(Machine Mode)服务的固件,它允许S模式(Supervisor Mode)的操作系统通过SBI(Supervisor Binary Interface)与M模式进行交互。指令进入M模式,触发SBI调用。具体的SBI扩展ID和功能ID决定了调用的具体服务。

zhangqing2002的博客 1436

保姆级教程:用海康威视老版存储服务器+IVMS-4200搭建本地监控录像(附软件获取与开机自启)

最近在帮朋友搭建一套小型监控系统时,遇到了一个颇具挑战性的问题:手头有几台海康威视网络摄像头,但官方已经下架了配套的存储服务器软件。经过一周的摸索和测试,终于找到了一套可靠的解决方案。本文将完整分享从软件获取到系统稳定运行的全过程,特别适合那些不想额外购买NVR设备,又需要本地存储监控录像的个人用户或小型企业IT管理员。

weixin_30553777的博客 515

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

endif。

swh547的博客 352

数电实训:万年历

万年历

Lmyccq的博客 1万+

【即插即用模块】注意力篇 | TGRS 2025 | SPR:显著性比例协调,注意力聚焦,先抓差异再精准特征融合!

本文提出SPRMamba网络中的显著性比例协调模块(SPR),用于解决遥感变化检测中非显著变化区域的识别难题。该模块通过差异提取→显著性识别→比例融合的三步流程,动态平衡显著与非显著特征表示。SPR包含空间滤波(SF)和上下文记忆(CMM)两个子模块,分别基于统计特征和深度学习自动区分特征差异中的显著性成分。实验表明,SPR能有效抑制背景噪声干扰,提升边缘检测精度,且随着模块数量的增加,模型性能持续改善。该模块计算成本低,可直接嵌入双输入特征融合场景,适用于各类需要动态特征平衡的视觉任务。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 365

RISC-V SBI规范解析:从指令集到操作系统标准接口

在计算机体系结构中,硬件抽象层是连接底层硬件与上层操作系统的关键桥梁,它通过定义标准化的接口规范,屏蔽硬件差异,实现软件的可移植性。RISC-V架构通过引入SBI(Supervisor Binary Interface,监管者二进制接口)规范,在机器模式(M-Mode)与监管者模式(S-Mode)之间建立了一套统一的调用约定。该规范采用模块化设计,定义了包括基础扩展、时间扩展、IPI扩展在内的核心组件,操作系统内核通过ecall指令触发陷阱,由M-Mode固件处理具体硬件操作。这种设计为RISC-V生态提供

weixin_34248705的博客 593

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

kernel_execve函数

内核空间调用用户空间的应用程序,通过kernel_execve()实现。    其实现比较简单:    arch/arm/kernel/sys_arm.c    在init/main.c中最后会通过kernel_execve()来调用用户空间的init进程(如/sbin/init, /etc/init, /bin/init等)。    在kernel/kmod.c中的___call_u

xiaoshengqdlg的专栏 3080

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Linux内核Kernel启动过程

减少存储空间: 压缩内核映像可以显著减少其在存储设备上的占用空间。这对嵌入式系统、存储资源有限的设备以及需要快速分发和更新内核的环境尤其重要加快加载速度: 压缩文件占用的空间更小,这意味着启动加载程序从磁盘读取文件到内存中的时间会更短。虽然解压缩内核映像需要一些时间,但现代处理器的解压缩速度非常快,通常解压缩的时间比从存储设备读取更多数据的时间要少。这会整体上加快启动过程。提高传输效率: 在网络上传输内核映像时,压缩文件可以显著减少带宽使用量。这对于需要远程更新内核的系统(OTA)非常有利。

weixin_60669486的博客 3546

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

linux kernel启动流程

linux kernel启动是从./init/main.c中开始的,其大概流程是: 1. 调用start_kernel()函数; 2. start_kernel()调用rest_init()函数; 3. rest_init()调用kernel_init()函数; 4. kernel_init()调用init_post()函数; 5. init_post()调用run_init_process()函...

weixin_33797791的博客 430

VSCODE+QEMU+WSL调试RISCV代码(SBI、kernel)

最近在对RISC-V架构比较感兴趣,正好手头有《RISC-V体系结构编程与实践》的书籍,就打算跟随笨叔将这块的知识学习起来,最开始当然是需要搭建一个基础的实验平台,本来笨叔是贴心的提供了VMare的环境,奈何天生叛逆的我就不下他的大镜像(我就不说我百度网盘没会员),就拿手头的wsl搭建了一套基于vscode的调试环境,可以直接一键调试,感觉还是蛮方便的。这里就进行一下记录。

XingleiGao的博客 3093

Oracle的kernel.shmmax和kernel.shmall设置

1.kernel.shmmax: 是核心参数中最重要的参数之一,用于定义单个共享内存段的最大值。设置应该足够大,能在一个共享内存段下容纳下整个的SGA ,设置的过低可能会导致需要创建多个共享内存段,这样可能导致系统性能的下降。至于导致系统下降的主要原因为在实例启动以及ServerProcess创建的时候,多个小的共享内存段可能会导致当时轻微的系统性能的降低(在启动的时候需要去创...

珍惜 3万+

kernel: 调用init程序的地方

start_kernel函数的最后一行:rest_init,调用了init程序。看代码就很清楚了。有个地方值得注意的是,优先被调用的是initramfs中的init程序(可以通过rdinit=xxx来设定)。然后才会去检查"init="的设置。如果这两个都没有设置的话,kernel就会挨个去尝试/sbin/init, /bin/init, /bin/sh...这些都没有那就panic了 转载于:...

weixin_30500663的博客 257

经典 【操作系统实验】实验四 添加系统调用RedHat5 kernel2.6.18

经典 【操作系统实验】 添加系统调用 (个人记录) 前言: 由于各种神奇操作与不可抗力的原因,不得不选择再次使用虚拟机进行添加系统调用操作。最初选择的是较老的RedHat6.5版本系统,内核2.6.10 (Linux内核2.6系列各个小版本之间差异极大,若无情况注意下载对应版本内核) 遭遇其他内核多次失败,最终选择2.6.18版本内核,最终留下记录。 RedHat5 kernel2.6.18 一、...

weixin_42374556的博客 643

内核态调用用户态函数的方法

系统初始化时kernel_init在内核态创建和运行应用程序以完成系统初始化           内核刚刚启动时,只有内核态的代码,后来在init过程中,在内核态运行了一些初始化系统的程序,才产生了工作在用户空间的进程。 /* This is a non __init function. Force it to be noinline otherwise gcc  736 * makes

litworld的专栏 4483
上一篇: OpenSBI简介-3
下一篇: OpenSBI简介-4
Runner_Linux
博客等级 码龄6年 17粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值