1.bootloader简化
前文介绍了关于boot以及loader这两个工具用来帮助我们进行cpu模式的切换以及内核文件的加载,当初编写这两个程序时主要是模仿《一个64位操作系统的设计与实现》中提到的思路,但是其中的思路太过详细,所以对boot以及loader程序进行简化,合成为一个文件bootloader.s,减少在准备阶段的工作。
本文提到的操作系统代码上传至[Gitee](leafos: my operation system (gitee.com))中欢迎大家学习指教。
在这个版本中我们对于整个操作系统的结构做出一定的规划:
leafos
├── boot
│ ├── bootloader.S
│ └── makefile
├── kernel
│ └── makefile
└── makefile
整体通过根目录下的leafos/makefile来指导整个操作系统内核的编译过程,具体则根据每个文件夹中的makefile来控制每个模块的编译,其中目前尚且只有kernel模块,后续随着操作系统的开发模块数量也将会增加。目前整体的leafos/makefile如下:
system: kernel/kernel.o boot/bootloader.o
dd if=boot/bootloader.o of=system
dd if=kernel/kernel.o of=system bs=512 seek=10
kernel/kernel.o:
cd kernel && make
boot/bootloader.o:
cd boot && make
.PHONY: clean
clean:
find ./ -name "*.o" | xargs rm -f
find ./ -name "*.elf" | xargs rm -f
find ./ -name "*.lst" | xargs rm -f
rm -f system
2.bootloader简化思路
前面我们提到的boot有很大一部分工作都是在寻找以及加载loader,并且loader也有很大一部分是在做同样的工作,那么我们主要就是要简化这两部分。
这里我使用的方法是先估计操作系统整体的大小,然后让bootloader从硬盘上加载固定数量的扇区。只要我们保证bootloader加载的扇区数量大于整个操作系统所占扇区的数量,那么就实现了bootloader的功能。
如图所示,在通电后BIOS会自动将硬盘的第0个扇区加载至内存0x7c00-0x7e00中,我们实现加载功能的代码需要在这第0个扇区中实现。然后则由cpu运行这位于0x7c00-0x7e00内存中的程序,将完整的操作系统文件全部加载进从0x7c00开始的内存中间。具体文件请参考(boot/bootloader.S · circlepath/leafos - 码云 - 开源中国 (gitee.com))。