riscv linux 参考启动流程

本篇博客涉及到了 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-Mode
    
    U-Mode : 用户程序运行在这个Mode
	S-Mode : OS运行在这个Mode
	M-Mode : A bare metal machine mode,OPENSBI运行在这个Mode

这其中前沿技术 : 虚拟化 和 安全扩展 不在 rsic-v 架构设计范围内
我们需要用软件 提供 虚拟化 和 安全扩展,其中

虚拟化
    由软件 OpenSBI 提供,OpenSBI 是 risc-v 官方提供的
    SBI 意义为 RISC-V Open Source Supervisory Binary Interface
    OpenSBI 运行在 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/4872019
	risc-v 硬件上不提供虚拟化,软件OpenSBI提供虚拟化

安全扩展
    TEE : Trusted Execution Environment
    https://www.trustkernel.com/news/2019/12/31/Penglai-Open-Source.html
	https://github.com/Penglai-Enclave/Penglai-Enclave
	risc-v 硬件上不提供TEE,软件Penglai-Enclave提供虚拟化
    it is based on OpenSBI
    Penglai-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-spl
    2. board-device.dtb
    3. opensbi
    4. u-boot
    5. linux
    6. 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用户进程 开始启动用户相关进程,并为用户提供服务
    
    
注释: 此时三个 运行模式都运行着不同的代码,三套代码时分复用PE
    1. 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 中
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值