Ubuntu18.04安装配置Bochs2.6.9与编译运行GeekOS
安装Bochs2.6.9
下载Bochs2.6.9
进入下载地址
找到bochs-2.6.9.tar.gz并下载保存
解压bochs-2.6.9.tar.gz
可使用命令解压,
sudo tar zxvf bochs-2.6.9.tar.gz
也可以直接鼠标右键选择“提取到此处”
安装Bochs
进入bochs-2.6.9目录
在终端输入下列命令
sudo ./configure --enable-debugger --enable-disasm
sudo make
sudo make install
输入第1行后,可能会报错:
ERROR: X windows gui was selected, but X windows libraries were not found.
那么此时你需要在终端输入:
sudo apt-get install libx11-dev xserver-xorg-dev xorg-dev
完成后再输入第2行和第3行
更多奇葩报错及其解决办法你可以去参考这两篇博客:
https://blog.csdn.net/geeker_12/article/details/11409009
https://blog.csdn.net/aurorayqz/article/details/80310954
启动Bochs
直接在终端输入bochs启动
然后可能会出现如下报错:
Bochs is exiting with the following message:
[ ] .bochsrc:187: cpu directive malformed.
说明是cpu配置问题
那么在终端输入:
bochs -help cpu
会出现:
Supported CPU models:
bx_generic
pentium
pentium_mmx
amd_k6_2_chomper
p2_klamath
p3_katmai
p4_willamette
core_duo_t2400_yonah
atom_n270
然后在终端输入 sudo gedit .bochsrc
大概在187行会找到cpu: model=
将 cpu: model= 后面的部分修改为以上支持的cpu models中的一个
(建议注释原来的而不是删除原来的)
例如:
cpu: model=bx_generic
保存退出
重新运行bochs
又可能会出现错误:
Bochs is not compiled with lowlevel sound support
在终端输入
sudo gedit .bochsrc
大概在915行,注释掉文件中的sound: driver=default, waveout=/dev/dsp. wavein=, midiout=
再次重新运行bochs
成功!!!
配置Bochs
当我们在终端输入bochs后,
Bochs会自己在当前目录顺序寻找以下文件作为默认配置文件:
.bochsrc
bochsrc
bochsrc.txt
bochsrc.bxrc(仅对Windows有效)
我们可以自己创建一个名为bochsrc的文件,来指定Bochs配置我们想要的虚拟机
在终端输入
sudo gedit bochsrc
粘贴以下内容(根据需要自行修改,注意这里要确保romimage和vgaromimage这两项的路径是正确的,不然虚拟机启动时会提示couldn’t open ROM image file的错误):
#################################################################
# Bochs的配置文件
# Configuration file for Bochs
#################################################################
# how much memory the emulated machine will have
megs: 32
# filenameof ROM images
romimage:file=/usr/local/share/bochs/BIOS-bochs-latest
vgaromimage:file=/usr/local/share/bochs/VGABIOS-lgpl-latest
# which disk image will be used 这个是启动软盘
floppya:1_44=a.img, status=inserted
#后面我们会在运行GeekOS时将它改成fd.img
# choose the boot disk 确定启动方式
boot: floppy
# where do we send log messages?
log: bochsout.txt
# disable the mouse
mouse: enabled=0
# enable key mapping ,using US layout as default
keyboard:keymap=/usr/local/share/bochs/keymaps/x11-pc-us.map
保存退出
使用Bochs编译安装运行GeekOS
以下是生成自己的软盘,如果仅为了运行GeekOS这一步可跳过:
(在终端输入:sudo bximage
依次输入:
1
fd
然后一直按回车键即可生成软盘a.img)
安装nasm和下载GeekOS
安装nasm要特别注意安装旧一点的版本,比如2.08.02版本,最新的在后续操作中会产生错误,
首先去下载,选择nasm-2.08.02.tar.gz,下载保存
解压后进入nasm-2.08.02目录
依次输入以下命令:
./configure
sudo make
sudo make install
再在终端输入nasm -version
可以发现为2.08.02
下载GeekOS
直接去GeekOS下载
下载完成后解压
编译GeekOS
进入目录 cd geekos-0.3.0/src/project0/build
终端输入
sudo make depend
sudo make
会报错,其中有一行会显示:cc1: all warnings being treated as errors
Makefile在make时将warnings全部视为了errors
于是我们打开当前目录下的Makefile,
sudo gedit Makefile
找到第149行的-Werror:
CC_GENERAL_OPTS := $(GENERAL_OPTS) -Werror
修改为:
CC_GENERAL_OPTS := $(GENERAL_OPTS)
保存退出,再次sudo make
【笔者第一次尝试时忘记安装nasm,导致此处出现Makefile:177: recipe for target ‘geekos/lowlevel.o’ failed
只能赶快安装nasm,记住一定要安装2.08.02版本,最新的貌似都不支持】
再次sudo make
又出现
对‘__stack_chk_fail’未定义的引用
解决办法是在Makefile文件的第148行 GENERAL_OPTS := -O -Wall $(EXTRA_C_OPTS) 后面添加编译选项
-fno-stack-protector
然后把Makefile文件中的100行至109行修改为如下内容
100 TARGET_CC := $(TARGET_CC_PREFIX)gcc -m32
101
102 # Host C compiler. This is used to compile programs to execute on
103 # the host platform, not the target (x86) platform. On x86/ELF
104 # systems, such as Linux and FreeBSD, it can generally be the same
105 # as the target C compiler.
106 HOST_CC := gcc -m32
107
108 # Target linker. GNU ld is probably to only one that will work.
109 TARGET_LD := $(TARGET_CC_PREFIX)ld -m elf_i386
然后
sudo make clean
sudo make depend
sudo make
会出现
cat geekos/fd_boot.bin geekos/setup.bin geekos/kernel.bin > fd.img
即为编译成功
在终端输入ls -a
进行检查
发现有fd.img以及.bochsrc
此时再修改我们之前创建的配置文件bochsrc中的floppy为fd.img
重新输入bochs运行
仍然会报错
因为此时默认使用.bochsrc,而这里的.bochsrc相当古老,基本没有价值。
所以我们重新在终端输入
bochs -f /home/shane/bochs-2.6.9/bochsrc
也就是在bochs后面加上 -f 刚刚创建和修改的配置文件bochsrc的绝对路径
输入6启动虚拟机调试
你会发现出现了一个黑色的界面,此时回到终端输入c,再回车
就会出现以下界面:
运行成功了!!!
【再次强调,如果出现
Failed assertion in Init_IDT:g_handlerSizeNoErr == g_handlerSizeErr
是因为nasm版本太新的问题只能重新安装2.08.02再次开始以上工作】
由于笔者在完成这项任务时忙于尽快解决问题,所以本篇博客配图极少,只保留了最后的成功结果图,不过如果按照以上步骤来,应该没问题。
部分内容参考了以下博客:
https://111qqz.com/2016/06/geekok-project0/ (这篇博客很有帮助!)
https://blog.csdn.net/ByChen623/article/details/53619084#commentBox