相信很多读者都是在校大学生或者一名应用层开发工程师,那么你可能就会问,我又不从事底层开发,以后也很大概率接触不到操作系统内核的知识,有必要深入学习操作系统吗?
答案当然是肯定的,操作系统是所有软件的基础,所有的上层软件都要依赖于操作系统提供各种运行机制。如果仔细观察身边的技术大牛,他们的基本功都是非常扎实,这对他们的技术成长是非常有帮助的。
此外,如果你的简历上说你自己手写了一个操作系统,这必定能给面试官留下很大的加分印象。
首先需要准备一个虚拟机软件(VMWare 或者 VirtualBox),然后就是 linux 操作系统,具体的安装教程可以自行网上搜索。
我这里选择的开发环境是 VMWare + Ubuntu 18.4 + bochs-2.6.2
下载地址: https://sourceforge.net/projects/bochs/files/bochs/2.6.2/bochs-2.6.2.tar.gz/download
/home/book/bochsken
目录下)下载完解压之后,cd 到 bochs-2.6.2
首先是 configure
下面第二行更改成自己的目录,注意
\
前面有一个空格,\
后面不能有空格
./configure \
--prefix=/home/book/bochsken \
--enable-debugger \
--enable-disasm \
--enable-iodebug \
--enable-x86-debugger \
--with-x \
--with-x11
configure 之后执行 make
在编译过程中可能会报错,大家根据自己遇到的错误利用搜索工具解决,我这里列出我遇到的问题以及解决方案
报错 1
cd gui && \
make libgui.a
make[1]: Entering directory '/home/book/bochsken/bochs-2.6.2/gui'
g++ -c -I.. -I./.. -I../iodev -I./../iodev -I../instrument/stubs -I./../instrument/stubs -g -O2 -D_FILE_OFFSET_BITS=64 -D_LARGE_FILES gtk_enh_dbg_osdep.cc -o gtk_enh_dbg_osdep.o
gtk_enh_dbg_osdep.cc:20:10: fatal error: gtk/gtk.h: No such file or directory
#include
^~~~~~~~~~~
compilation terminated.
Makefile:104: recipe for target 'gtk_enh_dbg_osdep.o' failed
make[1]: *** [gtk_enh_dbg_osdep.o] Error 1
make[1]: Leaving directory '/home/book/bochsken/bochs-2.6.2/gui'
Makefile:323: recipe for target 'gui/libgui.a' failed
make: *** [gui/libgui.a] Error 2
解决方法
sudo apt-get install xorg-dev
# 这里如果出现:E: Unmet dependencies. Try 'apt --fix-broken install' with no packages (or specify a solution).
报错 2
根据问题提示信息,是由于所依赖的包 linux-image-4.10.0-35-generic
并没有被正确安装导致。linux-image-x.x.x
是内核文件,从提示信息上看,应该是升级过程中断导致的问题。查看内核当前版本信息发现当前运行的版本为 4.18.0-15-generic
。确实与提示的内核信息不一致,确认了问题所在。
book@100ask:~/bochsken$ uname -r
4.18.0-15-generic
解决方案
根据提示信息,运行 apt-get -f install
来修复问题
接下来我们执行修复命令,并重新执行更新和升级,确保完整修复问题。
sudo apt-get install libgtk2.0-dev
sudo apt --fix-broken install
sudo apt-get update
sudo apt-get upgrade
sudo make dist-clean 一定要清除干净
报错 3
通过上面一系列修复后执行 make
又有新的问题,解决方案可 参考
/usr/bin/ld: gui/libgui.a(gtk_enh_dbg_osdep.o): undefined reference to symbol 'pthread_create@@GLIBC_2.2.5'
/usr/bin/ld: /lib/x86_64-linux-gnu/libpthread.so.0: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
make: *** [Makefile:179: bochs] Error 1
打开 Makefile,在92行左右找到 LIBS = 。。。
一行,在这一行最后面添加 -lpthread
LIBS = -lm 。。。-lpthread
#修改完后如下:
92 LIBS = -lm -lgtk-x11-2.0 -lgdk-x11-2.0 -lpangocairo-1.0 -latk-1.0 -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lpangoft2-1.0 -lpango-1.0 -lgobject-2.0 -lglib-2.0 -lfontconfig -lfreetype -lpthread
重新 make
make 结束且未报错后,执行 sudo make install
如果把库都补齐了,这步基本顺利通过
安装成功的标志:生成了 bin 文件夹 (在自己定义的安装目录下 /home/book/bochsken
)
boot.disk
文件,并将下面配置复制粘贴进去,注意将相应目录改成自己设置的目录注意书上的这部分代码是有误的。
# 设置 Bochs 在运行过程中能够使用的内存,本例为 32MB
megs: 32
# 设置对应真实机器的 BIOS 和 VGA BIOS
romimage: file=/home/book/bochsken/share/bochs/BIOS-bochs-latest
vgaromimage: file=/home/book/bochsken/share/bochs/VGABIOS-lgpl-latest
# 设置 Bochs 使用的磁盘
# floppya: 1_44=a.img, status=inserted
# 选择启动盘符
# boot: flopy # 默认从软盘启动
boot: disk # 从硬盘启动,我们的任何代码都将直接写在硬盘上,所以不会再有读写软盘的操作。
# 设置日志文件输出
log: bochs.out
# 关闭鼠标,打开键盘,按照书上写会报错
mouse: enabled=0
#keyboard: enabled=1,
keyboard: keymap=/home/book/bochsken/share/bochs/keymaps/x11-pc-us.map
# 硬盘设置
ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
# 增加 Bochs 对 GDB 的支持,GDB 远程连接到此机器的 1234 端口便可调试
# gdbstub: enabled=1, port=1234, test_base=0, data_base=0, bss_base=0
book@100ask:~/bochsken$ ./bin/bochs -f boot.disk
注意本文使用的配置文件名是 boot.disk,下图是之前学习时截图的,所以看到是
bochsrc.disk
。
到目前为止环境已经基本搭建完成了,接下来可以感受操作系统的乐趣啦!!!建议自己亲自手动操作一遍, 这样可以锻炼自己的解决问题能力。
参考《操作系统真象还原》
更多读书笔记WX搜索: 零K同学