# 系统启动

## SBI（bootloader）

SBI是RISCV独有的东西，其他架构没有这个概念。SBI实现有很多种，例如opensbi和rustsbi，这两种我们都进行了尝试，在qemu中调试的时候两种都进行了实验，最终在上板子的时候，我们选择了rustsbi。SBI运行在M-mode，它实现的一些功能为运行在 S-mode 上的操作系统提供服务。例如，我们要向串口输出一个字符，可以直接用SBI的Putchar，而无需自己手动设置硬件。

## riscv特权等级

RISCV分为三个特权等级：
U态：用户态
S态：操作系统使用的状态
M态：SBI使用的状态，拥有最高权限，可以直接访问硬件


## 启动流程

K210开发板启动过程中会首先加载bootloader，即上文所述的SBI，SBI进行设备扫描等各种操作之后就会跳转到0x80200000这个地址，CPU从M态转换到S态，我们只要将我们的操作系统的第一行代码放在这个位置即可。

我们系统启动首先需要解决的问题是内存的地址转换，为了方便，内核地址空间我们直接使用偏移量进行了映射（此处参考了ucore)，使用汇编构造一个简单的大页表，然后把这个页表地址放到页表基址寄存器，就完成了内核的初始映射。然后就可以到main函数里面，进行物理内存、文件系统等各种初始化了。



-----------------

By：PeaceSheep

2022.06.05