【方案】Direct Linux boot支持

目标

为了提高DragonOS的启动速度&能在cicd环境里面启动dragonos,我正在添加Direct Linux boot的支持。这项工作最终目的是,能够通过qemu的-kernel参数来启动内核。

现状

x86_64

目前DragonOS在x86_64上,只支持通过multiboot2协议来启动。因此启动的时候必须要有grub2这个引导程序。但是在cicd环境里面,由于loop设备的限制,我们无法挂载loop,自然也没法grub-install,也无法向磁盘镜像的某个分区写入文件。这导致这种情况下,只能制作不包含分区表的磁盘镜像。

因此通过qemu引导的时候,必须要支持-kernel参数来启动。

riscv64

目前DragonOS在riscv上的启动,依赖了uboot提供的uefi环境。
uboot–> DragonStub → DragonOS kernel
如果要能在cicd环境里面启动riscv64的dragonos,自然也需要direct linux boot,并且由qemu提供uefi执行环境。

初步方案

建立“引导协议”的抽象

添加一组用于执行“引导协议相关的解析”的回调函数。并且在内核里面添加一个通用的“引导管理器”,负责在合适的阶段,调用这些回调函数,解析以下信息:

  • 引导程序名字
  • 内核启动参数字符串
  • acpi相关的信息
  • 帧缓冲区相关信息

解析到的信息都保存到BOOT_PARAMS全局变量里面,以便其他模块读取。

添加对legacy multiboot和direct linux boot(32位)的支持

这么做的原因是,qemu -kernel启动的时候会检测内核是否同时支持上述两种启动方式。

  • 在内核里面添加相应协议规定的tag
  • 计划在head.S里面检测引导协议
  • 在内核进入kernel_main之后,根据引导协议的不同,向上文所述的“引导管理器”注册回调函数。
  • 执行“引导管理器”的逻辑,初始化内核启动的参数。

对于riscv64

这个修改应该大同小异,接下来会进一步调研如何实现。
目前想到的是,qemu加载uboot的固件,然后进行直接内核启动。(内核同样也要加相应的tag吧?)

思考:但是dragonos on RISC-V需要UEFI环境的支持,同时也需要内核重定位。离开了DragonStub的话,能正常工作吗?(可能要做点适配)

PR

3 个赞