内核运行时模块-axruntime
axruntime作为内核运行时模块,统筹了其他所有的内核模块。根据内核模块依赖图可知,runtimer模块是最上层的模块,它更多的是调用其他模块对外提供的接口来启动内核,并没有过多的新增功能,因此我们仅在这部分简单阐述Starry内核的启动流程。
详细代码参见axruntime/src/lib.rs:107,其启动流程如下:
- 实现alloc trait,从而实现全局分配器
- 建立内核地址空间,划分地址段
- 初始化平台配置,包括多核CPU定义的初始化
- 建立内核进程,初始化建立idle task和gc task,启动任务调度序列
- 启动外置驱动,包括fs、display、net
- 若有多核则启动多核入口函数
- 初始化时钟中断处理函数
- 运行主核的主函数,即运行指定的应用程序
比赛时需要有几点注意的地方:
- 为遵循比赛需求,starry需要读取外部测例镜像。但由于SD卡镜像读取驱动较为复杂,因此比赛中默认将已有的SD卡镜像通过网络传输的方式传递到实际板子的
0x90000000物理地址处。因此设置内核地址空间时,需要将这段空置出来。当前Starry默认启动的物理内存占用为[0x8000_0000,0x8800_0000)与[0xa000_0000, 0xc000_0000)。对应的特殊处理在axhal/src/platform/qemu_virt_riscv/mem.rs中。 - 实际上板时,由于fu740不存在virt-io设备,因此需要注意不能直接将虚拟设备进行初始化,否则可能出现问题。