1.本文说明

RISC-V的架构有着非常鲜明的特点,如果看过arm,aarch64,mips等架构的一些架构手册的基础知识,再看RISC-V的芯片的架构设计,就会觉得非常有意思,可以找到一些影子,但是又比这些架构设计简洁的多。当我看完aarch64的芯片手册,再看RISC-V的boot时,设计思想竟然可以做一些对比,同样去看RISC-V和mips的寄存器,也可看到高度的一致性。对于x86的架构我未曾深入了解,但是在risc-v上应该也可以找到一些设计元素。总体说来,RISC-V的架构设计集合了各种架构的设计的优点。我突然觉得这种堆叠即模块的设计思想,在当前IoT物联网发展的如火如荼的时代又要被赋予最新的使命了。我十分看好RISC-V的设计思想,也期待着与软件界的Linux一样,发展的繁荣昌盛。

1.1 RISC-V的诞生的时代背景

RISC-V至诞生之日起,就赋予了良好的设计模式,吸收了大量的arm、x86、以及mips中良好的设计基因,将过时指令设计的与架构设计中的坑都避免了。这几十年的芯片的发展过程中,不少的芯片架构都曾因为设计问题消失在历史长河中,有着曾经一度辉煌的sparc,还有当时被十分看好的mips。如今市场上最热门的就属x86和arm了,一个主打移动市场,一个主打pc市场,两个在芯片架构的市场上发展的如火如荼。

然而,两个巨头都牢牢的把控着核心技术的门槛,用arm必须去买ip授权,以及x86的交叉授权模式等等。这些都让很多崇尚开源的人看不下去了。那么设计芯片的指令集很难么?设计芯片的指令并非难事,这要很多人使用才行,因为芯片上需要搭载操作系统,需要去运行各种各样的软件,比如浏览器、数据库、办公系统、专业软件等等。这些适配工作投入的精力和难度恐怕是需要集结各国最强的研发实力才能发展完善的。而risc-v就有这个魔力,竟然可以一呼百应,大概是大家受到arm与因特尔的压迫已经很久了,大家都想自己造芯片玩玩。

arm与x86架构由于时间累计的问题,都积累了大量的指令集,x86当时诞生时不过80条指令,而今也有着上千条指令集了,各种复杂的指令集,多媒体指令集等等,使得写底层软件的人苦不堪言。乔布斯有句名言:至繁归于至简。历史遗留的问题既然不能克服和解决,那就干脆抽取精华,设计出一个优秀的架构出来,于是risc-v在这种时代背景下开始了其新的使命。

1.2 发展现状

新事物的崛起,必会引来众多人的围观,技术的风所到之处,均是机会的影子。

而今risc-v已经成为众多大学生积极学习的课程,各大公司也已经启动了预研和探索的脚步。

RISC-V虽仍是星星之火,却已现出燎原之态。

2.RISC-V 的芯片boot过程

2.1 RISC-V的启动模式

在理解RISC-V的boot流程之前,首先需要知道的是RISC-V设计的三种模式:

  • M-mode(Machine Mode)
  • S-mode(Supervisor Mode)
  • U-mode(User Mode)

对于arm64来说,系统上电后启动会处于EL3 secure world ,所以对于arm64来说,一般都会使用ARM Trusted firmware (TF-A)  在normal world EL2 与 secure EL3  进行切换。

而对于RISC-V来说,系统上电启动后会在M-Mode,而RISC-V目前是没有Hypervisor这一层的概念的,所以目前采用的是opensbi。

2.2 RISC-V的启动顺序

对于标准的RISC-V启动顺序,可查看FU540的芯片手册,其中有如下的顺序描述:

MSEL(Mode Select):启动模式,一般为选择拨码开关等方式进行选择。

ZSBL (Zeroth Stage Boot Loader):片上ROM程序。

FSBL(First Stage Boot Loader ):启动PLLs和初始化DDR内存。

BBL(Berkeley Boot Loader  ):提供加载,并且管理着二进制接口(SBI)。

下面详细分析一下FU540的启动流程。

复位向量表

当芯片上电后,当芯片有33.3MHz外部晶振时钟时,所有的核会跳转到地址0x1004地址处去执行程序。

程序会根据MSEL选择,选择如下的跳转地址:

Zeroth Stage Boot Loader (ZSBL)

零级引导程序加载会从GUID分区中下载更加复杂的FSBI,一般都是QSPI的flash或者sd卡中下载FSBI,然后将该程序放到地址0x08000000处,至于从哪个介质查找FSBI,可以看到如下的选项:

The First Stage Boot Loader (FSBL)

该执行的地址位于L2 LIM,也就是地址0x08000000。该程序的目的是DDR初始化后,将系统在DDR中执行起来。

  • 切换频率到1GHz。
  • 配置ddr pll,外设时钟和控制器等等。
  • 拷贝设备树和SBI固件到DDR中。
  • 跳转到0x80000000开始执行程序。

Berkeley Boot Loader (BBL)

Berkeley引导加载程序(BBL)从位于0x8000_0000的DDR执行。它负责提供管理器二进制接口(SBI)以及模拟所需的任何RISC-V不是由芯片本身实现的指令。该接口可以为Linux等其他的os提供调用接口。

3.什么是SBI?

SBI的全称是RISC-V Supervisor Binary Interface 。它提供了risc-v标准的S-mode OS与Supervisor Execution Environment (SEE)  接口。

一般来说,操作系统都不会直接管理硬件资源,会通过SBI去调用到M-mode。

4.什么是opensbi

简单的说,opensbi就是一个开源的RISC-V虚拟化二进制接口的通用的规范。

使用的是BSD-2的开源协议,也就是任何人都可以随意修改和使用,也提供了通用的规范化的接口实现。

这里就需要理解一下为什么需要规范化了。

以往芯片厂家都会按照自己的启动规则定义一些启动的流程,比如有些需要SPL+UBOOT,有些可以是直接从SPI或SD卡中boot,这些启动的规则很多,每当使用一款芯片,都需要去理解其启动的流程,十分的复杂。于是就出现了一些规则和定义。

比如苹果公司定义了个人PC电脑的规则:

又比如Linux定义了设备规则等等:

而RISC-V虽然目前芯片种类少,但是也需要制定一些启动规则,于是有了下面的规则:

当有了opensbi后,再回头看启动流程,与aarch64之间进行一个对比:

aarch64借助atf框架,从EL3跳转到EL1,并启动u-boot。

对于RISC-V,上图是一个标准的加载启动流程,其中Opensbi提供了M模式的运行时库。

5.openSBI call接口的实现

opensbi不仅仅具有加载和引导功能,也能够供S-Mode的OS使用,比如提供串口控制台或者中断的分发等等。调用方式可以通过ecall来实现。类似于syscall的实现规则。当前阶段实现了下面的接口:

详细可以看下面的官方文档描述。

https://github.com/riscv/riscv-sbi-doc/blob/master/riscv-sbi.adoc

6.总结

RISC-V的启动规范可以按照opensbi的接口实现来自行定义,芯片厂家也可以通过适配opensbi的接口来实现平台通用化的移植,这样将会大大简化上层设计的复杂度。同时规范化的启动流程对于使用者来说更加的友好。相信在这种规范化的模式下,RISC-V的设计将会越来越完善。

1.杨福宇专栏 | 新车用CAN FD,你可能还会被忽悠!

2.中芯国际深夜大瓜:蒋尚义回来梁孟松要走?

3.美国再发实体清单,北理、南航、南理工上榜,“国防七子”终于齐了!

4.分析:全球性芯片缺货超乎想象

5.Windows 拥抱 Android,微软在下怎样的一步棋?

6.散装vs批发谁效率高?变量访问被ARM架构安排的明明白白

免责声明:本文系网络转载,版权归原作者所有。如涉及作品版权问题,请与我们联系,我们将根据您提供的版权证明材料确认版权并支付稿酬或者删除内容。

uboot启动流程概述_关于RISCV启动部分的思考~相关推荐

  1. uboot启动流程概述_uboot 分析之 启动流程

    uboot的启动流程: 看一幅图: 1.第一阶段:start.s的内容: 点击(此处)折叠或打开 #include @该文件是第二步中mkconfig文件执行时创建的.include/config.h ...

  2. uboot启动流程概述_Alibaba Cloud Linux 2 LTS OS 启动优化实践

    Alibaba Cloud Linux 2 (原Aliyun Linux 2)是阿里云操作系统团队基于社区版 4.19 LTS 内核打造的一款针对云产品优化的下一代 Linux 操作系统发行版,不仅提 ...

  3. S3C2440上电启动流程概述

    一.S3C2440的启动方式 1.启动介质 S3C2440在上电时会通过判断OM0和OM1的信号组合来决定指令开始执行的位置(即引导ROM的位置),同时这两个信号也用于决定BANK0(nGCS0)的总 ...

  4. spring启动流程(一):启动流程概览

    1. spring 启动流程概览 在前面 demo 的 main()方法中,有这么一行: ApplicationContext context =new AnnotationConfigApplica ...

  5. netlogon启动后停止_自耦变压器降压启动原理

    变压器起动方式有哪些 1.已运行变压器停下后再启动时,直接空载启动(低压侧负荷先断开):小型变压器一般采用直接启动. 2.新安装的630KVA以上容量宜采用先空载充电三次,检查无异常后再正常投运:超高 ...

  6. mysql 启动 修改密码_基础的启动/停止/重启/密码修改MySQL

    如何启动/停止/重启MySQL 一. 启动方式 1.使用 service 启动:service mysqld start 2.使用 mysqld 脚本启动:/etc/inint.d/mysqld st ...

  7. parallels desktop 启动过失败_使用u启动软件制作启动盘时注意哪些【详细介绍】...

    使用 u盘装系统 已经是大多数电脑装机用户的首选方法 ,但是在使用u盘装系统前需要将u盘制作成启动u盘,而在制作启动u盘时出现的问题总是源源不断,这些问题大多都是因为我们自己的疏忽所造成的.今天IT百 ...

  8. uboot启动流程概述_2017.09版uboot启动过程分析

    2017.9版本uboot启动至命令行几个重要函数为:_start,_main,board_init_f,relocate_code,board_init_r. ? 一 .程序的入口:_start 对 ...

  9. Android Activity的启动流程分析:以Launcher启动一个Activity为例,分析应用进程的创建、Activity的启动,以及他们和AMS之间的交互

    文章目录 一. Step1 - Step 11:Launcher通过Binder进程间通信机制通知ActivityManagerService,它要启动一个Activity: Step 1. Laun ...

最新文章

  1. LeetCode简单题之三角形的最大周长
  2. Arm 十年重磅发布 v9 架构,不受 EAR 约束,未来将覆盖 3000 亿颗芯片
  3. 深入理解Presto(1) : Presto的架构
  4. FAIR 训练 AI 玩拳击,效果堪比真人比赛,试探+周旋+爆头
  5. 微信企业号OAuth2.0授权-Java
  6. 爬虫学习--豆瓣top250
  7. linux下的awk程序执行
  8. 【重磅】ArcGIS 10.8手把手经典图文安装教程(附安装包全套装下载,亲测可用)
  9. 关于eclipse项目红色感叹号的解决办法
  10. WARNING: Your kernel does not support swap limit capabilities. Limitation discarded.
  11. OpenShift 4 Tekton (5) - Task/Pipeline/Workspace/PipelineResource
  12. 027:vue+openlayers加载远程shp数据(示例代码)
  13. VB.net Socket Udp收、发数据包示例源码
  14. Windows常见基本进程八:wuauclt
  15. acme申请证书报错:Please update your account with an email address first.的修复方法
  16. 参加计算机比赛英语,高中英语作文关于电脑比赛的
  17. 【题解】Luogu-P4774 [NOI2018] 屠龙勇士
  18. selenium碰到 href = ‘/‘ 这样的一个链接怎么办
  19. STI解读A:STI测量方法
  20. NYOJ 82 迷宫寻宝

热门文章

  1. 基于Matlab的标记分水岭分割算法(imreconstruct)
  2. stm32核心板可以点亮灯吗_STM32库函数点亮LED
  3. python pandas空值与缺失值处理
  4. 算法工程师和算法框架开发,谁会代表未来?
  5. Markdown基本语法【转】
  6. solr源码分析之solrclound
  7. 代码重构----使用java有限状态机来消除太多的if else判断
  8. 深入redis内部--实现双向链表
  9. 转载--redis密码管理
  10. 字节跳动AI科学家王崇学生时代论文获“时间检验研究奖”