操作系统攻略:自己动手从零开始写操作系统——1.开发环境配置
操作系统攻略这个专栏是为了深入理解操作系统的运行机制所开设,目前计划分为两部分,第一部分是自己动手从零开始写操作系统,这一部分围绕着《操作系统真象还原》一书从零开始打造一个操作系统,第二部分将攻略CS162的Project——pintos。与一般的教程不同的是,本教程将详细刨析过程中的bug,并根据作者自身的经验做额外的补充。在开始前你应该准备好一台已经安装好Linux操作系统的虚拟机,或者直接在
操作系统攻略这个专栏是为了深入理解操作系统的运行机制所开设,目前计划分为两部分,第一部分是自己动手从零开始写操作系统,这一部分围绕着《操作系统真象还原》一书从零开始打造一个操作系统,第二部分将攻略CS162的Project——pintos。与一般的教程不同的是,本教程将详细刨析过程中的bug,并根据作者自身的经验做额外的补充。
在开始前你应该准备好一台已经安装好Linux操作系统的虚拟机,或者直接在Linux环境下开发。注:作者前半部分使用wsl+debian在windows下开发,后半部分作者更改为kali+vm在windows下开发。
前置准备
首先安装build-essential包。
sudo apt install build-essential
build-essentials 包是编译软件所必需的元包。它们包括 GNU 调试器、g++/GNU 编译器集合以及编译程序所需的其他一些工具和库。例如,如果您需要使用 C/C++ 编译器,则需要在开始安装 C 编译器之前在系统上安装必要的元包。安装 build-essential 软件包时,系统上还会安装一些其他软件包,例如 g++、dpkg-dev、gCC 和 make 等。
扩展:GCC、gcc、g++三者之间的关系
gcc(GUN C Compiler)是GCC中的c编译器,而g++(GUN C++ Compiler)是GCC中的c++编译器。
gcc和g++两者都可以编译c和cpp文件,但存在差异。gcc在编译cpp时语法按照c来编译但默认不能链接到c++的库(gcc默认链接c库,g++默认链接c++库)。g++编译.c和.cpp文件都统一按cpp的语法规则来编译。所以一般编译c用gcc,编译c++用g++。
bochs介绍
由于我们写的操作系统需要运行在一台x86计算机上,因此我们需要下载一个能模拟x86计算机硬件环境的模拟器(虚拟机)——Bochs。
Bochs是一个用C++编写的开源模拟器,仅可模拟x86计算机硬件环境,包括CPU、内存、硬盘、显示器、网卡等。能够运行各种不同的操作系统,如DOS、Windows、Linux、BSD等。还支持许多外部设备,如键盘、鼠标、串口、并口等。此外,Bochs还支持多种调试方式,如断点、单步执行、内存监视等。
与之相对还有QEMU。QEMU是一个快速的开源模拟器和虚拟机管理器,能够模拟x86、ARM、PowerPC、SPARC等多种CPU架构。相比bochs,其特点在于它的快速性,能够运行本机代码,实现在模拟器中运行的虚拟机与物理机的速度相当。QEMU还支持各种外部设备,如USB设备、串口、网卡等。此外,QEMU还能够通过GDB、VNC等多种调试方式进行调试。
原书作者使用了Bochs(因为他只会Bochs),所以在这里我们也使用Bochs,而在后面我们攻克pintos时这两种模拟器可以自由选择。
bochs安装
bochs的安装地址:link,也可以选择其他版本,作者建议选择2.6.8版本,因为2.8版本作者遇到了zsh: segmentation fault sudo bin/bochs的错误,没有解决,换到了这个版本才解决的。
我们选择下载tar.gz包自己编译。(下载需要一点魔法,不然会很慢,甚至下载不了)
//首先将下载的包解压
tar xvf bochs-xxx
//然后进入bochs的解压文件目录
cd bochs-xxx
//最后开始编译
./configure \
--prefix=/home/cooiboi/bochs \
--enable-debugger \
--enable-disasm \
--enable-iodebug \
--enable-x86-debugger \
--with-x \
--with-x11 //注意这里是x+数字11而不是ll,如果填写了某些无法识别的配置的话会报configure: WARNING: unrecognized options:xxx的错误
这里我们附上原书的解释:
在这里你可能会遇到ERROR: pkg-config was not found, or unable to access the gtk±2.0 package.的错误,只需要执行sudo apt install libgtk2.0-dev即可解决。
此时我们的文件夹里就有Makefile文件了。
开始编译:
make install
如果失败的话可能有多种原因,例如bochs版本等问题;值得一提的是如果你遇到了报错无法放置文件可能说明你的文件夹权限不足,需要执行sudo chmod 777 文件名来提升权限;如果报如下错误:
mkdir: 无法创建目录 “/usr/local/lib/***”: 权限不够
mkdir: 无法创建目录 “/usr/local/lib/***”: 权限不够
make: *** [install] 错误 1
出现类似错误,文件无法删除或者创建
可以尝试sudo make install来解决。
配置bochs
安装目录默认在/home下面,也可更改,此时我们的安装目录下应该有两个文件:
配置bochs实际上就类似于配置Bios。
引用:我们在开机时按下的 del、csc,或者F2键,各个机型进入BIOS方式有所不同,但差不多就那几种方式。BIOS中会显示各种硬件
的信息,还有启动顺序等。Bochs 既然是模拟硬件的,它就得知道,您需要它模拟的计算机是什么样的,换句话说,在这个虚拟机中有
哪些硬件,启动顺序是什么,是从软盘开始,还是从硬盘开始?人家也得像模像样地跟BIOS 差不多才行。给 bochs配置硬件的方法,是
写一个配置文件给它,boche 启动时会找到此文件,根据文件内容创建自己,这样咱们的虚拟机就健全了。
下面是完整的配置文件,注意路径类的配置需要使用绝对路径。在安装目录下的share/doc/bochs/bochsrc-sample. txt是样本文件,说明了如何配置,但是文件内容很长,关于启动顺序的说明在531行到543行,原书的配置文件会报错。
megs : 512
romimage: file=/home/cooiboi/bochs/share/bochs/BIOS-bochs-latest //注意路径
vgaromimage: file=/home/cooiboi/bochs/share/bochs/VGABIOS-lgpl-latest //注意路径
boot: disk
log: bochs.out
mouse:enabled=0
keyboard:keymap=/home/cooiboi/bochs/share/bochs/keymaps/x11-pc-us.map //注意路径
ata0:enabled=1,ioaddr1=0x1f0,ioaddr2=0x3f0,irq=14
#gdbstub:enabled=1,port=1234,text_base=0,data_base=0,bss_base=0
将此配置文件放在bochs的安装目录下任意位置均可,名字没有要求。
运行bochs
此时我们输入sudo bin/bochs即可运行:
默认是2选项,按回车会询问你配置文件的名字,此时输入我们的配置文件名即可,如果遇到下面这种弹出黑框没有显示,在命令行键入c即可继续运行 :
这里作者直接使用的wsl终端,如果使用别的终端远程连到wsl里面的话会报Message: bochs: cannot connect to X server 127.0.0.1:0.0的错误,因为X server是Linux系统上提供图形用户界面的服务程序。当客户端主机Client访问服务器Server上的图形程序时,需要Server对该Client赋能访问图形程序的权限。
如上图所示会报没有启动盘的错误,因此我们下面要设置启动盘:
这里是命令的解释:
之后我们要将硬盘装到虚拟机里,方式就是通过我们刚刚设置的配置文件,前面我们已经提前添加过了:
ata0-master: type=disk, path="hd60M.img", mode=flat,cylinders=121,heads=16,spt=63
然后执行sudo bin/bochs(如果不使用sudo则最后会报无法打开磁盘的错误)
这里我们发现弹窗的内容和之前的一样,但是命令行中报错的原因不一样了,这就是我们下一篇文章要解决的事情。
总结
至此第一步配置结束,下一部分将是去编写MBR 主引导记录。
更多推荐
所有评论(0)