2025-03-24  2025-04-07    1100 字  3 分钟
AOS

当我第一次接触操作系统后, 我就觉得我一定要开发一个属于自己的. 然而当时的我并没有意识到这是一个不见底的深渊

开发平台和环境

始于Debian10, 目前已经Debian12了(这闪电般的开发进度, 不愧是我), 各种工具可以直接使用apt直接安装, 不必担心因为各种操作系统开发书籍和教程里的各种古早的系统版本和工具版本而发愁(我已经帮大家愁完了)

1# 这是Debian12所需安装的, 系统不同可能稍有差异(例如名字不同)
2apt install vim gcc g++ git make nasm gdb dosfstools qemu-system bochs-x

编程语言

  • NASM汇编: 用于boot和loader开发
  • AT&T汇编: 用于内核开发
  • C语言: 用于内核开发

需要注意的是本系列并不会对这三种编程语言做过多讲解, 如果遇到不知道的汇编指令或C语言语法, 自行Google解决, 或者询问AI也很方便

BIOS引导

并没有选择使用UEFI引导, 因为我觉得亲自编写BIOS引导能够让我更加了解操作系统启动时所经过的步骤

FAT32引导分区

我看过的所有关于操作系统编写的书中分区都使用FAT12甚至FAT16, 这种用在软盘上的格式, 真是十分甚至九分的古老. 所以我选择了使用FAT32(代价就是需要自己去了解FAT32分区的结构, 自己编写代码去从FAT32分区中搜索文件并加载到内存)

这FAT32在boot的512字节里真是要了我老命了, 当我第一次写完代码编译出来发现超了512字节, 天都塌了. 只能到处删减, 看看那个汇编指令编译出来占字节多, 想办法用其他的替换掉. 最终, 删掉了boot中FAT查询部分, 默认loader只占用1个簇, 因此如果想了解从FAT32中搜索并加载文件, 需要看loader中的代码.

U盘

大小无所谓, ~~就算你掏出个64M的清华紫光……~~~

U盘是在开发内核且要在物理机上运行系统时需要用到的工具, 后期这个U盘也同时用在了开发和调试过程. 当然, 在开发早期阶段也是可以直接使用U盘替代分区镜像文件

在Linux中可以轻易的使用mkfs.vfat格式化为需要的分区, 也可以使用hexdump快速查看二进制数据, 还可以直接让qemu, bochs, vmware从U盘启动, 快速多平台验证自己的代码是否正常运行.

算法

由于是第一个操作系统, 因此编写过程中并不会使用多么高级的算法(我也不会), 一切为了简单易懂

系统架构

因为常用x86架构, 64位在个人电脑中最为常用, 因此决定编写一个x86_64的系统(这也是个大坑,直接使代码复杂了好多)

单位换算

编程时常用1024进制单位, 请注意与日常生活中的1000进制单位做区分

  • 1024进制: KiB, MiB, GiB, TiB, PiB
  • 1000进制: KB, MB, GB, TB, PB

参考

除另有声明外本博客文章均采用 知识共享 (Creative Commons) 署名 4.0 国际许可协议 进行许可转载请注明原作者与文章出处