开坑: A Bootloader For Loongson based on Linux Kernel

最近给自己坑开的有点多了,尽管如此还是想再开个坑。

前言

龙芯目前主要在用两种Bootloader,PMON和昆仑固件。PMON之烂,大家有目共睹。昆仑固件又不开源,要给龙芯整一个好用的Bootloader的想法在我心中萌发已久,但是实现一个Bootloader的难度我也是清楚的,所以一直没有付诸实施。 在Phoronix上偶然看到了LinuxBoot的新闻,被他使用Linux Kernel作为Bootloader基础框架,使用kexec loadelf来引导下一阶段操作系统的思路震惊了。回头一想,这个思路在龙芯上可行性也非常高,并且可以利用现有的驱动而避免实现很多高级的外设驱动,降低难度。同时也能有个比较“Fantacy”的GUI界面。

架构

Boot主要应该被分为四个阶段。

In Flash Early Init –> Late C Init –> Kernel – > RootFS (–> Kexec)

In Flash Early Init

顾名思义就是在Flash里的早期初始化阶段,主要初始化内存,TLB等设备。随后会把自己的代码和Late C Init需要的代码Relocate到内存中。

Late C Init

初始化一些晚期设备,填入memory map等基本的boot_param参数,并且使用SFUD库操纵SPI Flash,从SPI Flash内读出vmlinuz.bin 加载并执行。

Kernel

最小编译,内嵌rootfs的vminuz.bin,起来之后自己加载rootfs。 只保留 USB PCI-E SATA NET这些基本组件。 把一整个boot_param table通过procfs引出,方便rootfs写入。

Rootfs

自动挂载所有可用block device,一个个去找bootcfg.json,列入表格。 GUI与命令行两用设置界面。 同时通过SPI写一些NVRAM变量方便前面的Stage读取。 kexec执行。

Licensed under CC BY 4.0
comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy