MiniOS 是一个面向操作系统开发学习者的、微型的操作系统内核,可以运行在32位 x86 架构的 CPU 上。MiniOS 专注于对操作系统开发中的核心概念和基础原理的学习与研究,并基于通用硬件对操作系统中的各基本子系统或模块进行实现。
流行的 Linux 、 FreeBSD 等操作系统内核固然很好,然而它们却并不适合内核开发的初学者。一方面,这些操作系统内核已经发展了很多年,积累了十分庞大的代码量(发布于 2005 年的 Linux 内核早期版本 v2.6.12 就已经有大约 400 万行代码),另一方面,因为应用在生产环境中的需要,这些内核代码中包含了大量和操作系统基本原理无关的细节,初学者很难抓到其中的要领。因此,从一个简单的、代码量较少的操作系统内核入手,使用较短的时间熟悉并掌握操作系统内核开发领域的核心概念和基础原理,等把这些基础性知识掌握到一定程度,再投身于 Linux 等实用内核的开发,对于内核初学者来说是一个比较现实可行的策略。即使不打算从事内核开发,通过一个易于入手的内核学习一些操作系统相关的基础知识,也会有利于写出更健壮、性能更好的应用程序。
MiniOS 主要基于 C 语言和 x86 汇编语言开发,使用的开发工具包括:
其中,Binutils 是一套对二进制文件进行操作的工具集,包括创建静态库的工具 ar,从二进制文件中去除符号表以减小文件体积的工具 strip 等。
MiniOS 当前从软盘中启动,启动流程为:
由于 MiniOS 是一个面向学习者的操作系统内核,因此目前主要运行在虚拟机中,可选的虚拟机有 Bochs 和 Qemu 。
在 Bochs 中运行 MiniOS
sudo apt-get install bochs 进行安装,也可以先下载 Bochs 的源码再进行编译安装,通过源码进行安装可以选择想要的 Bochs 版本。tar zxvf misc/80m.img.tar.gz . ,从硬盘镜像压缩包中解压出硬盘镜像。bochs 命令启动 Bochs 虚拟机,Bochs 首先会从 bochsrc 文件中读取配置信息,然后对 Bochs 给出的运行提示信息进行确认便可让MiniOS 在 Bochs 内运行。在 Qemu 中运行 MiniOS
sudo apt-get install qemu-system-x86 进行安装,也可以下载 Qemu 的源代码进行编译安装。tar zxvf misc/80m.img.tar.gz . ,从硬盘镜像压缩包中解压出硬盘镜像。./launch-qemu.sh 命令启动 Qemu 虚拟机,之后 MiniOS 将直接在 Qemu 内开始运行。Qemu 虚拟机没有使用像 bochsrc 一样的配置文件,配置信息是通过命令行选项指定的,脚本 launch-qemu.sh 中包含了当前使用的配置选项。通过使用 Bochs 或 Qemu 中自带的调试功能可以对 MiniOS 进行汇编语言级的调试,但由于汇编程序比较冗长且难以阅读,这种调试方式使用起来不太方便。幸运的是,Bochs 和 Qemu 中都内置了 gdb 支持,通过和 gdb 提供的远程调试功能配合,可以对 MiniOS 进行 C 源码级的调试。
使用 Bochs+gdb 调试 MiniOS
./launch-bochs-gdb.sh ,所运行的 shell 脚本会在一个新的终端窗口中运行 gdb,并加载 debug 版的内核二进制文件。target remote :2345 和 Bochs 建立连接。使用 Qemu+gdb 调试 MiniOS
./launch-bochs-gdb.sh ,所运行的 shell 脚本会在一个新的终端窗口中运行 gdb ,并加载 debug 版的内核二进制文件。target remote :1234 和 Qemu 建立连接。# 编译 MiniOS 内核和用户程序 init,并写入到软盘镜像 a.img 中
make image
# 清除所有 .o 目标文件
make clean
# 清除所有 .o 目标文件和可执行文件
make realclean