内核基本环境
和其他的应用一样,内核也需要一些基本的环境才能运行。
不过,与其他应用不同的是,在运行其他应用时,操作系统做了很多工作,因此很多基本的环境都是现成的,而对于内核来说,几乎所有的环境都需要自己来创造。
具体来说,当内核被引导时,我们唯一可以确定的通用寄存器是 pc,包括 sp 在内的其他可写通用寄存器是没有意义的。也就是说,我们甚至没有函数栈。因此,在执行到内核的第一条指令时,我们无法使用任何常规的高级语言,必须使用机器码或者汇编。并利用这些代码设置函数栈。具体请见内核入口部分。
接下来,我们还需要一些处理与硬件相关的支持,具体请见 Supervisor Binary Interface (SBI) 介绍。
然后,我们需要处理特权级机制相关的部分,从 m mode 进入 s mode。
进入 supervisor mode 之后,我们需要初始化内存分配器,为内核的页面分配提供服务。
接着,我们需要设置内核的页表。关于 RISCV 下的 SV39 页表机制,请见页表介绍。