RISC-V CPU加电执行流程 (2)

3)U-Boot中还有操作Flash等板子上硬件的驱动。例如串口要打印,ping网络成功,擦除、烧写flash是否成功等。

4)U-Boot还得提供一个命令行界面供人来操作。很简单,至少你能看到。

 

1.7 什么是SBI和OpenSBI(Open Supervisor Binary Interface)

SBI是一种接口规范,提供了RISC-V标准的S-mode OS与M-mode的SEE(Supervisor Execution Environment)的接口,一般来说操作系统不会直接接触硬件,而是通过调用SBI的接口。

Open正如其名,是一个开源的SBI具体实现,通过遵守开源协议,任何用户都可以修改和使用。

有了OpenSBI和U-Boot加持,大致启动流程变为下图:

RISC-V CPU加电执行流程

OpenSBI的初始化流程如下:

(1)底层初始化:

判断hart(Hardware Thread) id

代码重定位(判断_load_start与_start函数是否一致)

清除除保存设备树地址的寄存器的值

清除bss段

设置栈指针(预留栈空间)

读取设备树中的设备信息

设备树重定位,为U-Boot提供信息

至此,底层初始化结束,执行sbi_init,进行正式的初始化程序

 

(2)设备初始化:

       首先判断是通过S-mode还是M-mode启动

sbi_domain_init 初始化动态加载的镜像的模块

2.sbi_platform_early_init 平台的早期初始化

3.sbi_console_init 控制台初始化,从这里开始,就可以使用串口输出了。

4.sbi_platform_irqchip_init        irq中断初始化

5.sbi_ipi_init    核间中断初始化

6.sbi_tlb_init    mmu的tlb表的初始化

7.sbi_timer_init    timer初始化

8.sbi_hsm_prepare_next_jump   准备下一级的boot

 

(3)二级boot跳转,如加载U-Boot或者Linux内核

 

1.8 详细解读RISC-V的启动模式

M-mode(Machine Mode

M-mode是最底层的模式,也是每一个标准 RISC-V 处理器必须要实现的模式,它拥有最高权限,这意味着他将使用物理地址直接运行在硬件上。当cpu加电后,将处于M-mode。


机器模式具备拦截和处理异常的能力,并且可以访问所有其他模式下的控制状态寄存器CSR (Control Status Register)。

 

下表是对 RISC-V 机器模式下的控制状态寄存器的汇总:

 

寄存器

 

功能简要说明

 

Machine ISA Register (misa)

 

用于指示当前处理器所支持的指令集模块

 

Machine Vendor ID Register (mvendorid)

 

用于指示供应商 ID 的寄存器

 

Machine Architecture ID Register (marchid)

 

处理器核架构编号

 

Machine Implementation ID Register (mimpid)

 

提供了处理器实现版本的唯一编码

 

Hart ID Register (mhartid)

 

运行当前代码的硬件线程(hart)的 ID

 

Machine Status Registers (mstatus and mstatush)

 

机器模式下的状态寄存器

 

Machine Trap-Vector Base-Address Register (mtvec)

 

配置发生异常后的入口地址

 

Machine Trap Delegation Registers (medeleg and mideleg)

 

机器异常委托寄存器和机器中断委托寄存器

 

Machine Interrupt Registers (mip and mie)

 

控制中断使能与查询中断的状态的寄存器

 

Hardware Performance Monitor

 

硬件性能监控的CSR寄存器,用于监控CPU的内部运行情况。

 

Machine Counter-Enable Register (mcounteren)

 

控制计数器的可访问性。读或写这个寄存器的行为不会影响底层计数器。

 

Machine Counter-Inhibit CSR (mcountinhibit)

 

控制计数器是否递增

 

Machine Scratch Register (mscratch)

 

用于机器模式下临时性的保存某些数据

 

Machine Exception Program Counter (mepc)

 

用于保存进入异常前的指令的 PC

 

Machine Cause Register (mcause)

 

用于保存进入异常的原因

 

Machine Trap Value Register (mtval)

 

用于保存进入异常时的地址或者指令

 

 

S-mode(Supervisor Mode

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgzzjw.html