MdrOS 项目概述
开发操作系统是一个漫长的过程,需要你有一定的计算机底层原理知识以及 C 和汇编语言的基础。 本章教程将教学您如何开发一个 x86 平台的操作系统
该教程有很多不详细之处,并不能直接作为保姆式教程使用
概念
操作系统是一种系统软件,它是控制管理计算机系统的硬软件,分配调度资源的管理者
其内部功能有:
- 内存管理
- 设备驱动
- 中断处理
- 任务调度
- 文件管理
- 网络处理
还有很多,此处不一一列举
计算机启动过程
- 电源键按下
- POST 加电硬件自检
- 加载 BIOS
- 加载引导程序
- 计算机控制权移交给操作系统内核
这样,一个操作系统就算启动了。接下来内核会初始化各种功能以及加载一些必要的设备驱动,具体的启动方式还是要依据该操作系统的架构决定。
环境准备
您需要:
项目结构
在教程中标注的一些函数中,注释会解释该函数原本被定义在哪个源文件内,为了方便理解而写入代码示例中。
我们建议你安排好你的项目结构,以便这些函数的重复利用。
相关文献网站
在开发操作系统的细节部分 (如某些硬盘系统的接口协议) 您可以查阅相关资料。
养成经常查阅资料的好习惯是个不错的选择
教程目录
番外
告诫
- GUI 并不是操作系统必要的功能,一个操作系统可以没有 GUI, 但是其必要实现的功能必须齐全且稳定
- 《30 天自制操作系统》这本书仅供 GUI 部分参考,其他功能实现并不是很好,不建议您全部借鉴
- 64 位长的操作系统会比 32 位保护模式的操作系统实现更难,比如 32 位只需要二级页表即可,64 位需要 4 级甚至更多才能管理所有内存
- ARM 等其他架构的 CPU 与 x86 平台的 CPU 实现截然不同,其中 x86 的很多机制在 ARM 是没有的,同理 ARM 某些机制 x86 也没有
- 本教程只是教学您如何实现一个最简单的宏内核操作系统,如果您想完善您的操作系统,可以去查阅更多的资料
- 操作系统编写好都是要在实体机上测试的,无法在实体机上跑的操作系统就不是一个真正的操作系统
注意事项
WARNING
笔者结合开发过程中发现的实际 BUG,对新手 OS 开发者进行一个警醒作用,避免重复犯同样的错误
4Kib: 可以用十进制
4096
表示,也可以用十六进制0x1000
表示
- cr3 指向的页表基址,必须进行
4k
对齐 - 物理内存管理分配出来的页框基址,必须是
4k
对齐的再写入页 rsp
的栈基址最好为 16 字节对齐,因为部分实体机机型对此有要求- 所有设备驱动需要往
MMIO
设备寄存器传入物理地址。 - 部分实体机的机型对
cpuid
指令的实现有些许差异,编写多核 CPU 初始化等代码时候需要用ACPI
或lapic_id
获取核心的代号,不要用cpuid
指令获取 - 锁不要滥用,否则会发生死锁
- 设备 IRQ 中断请求必须要向中断控制器发送
EOI
代表请求处理完毕,不然下一次设备请求不会再次发送 PS/2
键盘需要在你获取了扫描码后才会发送下一次中断,否则PS/2
控制器会阻塞qemu
VMware
虚拟机对wrfsbase
rdgsbase
等扩展指令支持性较差,建议使用msr
对fs
gs
段寄存器进行操作