关于dragonos在riscv上的启动流程的概述

关于dragonos在riscv上的启动流程的概述

dragonos在linux上的启动流程包括以下部分:

DragonStub

DragonStub是依托于uboot提供的efi环境来运行的,它基于linux efi stub,负责把dragonos内核加载到对应的位置。并把FDT传递给dragonos内核。它主要是使得dragonos内核的引导不依赖于具体板卡,不用把设备树编译到内核里面去。

有个视频介绍:

内核head.S

对应的代码在
https://code.dragonos.org.cn/xref/DragonOS/kernel/src/arch/riscv64/asm/head.S?r=5c4224e5a8244cb0fb32512e70354362fccd6321#12

这里主要是设置页表,进一步完成内核自身的重定位,然后进入kernel_main函数。

kernel_main函数

内核启动后位于kernel_main函数。这里所在的现场,在内核启动完成后将成为pid=0的idle线程。

kernel main函数执行的流程中,会在这里初始化pid=1的内核线程:
https://code.dragonos.org.cn/xref/DragonOS/kernel/src/process/kthread.rs?r=f0c87a897fe813b7f06bf5a9e93c43ad9519dafd#266
接着,在这个函数之后,启用了中断,随着时钟中断的到来(或者是因为arch_idle_func里面手动执行调度),就会切换到initial_kernel_thread

然后会进行其余的初始化工作,比如创建kthread daemon等,最后,pid=1的内核线程会转变为第一个用户进程,进入用户态。
https://code.dragonos.org.cn/xref/DragonOS/kernel/src/init/initial_kthread.rs?r=942cf26b48c8b024a6fa7867bb0c8ae39bb1ae09&mo=577&fi=21#26

1 个赞