前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >关于dragonos在riscv上的启动流程的概述

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

作者头像
灯珑LoGin
发布2024-05-02 13:32:27
1080
发布2024-05-02 13:32:27
举报
文章被收录于专栏:龙进的专栏

关于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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024年5月1日20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 关于dragonos在riscv上的启动流程的概述
    • DragonStub
      • 爆肝!【DragonStub】可引导任意OS内核,使嵌入式OS内核与具体板卡解耦。_哔哩哔哩_bilibili
    • 内核head.S
      • kernel_main函数
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档