编写操作系统实践001
阶段目的:
整个操作系统的构建环境,工具链,生成方式,整体思路等
一、硬件环境
实践基于x86_64架构,BIOS使用UEFI系统
二、操作系统生命周期规划
POST——UEFI初始化——BOOTX64.EFI(BootLoader)——system.lex——结束
三、工具链
1.BootLoader
UEFI开发有两种框架,一种是Intel维护的EDK2,另一种是GNU的gnu-efi,为了开发方便和支持最新标准,我选择使用EDK2
在Windows下部署EDK2太麻烦,需要先使用VS2013或以下版本的VS工具链来生成EDK2的构建系统,很麻烦,所以BootLoader放到Linux开发
2.内核
在尝试过Grub、Limine、BOOTBOOT等一票Loader之后,发现了以下几个问题:
内核要适配BootLoader
需要把32位代码和64位代码粘合到同一内核文件中,编译器和链接器很难操作
CPU跳转代码需要自己编写,修改映射很麻烦
启动信息数据结构极其抽象,解析很麻烦
所以,内核直接采用VS2022的MSVC工具链生成,这样内核起始地址、栈空间大小、链接关系、与汇编的联合编译等比较***钻的内核配置问题可以直接在项目属性中进行修改
生成的内核是PE格式
四、启动层级划分
五、测试环境
具体代码调试思路:
在VS2022里新开个项目,把内核文件全加进来
new一块大内存空间当作整个硬件的地址空间
伪造启动信息
创建一个main函数,调用内核启动函数
编译生成“能在windows下运行的EXE内核文件”
VS内打断点调试
调试好之后将BootLoader和内核放入启动盘,使用QEMU启动仿真验证代码正确性
六、综述
用EDK2开发BootLoader,VS2022开发内核,BootLoader把启动信息生成好,加载内核文件,展开内核文件成为内核映像,修改硬件页表参数使内核在对应地址运行,找到内核入口函数地址,跳转至内核代码