编写操作系统实践001

kmexec / 2023-05-04 / 原文

阶段目的:

整个操作系统的构建环境,工具链,生成方式,整体思路等

一、硬件环境

  实践基于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把启动信息生成好,加载内核文件,展开内核文件成为内核映像,修改硬件页表参数使内核在对应地址运行,找到内核入口函数地址,跳转至内核代码