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

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

DragonStub

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

有个视频介绍:bilibili.com

爆肝!【DragonStub】可引导任意OS内核,使嵌入式OS内核与具体板卡解耦。_哔哩哔哩_bilibili

罚坐三个星期,经过各种调研和尝试,最终实现了DragonStub这个四阶段引导方案,使得RISC-V上面的OS内核不用与具体板卡耦合,能够“一次编译,到处分发”。开源仓库: https://github.com/DragonOS-Community/DragonStub, 视频播放量 5870、弹幕量 5、点赞数 193、投硬币枚数 89、收藏人数 206、转发人数 16, 视频作者 灯珑LoGin, 作者简介…

内核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

你也可能喜欢

发表评论