本篇博客涉及到了 riscv 从0开始 到 linux 启动成功的流程,涉及到以下标准The Standardized Boot flow for RISC-V Platforms :              http://crva.ict.ac.cn/crvs2020/index/slides/3-8.pdf
本博客从以下角度分析启动历程1. risc-v 的运行模式2. 芯片启动配置3. 非易失性存储器的镜像布局4. risc-v 的启动流程5. 易失性存储器的镜像布局

risc-v的运行模式

risc-v 支持 三种运行模式U-Mode S-Mode M-ModeU-Mode : 用户程序运行在这个ModeS-Mode : OS运行在这个ModeM-Mode : A bare metal machine mode,OPENSBI运行在这个Mode这其中前沿技术 : 虚拟化 和 安全扩展 不在 rsic-v 架构设计范围内
我们需要用软件 提供 虚拟化 和 安全扩展,其中虚拟化由软件 OpenSBI 提供,OpenSBI 是 risc-v 官方提供的SBI 意义为 RISC-V Open Source Supervisory Binary InterfaceOpenSBI 运行在 M-Mode,在OS(运行在S-Mode)之下RISC-V start from M-Mode, A bare metal machine mode.在启动时 , OpenSBI switch into S-Mode from M-Mode for non-hypervisor world.相当于 ARM64 的Hypervisor/EL2 层,这一层在ARM64中是由硬件提供的,而在RISCV中,是由硬件提供的System call type interface layer between Firmware runtime, M-Mode to Operating system, S-Mode.opensbi 能编译出三种固件(FW_PAYLOAD FW_JUMP FW_DYNAMIC), 用于不同的启动方式https://my.oschina.net/u/4239621/blog/4872019risc-v 硬件上不提供虚拟化,软件OpenSBI提供虚拟化安全扩展TEE : Trusted Execution Environmenthttps://www.trustkernel.com/news/2019/12/31/Penglai-Open-Source.htmlhttps://github.com/Penglai-Enclave/Penglai-Enclaverisc-v 硬件上不提供TEE,软件Penglai-Enclave提供虚拟化it is based on OpenSBIPenglai-Enclave 运行在 M-Mode,在OS(运行在S-Mode)之下,在OpenSBI(运行在M-mode)之上

芯片启动配置

一般芯片内置srom和sram,srom中有软件代码,被称为bootrom
bootrom中会做一些 非易失性存储器的初始化// 主要是为了读取SPL代码// SPL代码是板卡用户可配置的一般用于被bootrom加载的代码// second program loader 第二阶段 程序加载器 ,说明其是第一阶段// 根据 The Standardized Boot flow for RISC-V Platforms, SPL 由 U-boot-SPL 提供// SPL代码一般有大小限制(一般不会超过8KB)
bootrom中会读取 启动配置,并决定从哪种非易失性存储器读取SPL// 启动配置为几个引脚// ax45mp 数据手册中没有 启动配置 的引脚,但说了可以通过设置每个核心的 reset vector 寄存器的值// 问题是 设置该寄存器需要代码,但是 该寄存器的值 就是 读取代码的位置// 鸡生蛋与蛋生鸡的问题. 估计数据手册没有暴漏,或者是写死的.// 例如 ax45mp VCU118 被配置为 从 SPI1 连接的 2MB的 QSPI Flash 启动// SP1 AHB memory 被映射到了 0x8000 0000 - 0x87FF FFFF

非易失性存储器的镜像布局

根据 The Standardized Boot flow for RISC-V Platforms 以及 linux启动流程,我们需要以下镜像文件1. u-boot-spl2. board-device.dtb3. opensbi4. u-boot5. linux6. rootfs
u-boot-spl       在 启动配置选取的非易失性存储器A的指定位置(数据手册)
board-device.dtb 在 非易失性存储器B的某个位置(由u-boot-spl指定)
opensbi          在 非易失性存储器C的某个位置(由u-boot-spl指定)
u-boot           在 非易失性存储器D的某个位置(由u-boot-spl指定)
linux            在 非易失性存储器F的某个位置(由u-boot指定)
rootfs           在 非易失性存储器G的某个位置(由u-boot指定)
注意 : 非易失性存储器A B C D E F G 可以为同一个,也可以不为同一个

risc-v 的启动流程

上电,pc处于system memory map中的bootrom中前沿位置,运行模式为M-mode
01. bootrom 根据 拨码开关 去定位 u-boot-spl 在哪里,并加载 u-boot-spl 到 ilm
A1. u-boot-spl XIP运行,或者被bootrom搬到某个 memory地址开始执行
A2. u-boot-spl 初始化 非易失性存储器B/C/D , 初始化 ddr
A3. u-boot-spl 从 非易失性存储器B 加载 board-device.dtb 到 ddr
A4. u-boot-spl 从 非易失性存储器C 加载 opensbi          到 ddr
A5. u-boot-spl 从 非易失性存储器D 加载 u-boot           到 ddr
A6. 跳转到 opensbi
B1. opensbi    根据 board-device.dtb 初始化 domain 和 platform , 并 对设备树进行fix_up处理
B2. opensbi    切换到 S-mode , 跳转到 U-boot
C1. U-boot     根据 fix_up 后的 设备树 初始化 platform , 并 对设备树 再次 fix_up
C2. U-boot     从 非易失性存储器D 加载 linux           到 ddr
C3. U-boot     跳转到 linux
D1. linux      创建页表,开MMU,创建物理内存管理机制和虚拟内存管理机制
D2. linux      初始化调度器,将自己(standalone)与init_task绑定
D3. linux      创建 kernel_init 内核线程,并开启调度
D4. linux      中的 kernel_init 根据 fix_up 后的设备树 对platform 初始化
D5. linux      中的 kernel_init mount 真实文件系统(上面提到的rootfs)
D6. linux      中的 kernel_init 调用 run_init_process 更改 1号进程的PCB相连的thread_info中的相关寄存器为U-Mode,并主动调度
D7. linux      中的 1号调度实体(init用户进程) 被调度回来,即进入U-mode
E1. init用户进程 开始启动用户相关进程,并为用户提供服务注释: 此时三个 运行模式都运行着不同的代码,三套代码时分复用PE1. U-Mode  用户进程2. S-Mode  linux代码  // 为 用户进程提供服务// (最开始在S-mode运行的u-boot-probe 已经不在了)3. M-Mode  OpenSBI// 像 linux为用户进程提供服务一样 , 为 linux 提供服务// 最开始在 M-mode 运行的 U-boot-spl 和 bootrom 已经不在了// 运行在 M-mode 的软件只能是SBI实现,现在有很多官方实现(多的吓人)

易失性存储器的镜像布局

u-boot-spl                                           在 SRAM 或者 FLASH(XIP) 上
board-device.dtb&opensbi&u-boot&linux               在 sdram/ddr/ddr2/ddr3/ddr4 中
rootfs中的 super_block&dentry&inode&buffercache 缓存 在 sdram/ddr/ddr2/ddr3/ddr4 中

riscv linux 参考启动流程相关推荐

  1. Linux的启动流程(CentOS 6)

    前言 Linux启动的过程在实际生产中有着至关重要的作用.试想一下,如果我们在实际生产中服务器因为某一个服务出了问题,而不能启动,这时我们应该怎么办.如果我们了解Linux的详细启动过程,知道是在哪一 ...

  2. Linux驱动(4)--Linux的启动流程

    Linux的启动流程 1.Linux的启动流程概述 2. 从串口打印日志中分析 3. 以Exynos 4412启动流程为例 1.Linux的启动流程概述 ARM Linux 的启动流程大致为:Uboo ...

  3. Linux开机启动流程分析

    Linux开机启动十步骤 收藏分享2012-2-6 11:15| 发布者: 红黑魂| 查看数: 1366| 评论数: 0|来自: 比特网 摘要: 开机过程指的是从打开计算机电源直到LINUX显示用户登 ...

  4. Linux SMP启动流程学习(三)

    Linux SMP启动流程学习(三) 4 构建CPU拓扑关系 4.1 创建调度域拓扑关系-sched_init_domains() 在系统启动开始的时候就开始构建CPU的拓扑关系,具体流程如下: [s ...

  5. 【内核】linux内核启动流程详细分析【转】

    转自:http://www.cnblogs.com/lcw/p/3337937.html Linux内核启动流程 arch/arm/kernel/head-armv.S 该文件是内核最先执行的一个文件 ...

  6. 【内核】linux内核启动流程详细分析

    Linux内核启动流程 arch/arm/kernel/head-armv.S 该文件是内核最先执行的一个文件,包括内核入口ENTRY(stext)到start_kernel间的初始化代码, 主要作用 ...

  7. I.MX6 Linux Qt 启动流程跟踪

    /*************************************************************************** I.MX6 Linux Qt 启动流程跟踪* ...

  8. Linux的启动流程简析(以Debian为例)

    Linux的启动流程简析(以Debian为例) 正文: 前面的文章探讨BIOS和主引导记录的作用.那篇文章不涉及操作系统,只与主板的板载程序有关.今天,我想接着往下写,探讨操作系统接管硬件以后发生的事 ...

  9. linux的启动流程和加载程序

    linux的启动流程和加载程序 先来了解一下整个过程,大致知道linux是怎么启动的. 启动时要加载内核,让内核来驱动硬件,这样才算是一个真正的操作系统 但内核启动前是要做一些其它工作的.启动过过程如 ...

最新文章

  1. ASP.NET防止按F5键造成表单重复提交
  2. 大数据入门第五天——离线计算之hadoop(上)概述与集群安装
  3. 用grub4dos修复grub
  4. MySQL : 报错:1130-host ... is not allowed to connect to this MySql server 开放mysql远程连接 不使用localhost...
  5. linux检查swap配置,Linux环境下swap配置方法
  6. 中易广告联盟v9/黑色高端/模板 团队介绍网站
  7. (大数据工程师学习路径)第五步 MySQL参考手册中文版----MySQL视图
  8. 普通函数的调用和函数指针的回调
  9. Call to localhost/127.0.0.1:9000 failed on connection exception:java.net.ConnectException的解决方案
  10. HelloKafka入门 helloKafka
  11. 记一次内存无法回收导致频繁fullgc机器假死的思路
  12. websocket动态添加广播路径_数据可视化WebSocket实现聊聊我的实现思路
  13. 麒麟Linux启动目录,优麒麟目录结构介绍 系统入门必备
  14. Games101-课程15笔记
  15. Linux搭建eureka集群,基于dns搭建eureka集群
  16. 2022-2028年全球与中国端点保护平台(EPP)行业市场深度调研及投资预测分析
  17. 软件设计师-操作系统知识
  18. JAVA开发基础之使用IDEA导出JAR包
  19. 加入域提示“不能访问网路位置” 的解决方法
  20. 关于MFC程序中隐藏任务栏图标的问题

热门文章

  1. 【Unity3D】调整屏幕亮度、饱和度、对比度
  2. android菜谱app设计方案,Android菜单设计指南(上)
  3. unity小游戏---跑酷游戏
  4. 分享一些Linux命令实用小技巧,欢迎评论区补充
  5. 回顾光影先锋发展史(2)-佳能
  6. 电力三维可视化是如何实现的
  7. Python接口开发实现步骤详解
  8. 怎么用PHP判定奇偶性,函数奇偶性的判断口诀
  9. yolov5+tensorrt8 C++部署加速
  10. 凸边形对角线交点问题