OpenSBI简介-2

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

OpenSBI的启动分析

以fw_jump为例,从fw_jump.elf.ldS看到入口函数就是ENTRY(_start), _start定义在fw_base.S里面。
主要的启动流程都在fw_base.S里面,另外的三个文件主要是提供一些回调函数,不同的fw回调函数不同的实现方式。

3.1 初始化的大致流程
	下面概述下boot的大概流程
	1. 获取boot hart的id。对于fw_dynamic, fw_jump, fw_payload三种类型的fw, 获取boot hart的方法是不一样的。
		fw_jump和fw_payload这里直接返回-1, fw_dynamic这种fw情况有点不一样,启动fw_dynamic的上一级程序会把
		参数放到struct fw_dynamic_info里,用a2传给opensbi。

	2. 负责启动的core进行初始化,其他hart跳转到_wait_reocate_copy_done,等候启动hart完成初始化
	
	3. 重定位(动态库重定位,或加载地址和链接地址不相等的代码拷贝)
		把fw从当前运行的位置拷贝到编译是指定的位置,和uboot kernel的代码重定向是一样的。
	
	4. 设置boot阶段标志位BOOT_STATUES_RELOCATE_DONE,然后其他的core根据新的重定向后的代码,
		跳到_wait_for_boot_hart,等待初始化core的下一步的初始化
	
	5. 初始化core reset所有的寄存器,设置堆栈,清除BSS段
	
	6. 为每一个core分配堆栈和scrash空间,初始化scratch(即struct sbi_scratch结构体,此结构如图scrathch布局.png)
	
	7. 设备树重定位
	
	8. boot阶段设置为BOOT_STATUS_BOOT_HART_DONE,主core进入_start_warm,从core判断BOOT_STATUS_BOOT_HART_DONE到了后,
		延迟几个nop后也进入_start_warm。从core 执行3条nop指令是为了让boot core执行的最快。
	
	9. 也就是说所有的core都要执行_start_warm,也就是说所有的core都要执行下面的几个步骤
	
	10. 关闭和清理所有中断
	11. 设置mscratch和sp寄存器
	12. 设置mtvec trap处理寄存器为_trap_handler函数地址
	13. 调用c函数sbi_init
	14. 进一步的初始化,初始化一些板级资源,然后jump到下一级的boot
		通过函数sbi_hart_switch_mode(unsigned long arg0, unsigned long arg1, unsigned long next_addr, unsigned long next_mode, bool next_virt)
		跳到下一级boot,其中a0=arg0;a1=arg1; arg0里面是hart id, arg1里面是fdt的地址,如果有,没有就是0.
OpenSBI启动流程分析一 以fw_jump固件类型为例,链接脚本是riscv_start。 阅读详情

相关推荐

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入门

接着,通过调用函数 fw_next_arg1()获取下一个启动阶段传递过来的参数 a1,即将被重定位到的 FDT 的目标地址指针。fw_jump 不会再前一个引导过程获取信息,因此它所包含的下一阶段的引导代码的入口地址是静态的,要求下一阶段的代码必须要加载到指定位置。扩展的镜像文件名为 fw_payload.bin。OpenSBI 带动态信息的固件(FW_DYNAMIC)是一种可以从前一个引导阶段获取关于下一引导阶段(例如引导加载程序或操作系统)和运行时 OpenSBI 库选项的信息的固件。

Gefangenes的博客 1934

OpenSBI环境搭建

在Linux中安装如下工具。

qq_16106195的博客 1623

OpenSBI 汇编启动流程

OpenSBI启动时,第一条执行的指令是_start函数,在fw_start.S文件中,下图为此文件的执行流程: 在调用sbi_init前,会设置好scratch寄存器和scratchspace中的数据,scratchspace填充的部分数据是由结构体struct sbi_scratch描述的。每个hart都由一个sbi_scratch结构体来描述。 结构体如下: /** Representation of per-HART scratch space */ struct sbi_scra...

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

OpenSBI简介-4

OpenSBI简介-4

Runner_Linux的博客 1833

OpenSBI的Domain支持

OpenSBI域(Domain)是将底层硬件划分为系统级的分区,每个分区拥有自己的内存区域(RAM和MMIO设备)和HARTs(硬件线程)。OpenSBI将利用RISC-V架构的特性(如PMP、ePMP、IOPMP、SiFive Shield等)来实现域之间的安全隔离.。

qq_16106195的博客 1575

opensbi从0到1入门学习

OpenSBI运行在机器模式(M-mode),负责硬件初始化、运行时服务(如中断管理、定时器服务)和安全隔离。 详细分析了OpenSBI的三种启动模式(FW_PAYLOAD、FW_JUMP、FW_DYNAMIC)以及典型启动流程,并提供了一个基于QEMU的OpenSBI裸机固件实现示例。通过代码结构分析和链接脚本解读,帮助读者理解OpenSBI的工作原理和实际应用。

保持一颗永远好奇、勇于探索的心 3925

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

在QEMU上运行OpenSBI+Linux+Rootfs

挂载到/mnt/ext2/目录后,当你在 /mnt/ext2/ 下写入文件或修改文件时,这些更改会反映到 rootfs.ext2 文件中。安装时,会将可执行程序qemu-system-riscv64,以及头文件等其他文件,拷贝至/opt/qemu目录下。到这里,我们已经对rootfs.ext2文件写入完毕,写入的内容,主要包括busybox、目录结构、rcS文件等。编译完后,在opensbi/build/platform/generic/firmware/目录下。

百里杨的博客 3216

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

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

OpenSBI三种固件的区别

OpenSBI作为RISC-V Linux运行在M模式下的固件,其提供了三种不同类型的固件,今天聊聊它们的区别

嵌入式Linux充电站 2150

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

基于QEMU+OpenSBI+edk2的riscv启动流程解析

摘要: 本文分析了RISC-V平台基于QEMU+OpenSBI+EDK2的启动流程。QEMU负责硬件初始化、加载OpenSBI到RAM(0x80000000)并设置复位向量跳转;OpenSBI作为M-mode固件,完成平台初始化后,通过FDT传递硬件信息,并跳转到EDK2(位于Flash 0x20000000);EDK2作为UEFI固件进一步引导操作系统。设备树(DT)由QEMU生成,经OpenSBI传递至EDK2和Linux内核。启动流程分为三个阶段:QEMU硬件初始化→OpenSBI平台准备→EDK2

yao00037的博客 786

2.5 opensbi: riscv: opensbi源码解析

从sbi_trap_handler()函数中,我们可以看到其中处理的中断只有IRQ_M_TIMER和IRQ_M_SOFT,处理函数分别为sbi_timer_process()和sbi_ipi_process()。函数作用:设置所有hart状态为SBI_HSM_STATE_STARTED。函数位置:lib/sbi/sbi_timer.c。函数位置:lib/sbi/sbi_hart.c。函数位置:lib/sbi/sbi_hsm.c。函数位置:lib/sbi/sbi_ipi.c。

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

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 源代码还包含从下面列出的其他项目中重用的代码。 这些项目的原始许可文本包含在重用代码所在的源文件

uboot启动流程_RISCV64 opensbi启动过程

RISC-V64 opensbi启动过程1.说明2.环境准备2.1 交叉编译工具链2.2 源代码准备3.riscv架构 gdb调试方法4.opensbi底层初始化流程4.1 从qemu的加载执行开始4.2 opensbi底层初始化4.2 opensbi设备初始化4.3 二级boot的跳转5.小结1.说明最近有一些riscv的项目做,虽然以前也用过例如k210之类的riscv架构的芯片,但...

weixin_39530269的博客 7432

《第二十二篇》Cross-Attention:注意力机制详解-代码实现和公式详解《二》

本文详细介绍了Cross-Attention的原理、公式和实现。Cross-Attention用于Transformer解码器和Encoder-Decoder结构,通过查询向量(Q)与键、值向量(K、V)的交互实现序列对齐。核心公式为softmax(QK^T/√d_k)V,其中Q来自Decoder,K、V来自Encoder。文章还给出了多头注意力机制公式和PyTorch实现代码,包括投影计算、注意力分数计算和输出处理。代码示例展示了如何构建一个完整的Cross-Attention模块,并演示了其在解码器查询

guoguozgw的博客 2210

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

EfficientNet中的MBConv模块详解:为什么它能如此高效?

本文深度解析了EfficientNet中的MBConv模块,详细介绍了其核心设计理念、效率优化技术和复合缩放理论。MBConv通过深度可分离卷积、倒残差结构和注意力机制三大关键技术,实现了计算效率与模型性能的平衡,成为高效网络结构设计的典范。

tcp8optimizer的博客 349

RAGFlow核心引擎DeepDoc之PDF解析大起底

本文深入解析RAGFlow中的deepdoc模块,重点介绍了pdf文档解析器的实现细节。deepdoc包含parser(文档解析器)和vision(视觉处理)两大核心功能,其中pdf解析是最复杂的部分。文章详细剖析了PdfParser类的设计架构,包含PlainParser(基础文本提取)、RAGFlowPdfParser(核心处理流水线)和VisionParser(视觉扩展)三个类,它们通过统一的__call__方法返回标准化结果。还具体讲解了初始化过程如何加载OCR引擎、布局识别模型、表格结构识别器等关

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值