fw_dynamic固件fw_dynamic固件在运行时从上一个启动阶段获取有关下一个启动阶段的信息,例如引导加载程序或操作系统内核。
上一个启动阶段(即loader)通过a2 寄存器将struct fw_dynamic_info的位置传递给fw_dynamic之前的启动阶段(即loader)需要知道struct fw_dynamic_infostruct fw_dynamic_info { /** info magic */ unsigned long magic; /** info version */ unsigned long version; /** next booting stage address */ unsigned long next_addr; /** next booting stage mode */ unsigned long next_mode; /** options for opensbi library */ unsigned long options; unsigned long boot_hart; } __packed;fw_jump固件fw_jump固件假定下一个引导阶段的地址固定,但是不直接包含下一阶段的二进制代码,只是告诉opensbi,它运行完后需要到哪个地址执行。
例如,opensbi执行完后,需要加载kernel,而kernel的加载地址为0x80200000,那么我们指定0x80200000为需要跳转的地址,opensbi执行完毕后,就会跳转到0x80200000处去加载kernel。
具体例子:
opensbi执行完后,去执行uboot或者kernel,假设uboot或者kernel在内存中的地址为0x80200000,则编译opensbi:
make platform=generic fw_jump_addr=0x80200000在编译opensbi时,加入参数fw_jump_addr,即可指定需要跳转的地址。
注意, 由于opensbi运行在m模式下,本质上也是一个bootloader ,启动时,opensbi就会进行一些硬件的初始化操作,加上fw_jump固件可以指定跳转地址,因此 对于risc-v linux而言,opensbi执行完后,可以不执行uboot,直接启动kernel ,将uboot去掉,不影响risc-v linux正常启动。
在某些内存优化的场景下,可以考虑将uboot去掉,利用fw_jump固件直接启动kernel,从而节省内存。
fw_payload固件fw_payload固件直接包含下一引导阶段的二进制代码,下一引导阶段通常是bootloader或os镜像。
不同于fw_jump固件的指定地址跳转,fw_payload固件是将bootloader或os镜像直接打包进来。
具体例子:
将uboot打包进来,则编译opensbi:
make platform=generic fw_payload_path=uboot.bin将linux kernel打包进来,则编译opensbi:
make platform=generic fw_payload_path=image在编译opensbi时,加入参数fw_payload_path,即可以将下一引导阶段的二进制代码打包进来。相当于将opensbi、uboot、kernel合并为一个文件。
实际中,我们用的更多的是fw_payload固件,将uboot和opensbi一起编译。
ups电源的作用_ups电源参数
王磊:阿里本地生活助力实现经营全链路的数字化升级
华为nova 8系列新成员华为nova 8 SE在线上亮相
人工智能在数据中的全新意义
具有两组15V直流和一组5V开关电源电路设计图
OpenSBI支持哪些固件
基于LabVIEW6i中的DataSocket控件实现网络化自动测试系统的设计
最新的触控显示集成 (TDDI) IC — SSD2023U助力无边框手机
DFRduino Nano4.0的技术规格及产品特性的介绍
浅谈防水插头的电气性能
浅谈RS232电压电平和信号
简述AVR电位器的调节及作用
终于来了!电力铁塔远程维护解决方案
波士顿动力是如何打造机器人的
工业视觉缺陷检测的算法总结
数显卡尺怎么选购及注意事项
智慧城市多杆合一智能路灯基础设施改造特点
一名测试工程师的感悟
串联无功补偿和并联无功补偿有什么区别?
电饭煲功率自动调节器电路原理图