花了半年时间写了一个小的单地址空间内核,用当下流行的词汇就是unikernel,就是没有用户空间只有内核空间的内核。这样做的好处就是简单,很多事都可以简化。这个内核放在github上,地址为https://github.com/jianyongwu/horos。从本文起就开始总结一下写内核的历程,虽然写的很烂,不足以拿出来示人,但是总觉得半年的功夫还是要总结一下的。这个内核相当简单,由于本人水平实在有限,里面有很多问题,希望读者。
这个内核我叫它horos,来由无所谓了。不多说,开始准备吧。
我自己有一台很老的x86电脑,32位机,装了Ubuntu就开始写了,正好几乎所有教人写内核的书都是基于32位,不过经过改造,在64位机上也是可以运行和正常编写的。所以只要有一台x86机器,无论32位还是64位都行。系统的话最好是Ubuntu 16.04,因为我就是在这个系统下写的,此外还要装上两个虚拟机软件,bochs和qemu。安装方法如下:
apt install -y bochs bximage qemu
操作系统都是直接运行在硬件上的,我么要频繁启动内核来验证我们的正确性,使用硬件太麻烦了,因此一般写内核都在虚拟机里,qemu和bochs就是模拟硬件的虚拟机软件。在虚拟机里运行相当于运行在硬件上。
先给自己建一个目录吧,我喜欢在root下面做事,使用root用户,反正电脑是我的。就叫horos吧。
然后就要建一些必须的文件。一般的书上都喜欢用bochs,因为他调试方便,但是我喜欢qemu因为它简单,bochs用来调试。bochs稍微麻烦一点,得有一个配置文件,我就把我的贴出来:
################################################
#configure file for Bochs
################################################
# how much memory the emulated machine will have
megs: 1024
# filename of Rom images, 注意下边要根据你安装目录来调整
romimage: file=/usr/share/bochs/BIOS-bochs-latest
vgaromimage: file=/usr/share/bochs/VGABIOS-lgpl-latest
#what disk images will be used
floppya: 1_44=a.img, status=inserted
ata0-master: type=disk, path="c.img", mode=flat
#ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
#choose the boot disk.
boot: disk
#where do we send log messages?
log: bochsout.txt
#disable the mouse
mouse: enabled=0
# enable key mapping, using US layout as default.
keyboard_mapping: enabled=1, map=/usr/share/bochs/keymaps/x11-pc-us.map
这个文件的名字最好就叫:bochsrc.bxrc。
还需要一个硬盘镜像文件当我们的硬盘用。直接执行命令bximage就行,根据提示一步步走,一般重要的就只是选择fd还是hd,我选hd,还有硬盘大小,那个是以M为单位,其他的比较简单。建好之后就会多出一个以.img结尾的文件,那就是我们的硬盘,以后kernel就要放在这里面。有了基本的环境就可以试试horos了。
git clone https://github.com/jianyongwu/horos
cd horos
./run.sh
应该能看到一个窗口:
那些command list都是可以运行的命令,键入命令后回车,其中echo和snow都需要一个参数,其他直接运行。这是一个交互界面,一个简单的shell。本系列就是一步步展示这个内核是怎么写出了的。