关于dragonos在riscv上的启动流程的概述
dragonos在linux上的启动流程包括以下部分:
DragonStub
DragonStub是依托于uboot提供的efi环境来运行的,它基于linux efi stub,负责把dragonos内核加载到对应的位置。并把FDT传递给dragonos内核。它主要是使得dragonos内核的引导不依赖于具体板卡,不用把设备树编译到内核里面去。
有个视频介绍:
内核head.S
这里主要是设置页表,进一步完成内核自身的重定位,然后进入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