feat: 添加对内核引导协议的抽象 (#913)

* 添加multiboot header

* head.S传参增加bootloader类型

* feat: 添加引导加载协议的抽象,并为multiboot2实现这个抽象.

* 把framebuffer的映射地址改为从early ioremap和mmio pool分配

* riscv64能运行
This commit is contained in:
LoGin
2024-09-05 21:12:20 +08:00
committed by GitHub
parent cf7f801e1d
commit 2b7818e80e
42 changed files with 826 additions and 1327 deletions

View File

@ -1,12 +1,24 @@
# 引导加载程序
## 原理
## X86_64
  目前DragonOS支持Legacy BIOS以及UEFI两种方式进行启动引导。
- [x] multiboot2
  `head.S`的头部包含了Multiboot2引导头里面标志了一些Multiboot2相关的特定信息以及一些配置命令。
## RISC-V 64
  在DragonOS的启动初期会存储由GRUB2传来的magic number以及multiboot2_boot_info_addr。当系统进入`Start_Kernel`函数之后将会把这两个信息保存到multiboot2驱动程序之中。信息的具体含义请参照Multiboot2 Specification进行理解该部分难度不大相信读者经过思考能理解其中的原理。
DragonOS在RISC-V 64上启动流程为
opensbi --> uboot --> DragonStub --> kernel
这个启动流程使得DragonOS内核与具体的硬件板卡解耦能够以同一个二进制文件在不同的硬件板卡上启动运行。
## 内核启动回调
DragonOS对内核引导加载程序进行了抽象体现为`BootCallbacks`这个trait。
不同的引导加载程序实现对应的callback初始化内核bootParams或者是其他的一些数据结构。
内核启动时,自动根据引导加载程序的类型,注册回调。并且在适当的时候,会调用这些回调函数。
## 参考资料