x86架构操作系统内核的实现

首次编辑:24/5/25/16:37
最后编辑:24/5/25/

记录

找不到什么项目干,于是还是想起了自己的一大愿望——写个操作系统。
应该是某个睡前的夜晚,在刷知乎,刷到了关于写操作系统的问题,然后看到了其中的一个回答,这岂不正合我意。
作者也是参考了另一个流传很广的OS制作教程http://www.jamesmolloy.co.uk/,不过这个链接已经失效了,甚至在网上的其它地方都找不到教程的内容。不过后来似乎还是找到了别人在GitHub上的备份https://github.com/NateBrune/jamesmolloy.co.uk/tree/master,不过到找到的时候我也已经不在意这份教程的有无了。

从发现这个教程到成功写出hello world内核,竟然花了整整4天。此博客为记录跟着教程实现操作系统的第一篇,主要记录开发过程中的痛点,其它部分还是参考教程(在下文中有链接)。

环境

qemu的安装

gcc和nasm的安装没啥难度,两个都很轻量级,安措了重装一遍成本也很低。
但对于qemu可就没法随随便便了,上G的玩意儿,装错了可不是闹着玩的。不过最终也还是装错了……

qemu是开源软件,有包管理器安装和源码编译两种安装方式,为了不污染空间捉襟见肘的根目录,我选择了源码编译。

获取qemu源码

首先需要从网上下载源代码,可以选择wget来获取:

wget https://download.qemu.org/qemu-9.0.0.tar.xz

当然也可以选择git clone拉取仓库,这里不表。

下载依赖包并配置

qemu本身也有很多依赖项,这些在qemu的gitlab仓库https://gitlab.com/qemu-project/qemu的README中“Building”一节下的“Additional information can also be found online via the QEMU website:”下面所列出的文档链接中有所涉及。以本博客所使用的Linux平台为例,访问对应的文档https://wiki.qemu.org/Hosts/Linux,在文档中列出了构建qemu所需的包。其中有必须的“Required additional packages”,也有推荐下载的“Recommended additional packages”。

下载qemu源码并解压后,在qemu项目的文件夹下输入:

./configure --enable-sdl

后面的这个--enable-sdl参数至关重要,如果没指定,编译出来的qemu将无法显示虚拟机的界面窗口,参考只有一行VNC server running on ’::1:5900' 没有其他输出

如果中间出现如下错误:

ERROR: Dependency "sdl2" not found, tried pkgconfig and config-tool

需要先装一个sql库:

sudo apt install libsdl2-dev  # 此库一般用于游戏开发,在这里用于为qemu提供虚拟机的界面窗口

然后再执行上面的./configure --enable-sdl指令。如果没报错就表示一切顺利。

源码编译qemu

接着就开始编译qemu了,实际上qemu包含了很多工具,如qemu-system-x86_64用于虚拟x86架构64位的机器。但我们不需要那么多,我们要实现的操作系统运行于x86架构32位的机器,所以我们只需要qemu-system-i386就行了。

make qemu-system-i386  # 只编译qemu-system-i386工具

如果一切顺利,编译后的结果应该会出现在./build文件夹中,我们可以在其中找到qemu-system-i386

测试编译结果

./build中输入:

./qemu-system-i386

如果能够弹出一个窗口,看起来像个电脑显示屏一样显示着一些文字,那么就说明编译成功了。

安装?

在make编译之后,还可以有一个步骤是make install,这将在你的根目录下生成一些文件,让你能够更方便在命令行下使用qemu。但为了照顾空间捉襟见肘的根目录,我没有选择安装。

但若还想要在命令行下随时能够直接用qemu-system-i386使用qemu的话,可以在自己的/home目录下找到隐藏文件.bashrc,新增一行:

export PATH=$PATH:/path/to/your/qemu

其实就是把qemu所在的文件夹加入到环境变量中。

含有GRUB的软盘

制作一个fat12格式的软盘,并将GRUB装入这个软盘,这可能是实现hello world途中消耗时间最多的一步。
然而解决办法也出奇的简单,直接从作者的项目地址中复制一份(名为floppy.img)就可以了。

一开始不知道教程文档旁边就有个GitHub链接,所以虽然作者在文中说可以直接用它做好的软盘的时候,一直在纳闷这软盘从哪里获取,琢磨了很久。还顺便把制作fat12格式软盘、ftp的使用、GRUB的安装都给看了看。

评论