OpenSBI简介-4

OpenSBI 简介-1 OpenSBI简介 阅读详情

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

现在分析sbi_init源码,进入sbi_init时,scratch是唯一的参数。在进入sbi_init前,每个cpu会把_trap_handler的地址设置到mtvec里面。

  1. sbi_init函数
    void __noreturn sbi_init(struct sbi_scratch *scratch)
    {
    bool next_mode_supported = FALSE;
    bool coldboot = FALSE;
    u32 hartid = current_hartid();
    const struct sbi_platform *plat = sbi_platform_ptr(scratch);

     if ((SBI_HARTMASK_MAX_BITS <= hartid) ||  //hartid错误,超过了最大值,当前core 进入了wfi状态
     	sbi_platform_hart_invalid(plat, hartid))
     	sbi_hart_hang();
    
     switch (scratch->next_mode) {
     case PRV_M:
     	next_mode_supported = TRUE;
     	break;
     case PRV_S: /* 对于jump模式,会走这里 */
     	if (misa_extension('S'))  /* 查看当前模式是否支持 */
     		next_mode_supported = TRUE;
     	break;
     case PRV_U:
     	if (misa_extension('U'))
     		next_mode_supported = TRUE;
     	break;
     default:
     	sbi_hart_hang();
     }
    
     /*
      * Only the HART supporting privilege mode specified in the
      * scratch->next_mode should be allowed to become the coldboot
      * HART because the coldboot HART will be directly jumping to
      * the next booting stage.
      *
      * We use a lottery mechanism to select coldboot HART among
      * HARTs which satisfy above condition.
      */
    
     /* 
      * atomic_xchg作用就是原子操作,设置coldboot_lottery新值返回旧值,第一次设置,设置的是1,返回的是0,
      * 所以说第一个设置的core就是负责boot的core,那么执行的就是coldboot,其他的core执行是warmboot
      * 下面约定主core就是负责coldboot的core,其他的是从core,主core不一定是core 0
      */
     if (next_mode_supported && atomic_xchg(&coldboot_lottery, 1) == 0)
     	coldboot = TRUE;
    
     if (coldboot)
     	/* 全局数据的初始化由主core完成,coldboot初始化的会比warmboot多,sbi的打印默认是由主core输出的,从core没有log */
     	init_coldboot(scratch, hartid); 
     else
     	/* 从core会在sbi_hsm_init->sbi_hsm_hart_wait里面wfi,直到被下一级boot唤醒,从core只初始化自己独有的数据或者寄存器 */
     	init_warmboot(scratch, hartid); 
    

    }

  2. init_coldboot(scratch, hartid);
    static void __noreturn init_coldboot(struct sbi_scratch *scratch, u32 hartid)
    {
    int rc;
    unsigned long *init_count;
    const struct sbi_platform *plat = sbi_platform_ptr(scratch);

     /* Note: This has to be first thing in coldboot init sequence */
     /* 创建hartid_to_scratch_table映射表,也就是hart id和scrash内存绑定的表;记录last_hartid_having_scratch值,也就是core的最大值index(core count -1) */
     rc = sbi_scratch_init(scratch);  ------ 详见2.1
     if (rc)
     	sbi_hart_hang();
    
     /* Note: This has to be second thing in coldboot init sequence */
     /* 
      * 初始化动态加载的镜像的模块,并把mem region注册到hartid_to_domain_table数组里面。
      * 这里的mem region会在sbi_hart_pmp_configure中进行配置保护 
      * 这里注册了两个mem regions,一个是fw自己所占的内存,一个是任意的地址
      */
     rc = sbi_domain_init(scratch, hartid);
     if (rc)
     	sbi_hart_hang();
    
     /* 
      * 每一个hart id的scrash内存里面,从SBI_SCRATCH_EXTRA_SPACE_OFFSET这个地方偏移开始申请__SIZEOF_POINTER__大小的内存,并memset为0 
      * 从core也会判断init_count_offset是否正确,内存是否分配成功
      */
     init_count_offset = sbi_scratch_alloc_offset(__SIZEOF_POINTER__,  ---------------- 详见2.2
     						 "INIT_COUNT");
     if (!init_count_offset)
     	sbi_hart_hang();
    
     /* 
      *每一个core申请hart data内存,并把每一个core的state设置为SBI_HART_STARTING,这个函数主从core都会调用,
      * 主core申请内存设置状态,从core在wfi,直到自己的state设置为SBI_HART_STARTING
      * hsm应该是hart state mechine的简写。
      */
     rc = sbi_hsm_init(scratch, hartid, TRUE);  -------------------详见2.3
     if (rc)
     	sbi_hart_hang();
    
     /* 
      * 平台相关的早期的初始化,调用platform.c里面设置的回调函数:early_init,用户可以把需要初始化的
opensbi firmware源码分析(1) 这个系列主要分析generic平台下fw_jump.elf这个文件对应的源码(主要我觉得相比于fw_payload和fw_dynamic,这个最简单),基于版本0.8(因为qemu5.2.0默认使用的这个版本作为bios,并且能够boot最新版的riscv-linux)......... 阅读详情

相关推荐

OpenSBI初始化分析

再来看下非启动hart的动作:一直在等待启动hart的link_start和load_start相同,也就是_boot_status变为BOOT_STATUS_RELOCATE_DONE。接下来可以看到在几个nop指令后,非启动hart会跳转到_wait_for_boot_hart的链接地址,将继续等待启动hart完成其他的初始化工作。设置mtvec trap处理寄存器与_trap_handler函数。其他非启动hart将等待_boot_status=BOOT_STATUS_BOOT_HART_DONE。

swh547的博客 2706

OpenSBI payload

uboot U-Boot作为OpenSBI的有效负载 U-Boot是一个开源的主引导加载程序。在嵌入式环境中,它可以用作第一和/或第二阶段引导加载程序。在OpenSBI环境中,U-Boot可以被指定为OpenSBI固件的负载,成为OpenSBI固件执行之后的启动阶段。 构建和生成U-Boot映像 关于如何从U-Boot提示符构建U-Boot映像和引导高级操作系统的详细说明,请参阅U-Boot构建文档。 Linux Linux作为OpenSBI的直接有效负载 OpenSBI

Do one thing at a time, and do well. 2694

Opensbi初始化分析:设备初始化

Opensbi初始化分析:设备初始化设备初始化sbi_init函数coldinit,冷启动初始化sbi_scratch_init函数sbi_domain_init函数sbi_hsm_initsbi_platform_early_initsbi_hart_initsbi_console_initsbi_platform_irqchip_init中断控制器的初始化sbi_ipi_init函数sbi_tlb_init函数sbi_timer_init函数sbi_ecall_init函数sbi_domain_fina

swh547的博客 1040

OpenSBI 的一些关键点和学习资源

目的与功能OpenSBI 主要负责在 RISC-V 处理器上进行初始化,并为操作系统提供一个标准的运行时环境。它提供了一组 API,供操作系统访问硬件功能,包括中断管理、定时器、内存管理等。架构OpenSBI 通常运行在 RISC-V 的超级用户模式(Supervisor Mode),并提供一个抽象层,使操作系统能够以一致的方式访问硬件。它支持多种 RISC-V 硬件平台,包括不同的 SoC(系统级芯片)和开发板。与其他组件的关系。

ruofengdeyu的博客 992

QEMU 6.1.0 运行 RISCV64 OpenSBI + U-Boot + Linux

QEMU 6.1.0 运行 RISCV64 OpenSBI + U-Boot + Linux 1. 准备 OpenSBI v0.9 git clone https://github.com/riscv-software-src/opensbi.git --branch v0.9 U-Boot v2021.07 https://source.denx.de/u-boot/u-boot.git --branch v2021.07 Linux 5.10.70 (直接在 www.kernel.org 上下载即

qq_41957544的博客 4988

2.4 opensbi: riscv: opensbi源码解析

当编程timer中断到来时,陷入m模式的异常,进入_trap_handler汇编函数,调用sbi_trap_handler()->sbi_timer_process(),在sbi_timer_process函数中触发一个s模式的timer中断,真正的timer中断处理函数是在s模式处理的。在aclint_mtimer_cold_init()函数中会初始化time_rd以及time_wr回调函数,64位系统为mtimer_time_rd64()函数和mtimer_time_wr64()函数。

Do one thing at a time, and do well. 559

2.1 opensbi: riscv: opensbi源码解析

在spl跳转到opensbi执行的时候,携带了三个参数,分别保存在a0,a1,a2,三个参数的含义:hartid、fdt地址(u-boot的dtb文件)和struct fw_dynamic_info结构体地址。在这里我们使用的是dynamic负载,所有fw_boot_hart汇编函数位于firmware/fw_dynamic.S。opensbi第一条执行的指令是从_start开始(firmware/fw_base.S).代码如下。在执行make的时候可以指定是否开启FW_PIC,,如果开启FW_PIC,

Do one thing at a time, and do well. 1958

2.2 opensbi: riscv: opensbi源码解析

函数位置:firmware/fw_base.S函数作用:重置寄存器 除了ra, a0, a1 和a2关闭和清理所有中断设置每个hartid的栈地址设置mscratch指向sbi_scatch结构体设置异常处理函数_trap_handler(所有hart 都会去设置)设置参数为sbi_scatch结构体,调用sbi_init/*1. 重置寄存器 除了ra, a0, a1 和a2*/li ra, 0/*2. 关闭和清理所有中断*//*3. 设置每个hartid的栈地址*/

Do one thing at a time, and do well. 869

opensbi:RISC-V 开源管理器二进制接口

RISC-V 开源管理器二进制接口 (OpenSBI) 版权和许可 OpenSBI 项目版权所有 (c) 2019 Western Digital Corporation 或其附属公司和其他贡献者。 它根据 BSD 2-clause 许可(“简化 BSD 许可”或“FreeBSD 许可”,SPDX: BSD-2-Clause )的条款分发。 可以在文件找到具有 OpenSBI 版权的此许可证的副本。 OpenSBI 中的所有源文件都包含 2-Clause BSD 许可证 SPDX 短标识符来代替完整的许可证文本。 SPDX-License-Identifier: BSD-2-Clause 这使机器能够根据网站上提供的 SPDX 许可证标识符对许可证信息进行处理。 OpenSBI 源代码还包含从下面列出的其他项目中重用的代码。 这些项目的原始许可文本包含在重用代码所在的源文件

OpenHarmony 4.1/5.0 Beta上手:如何用ArkUI在非华为设备上开发你的第一个“鸿蒙”应用

本文详细介绍了如何在非华为设备上使用ArkUI开发OpenHarmony应用,涵盖从设备选型、环境搭建到应用部署的全流程。通过实战案例展示ArkTS语言在开源鸿蒙生态中的应用,帮助开发者突破设备限制,构建跨平台鸿蒙应用。

weixin_33704234的博客 366

SAP ABAP干货:用REUSE_ALV_GRID_DISPLAY_LVC实现ALV多屏幕独立布局(含handle参数详解)

本文详细解析了SAP ABAP中如何使用REUSE_ALV_GRID_DISPLAY_LVC函数实现ALV多屏幕独立布局,重点介绍了handle参数的技术原理和实际应用。通过变式标识符和LTDX表存储机制,开发者可以确保不同ALV报表屏幕的布局设置互不干扰,提升复杂报表场景下的用户体验。

weixin_29268267的博客 310

从零构建AI辅助逆向分析环境:JADX-MCP与LLM的实战集成指南

本文详细介绍了如何从零构建AI辅助逆向分析环境,通过集成JADX-MCP与LLM技术,提升Android应用逆向工程效率。文章涵盖环境搭建、插件安装、MCP服务器配置及实战案例分析,帮助开发者快速掌握AI在代码理解、漏洞挖掘和自动化文档生成中的应用。

weixin_27875131的博客 839

【3D计算机视觉】从PointNet到PointNet++理论及pytorch代码

从PointNet到PointNet++理论及代码详解1. 点云是什么1.1 三维数据的表现形式1.2 为什么使用点云1.3 点云上以往的相关工作2. PointNet2.1 基于点云的置换不变性2.1.1 由对称函数到PointNet(vanilla)2.1.2 理论证明2.2 基于点云的旋转不变性2.3 网络总体结构2.4 实验结果和网络的鲁棒性2.5 代码解析3. PointNet++3.1...

小执着的博客 8万+

MicroPython驱动ST7789屏避坑实录:从GB2312到完整中文字库的升级之路

本文详细介绍了使用MicroPython驱动ST7789显示屏实现完整中文字库显示的实战方案。从硬件选型到字库系统改造,再到内存优化和显示性能提升,提供了一套突破GB2312限制的全套中文显示解决方案,特别适合ESP32开发者在物联网设备中实现高质量中文显示。

weixin_29190573的博客 394

Transformers 实战修炼与源码剖析专栏大纲

本专栏以 Hugging Face Transformers 为主线,围绕“能用、会调、敢上线、懂源码”四个目标展开。内容不把理论堆成公式墙,而是用真实或拟真的业务场景驱动:客服分类、合同抽取、知识库问答、模型微调、推理服务、监控告警、源码扩展等。采用“业务痛点 → 三人剧本对话 → 代码实战 → 总结思考”的四段式结构,让读者在动手完成一个个小项目的过程中,逐步理解 Tokenizer、Model、Pipeline、Trainer、Generation、PEFT、Accelerate、Serving等概念

davidwang456的专栏 923

RH850从0搭建Autosar开发环境系列讲解 - 总目录

Davinci Autosar实战开发从0构建开发能力。OS,COM,DCM,BSWMM,ECUM,VLINK,XCP,MEMMAP等模块配置,带你熟悉运行的autosar代码,包括MICROSAR的启动运行,使用GreenHills生成运行的hex。

weixin_42412049的博客 1万+

FineReport实战-- 国内外各地区销售数据分析 多个图表联动

进行国内外各地区业务员销售数据分析是一项复杂但极具价值的任务,它可以帮助企业了解不同市场的表现,并据此调整销售策略以提高整体绩效。实现功能:同一个报表里面多个图表联动问题。

Davina_yu的博客 1200

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

上一篇: kernel是如何调用sbi里面的函数
下一篇: bl31_el3_entrypoint_common_note
Runner_Linux
博客等级 码龄6年 17粉丝 14原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值