OpenSBI支持哪些固件

描述

FW_DYNAMIC固件

FW_DYNAMIC固件在运行时从上一个启动阶段获取有关下一个启动阶段的信息,例如引导加载程序或操作系统内核。

  • 上一个启动阶段(即LOADER)通过a2 寄存器将struct fw_dynamic_info的位置传递给FW_DYNAMIC
  • 之前的启动阶段(即LOADER)需要知道struct fw_dynamic_info
struct 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一起编译。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分