
1.2 配置环境
开发一个操作系统需要两种基本的工具:汇编语言和C语言的编译器,以及验证和测试操作系统的模拟器。本书的实验主要是使用现代的工具链从零开始构建一个早期的操作系统内核,所以开发编译的环境就选择了工具链相对丰富的Linux系统和GCC编译器。接下来,先配置开发用的工具链,再配置模拟器。
1.2.1 配置开发环境
本书采用Linux系统作为代码的开发以及构建环境,而构建出来的操作系统需要通过虚拟机进行模拟运行。本节将介绍如何搭建开发环境和运行环境。
在开发操作系统时,我们需要使用GNU bintools来进行源码构建,如as(汇编器)、ld(链接器)等工具,因此本书选择了Ubuntu 20系统作为开发环境。读者可以选择使用其他的Linux系统发行版或者在Windows系统上安装WSL(Windows Subsystem for Linux)。
当构建完成以后,就得到了内核镜像文件。执行镜像文件需要通过虚拟机进行模拟运行,本书所使用的虚拟机主要是 QEMU 或者 Bochs。在Windows、Linux还有macOS等主机上都可以找到它们的安装文件。所以,虚拟机的运行主机环境(无论是Windows还是Linux)都是可以的。
考虑到很多读者的常用PC系统是Windows环境,本节主要介绍WSL的安装方法。WSL作为Windows官方内置的Linux子系统,具有安装方便、占用资源少、拥有高效的文件传输方式等优势,也是笔者在Windows系统上进行开发的主要方式,因此推荐给大家。
WSL为Windows的开发人员提供了一套比较完整的GNU/Linux开发环境,包括了大部分的命令行工具以及应用程序。相比虚拟机运行的模式而言,能够有更好的运行效率。而且,WSL的安装过程相比在VMWare等虚拟机中安装Linux,无疑高效、简单了很多。
WSL的安装对Windows的版本是有要求的:Windows 10系统必须满足2004及更高版本(内部版本是19041或更高版本),或者采用Windows 11系统。读者可以通过“Win+R”键在运行对话框中输入winver命令来查看Windows的具体版本。
在确认Windows版本满足WSL的需求之后,就可以在PowerShell或者cmd的命令行窗口中进行安装了。注意,PowerShell或者cmd需要先使用管理员权限打开。接下来通过执行如下命令来安装WSL:
wsl--install
该命令会下载并安装最新的Linux kernel,并安装Ubuntu作为默认的Linux发行版。安装好WSL之后,读者可以通过在命令行窗口中执行wsl命令来进入Linux系统。第一次安装需要配置Linux系统的环境,这里就不再赘述了。
因为WSL是Windows下的子系统,所以相互之间传送文件是比较容易的,在WSL环境中可以对Windows文件系统的文件直接进行读写。如果想在WSL中访问Windows的文件,例如C盘的文件,则只需要执行“cd/mnt/c/”便可以进入Windows的C盘。如果想在Windows下访问WSL的home目录,只需要在home目录下执行“explorer.exe”即可。在开发内核的过程中,构建的结果可以很容易地在WSL以及Windows主机之间互传。
1.2.2 配置运行环境
操作系统的运行不同于普通应用程序,需要BIOS支持,所以我们在运行与调试自己写的操作系统时需要采用虚拟机进行模拟运行。当系统在虚拟机上验证通过以后,再部署到真实的机器上执行。
目前,常用的虚拟机有VMWare、Virtual PC、QEMU、Bochs等。其中,QEMU和Bochs因为轻便易用,成为开发操作系统的首选。接下来就介绍Bochs和QEMU的安装与使用方式。
首先介绍Bochs。Bochs是一个模拟器,它用纯软件的办法完全模拟x86 CPU和外围设备,所以,Bochs的运行性能相对较差。但也正是因为Bochs是纯软件实现对硬件的模拟,所以使其对操作系统进行代码级的调试变得相对容易。
Bochs是完全开放源码的软件,读者可以通过搜索引擎下载到Windows、Linux等各种版本的二进制安装文件。这就意味着,编译和运行调试可以采用双系统的方式,即在Linux下完成编译,在Windows等图形界面支持比较好的系统上进行调试。
Bochs的安装过程非常简单,只需要一路单击Next按钮即可。需要注意的是,在安装的过程中要选择Full选项,这样DLX Linux Demo才会出现在Bochs的安装目录下。
安装完成以后,在Bochs的安装目录下,可以找到一个名为dlxlinux的文件夹。将这个文件夹复制一份,并且改名为linux011。之后进入这个文件夹,编辑bochsrc.bxrc文件。这个文件是Bochs的配置文件,虚拟机运行所依赖的软盘、硬盘、显卡等信息都可以在这个文件中进行配置。
这个文件的大多数内容都不必修改,关键的配置只有两行。
第一行是floppya:1_44=floppya.img,status=inserted。这一行指定Bochs所使用的虚拟镜像文件,比如,操作系统镜像叫作linux.img,那就需要把这一行中的floppya.img改为linux.img。
第二处需要修改的地方是boot:c。这一行代表了系统要从硬盘启动,因为本书中的实验都是以软盘为基础的,所以应该改为boot:a,这样虚拟机就会从floppya开始启动了。
文件的其余部分暂时保持不变,最终bochsrc.bxrc的内容如下所示[1]:
1 #########################################
2 #bochsrc.txt file for DLX Linux disk image.
3 #########################################
4
5 #how much memory the emulated machine will have
6 megs:32
7
8 #filename of ROM images
9 romimage:file=../BIOS-bochs-latest
10 vgaromimage:file=../VGABIOS-lgpl-latest
11
12 #what disk images will be used
13 floppya:1_44=linux.img,status=inserted
14 floppyb:1_44=floppyb.img,status=inserted
15
16 #hard disk
17 ata0:enabled=1,ioaddr1=0x1f0,ioaddr2=0x3f0,irq=14
18 ata0-master:type=disk,path="hd10meg.img",cylinders=306,heads=4,spt=17
19
20 #choose the boot disk.
21 boot:a
22
23 #default config interface is textconfig.
24 #config_interface:textconfig
25 #config_interface:wx
26
27 #display_library:x
28 #other choices:win32 sdl wx carbon amigaos beos macintosh nogui rfb term svga
29
30 #where do we send log messages?
31 log:bochsout.txt
32
33 #disable the mouse,since DLX is text only
34 mouse:enabled=0
35
36 #enable key mapping,using US layout as default.
37 #
38 #NOTE:In Bochs 1.4,keyboard mapping is only 100%implemented on X windows.
39 #However,the key mapping tables are used in the paste function,so
40 #in the DLX Linux example I'm enabling keyboard mapping so that paste
41 #will work.Cut & Paste is currently implemented on win32 and X windows only.
42
43 #keyboard:keymap=$BXSHARE/keymaps/x11-pc-us.map
44 #keyboard:keymap=$BXSHARE/keymaps/x11-pc-fr.map
45 #keyboard:keymap=$BXSHARE/keymaps/x11-pc-de.map
46 #keyboard:keymap=$BXSHARE/keymaps/x11-pc-es.map
QEMU也是一款模拟器软件,采用动态二进制翻译的技术来模拟不同架构的CPU,并提供对应的硬件设备模型。它能保证运行在其中的客户OS(Guest OS)不用进行修改就能运行。QEMU与KVM技术一起,可以使得Guest OS系统的运行接近物理机的速度。相比Bochs,QEMU的特点是高效、跨平台。
QEMU在Windows上的安装很简单,只需要在QEMU的官网上下载对应的安装文件,并通过QEMU installer安装即可。
安装QEMU之后,打开QEMU所在的文件目录,可以看到有一系列qemu-systemxxx.exe的可执行文件。这些文件对应的是需要模拟的不同架构的CPU类型。本书实验开发的Linux 0.11的镜像文件可以使用qemu-system-x86_64.exe或者qemu-systemi386.exe运行。
读者也可以在Linux环境中进行开发、运行,因此需要在Linux上配置虚拟机,这是一项比较简单的工作。在Linux环境下可以直接使用发行版对应的包管理工具进行安装,下面以Ubuntu为例:
sudo apt install bochs bochs-x
安装完之后可以在任意目录新建bochsrc文件,文件内容可以参考前面的Windows的配置。这里要注意修改romimage和vgaromimage的路径,如下所示:
1 #filename of ROM images
2 romimage:file=/usr/share/bochs/BIOS-bochs-latest
3 vgaromimage:file=/usr/share/bochs/VGABIOS-lgpl-latest
之后就可以直接通过命令“bochs-f bochsrc”运行Bochs。