《ORANGE’S:一个操作系统的实现》一书中选择使用虚拟计算机Bochs进行仿真。
Bochs是一个x86硬件平台的开源模拟器。它可以模拟各种硬件的配置。Bochs模拟的是整个PC平台,包括I/O设备、内存和BIOS。甚至可以不使用PC硬件来运行Bochs。事实上,它可以在任何编译运行Bochs的平台上模拟x86硬件。通过改变配置,可以指定使用的CPU(386、486或者586),以及内存大小等。根据需要,Bochs还可以模拟多台PC,此外,它甚至还有自己的电源按钮。
以下对bochs的安装及常见错误的解决作总结:
采用源码安装的方式:
https://sourceforge.net/projects/bochs/files/bochs/
直接下载当前最新的源码,准备在linux上安装,所以下载的 bochs-2.6.9.tar.gz
sudo apt-get install build-essential xorg-dev libgtk2.0-dev bison
省掉config过程很多依赖编译报错
我在这个过程中出现了报错:unable to locate package build-essential xorg-dev libgtk2.0-dev bison
解决办法参考:https://blog.csdn.net/weixin_46672140/article/details/119115185
sudo tar xvzf bochs-2.6.9.tar.gz
cd bochs-2.6.9
./configure --enable-debugger --enable-disasm --enable-readline -LIBS='-lx11'
make
sudo make install
make install //会把bochs可执行文件拷贝到/usr/local/bin/目录下
逐条执行上述指令
第三条./configure指令可能会有错:configure: error: unrecognized option: `-LIBS=-lx11'
在ubuntu上 apt-get install libx11-dev,注意是小写. 然后在gcc中,-lX11, 注意是大写.
这里可以思考一下LIBS指令的含义:https://bbs.csdn.net/topics/220057357/
在make过程中我出现的报错:x11/xlib.h nosuch file or directory
可能是x11的的包没有安装完整,改错的话可以参考:
https://www.cnblogs.com/forcheryl/p/3978671.html
make过程可能也会因为缺少其他包而报错,搜索缺少的包并安装即可。
剩下两条指令应该可以顺利执行
4. 接下来让环境变量重新生效,在终端输入:
source /etc/profile
在这一步中,起初我通过重启的方法时环境变量生效,但关机后却无法再开机,Ubuntu始终停留在开机界面或者在黑屏闪动,重装了三次系统,改为采用上述指令。
5. 修改bochsrc文件:
在bochs-2.6.9目录下,有一个配置文件 .bochsrc,我们需要修改,让他运行我们的a.img
当你输入一个不带任何参数的bochs并执行之,bochs将在当前目录顺序寻找以下文件作为默认配置文件:
因此我们修改的文件为.bochsrc,注意前面有“.”的配置文件是隐藏文件,需要先把show hidden files打开:
.bochsrc 修改如下:
#cpu: model=core2_penryn_t9600, count=1, ips=50000000, reset_on_triple_fault=1, ignore_bad_msrs=1, msrs="msrs.def"
cpu: model=amd_k6_2_chomper, count=1, ips=50000000, reset_on_triple_fault=1, ignore_bad_msrs=1, msrs="msrs.def"
cpu: cpuid_limit_winnt=0
memory: guest=512, host=256
romimage: file=$BXSHARE/BIOS-bochs-latest, options=fastboot
vgaromimage: file=$BXSHARE/VGABIOS-lgpl-latest
mouse: enabled=0
pci: enabled=1, chipset=i440fx
private_colormap: enabled=0
#floppya: 1_44=/dev/fd0, status=inserted
#floppya: image=../1.44, status=inserted
#floppya: 1_44=/dev/fd0H1440, status=inserted
#floppya: 1_2=../1_2, status=inserted
#floppya: 1_44=a:, status=inserted
floppya: 1_44=a.img, status=inserted, write_protected=1
#floppya: 1_44=/dev/rfd0a, status=inserted
ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
ata1: enabled=1, ioaddr1=0x170, ioaddr2=0x370, irq=15
ata2: enabled=0, ioaddr1=0x1e8, ioaddr2=0x3e0, irq=11
ata3: enabled=0, ioaddr1=0x168, ioaddr2=0x360, irq=9
#ata0-master: type=disk, mode=flat, path="30M.sample"
#ata0-master: type=disk, mode=flat, path="30M.sample", cylinders=615, heads=6, spt=17
#ata0-master: type=disk, mode=flat, path="c.img", cylinders=0 # autodetect
#ata0-slave: type=disk, mode=vvfat, path=/bochs/images/vvfat, journal=vvfat.redolog
#ata0-slave: type=cdrom, path=D:, status=inserted
#ata0-slave: type=cdrom, path=/dev/cdrom, status=inserted
#ata0-slave: type=cdrom, path="drive", status=inserted
#ata0-slave: type=cdrom, path=/dev/rcd0d, status=inserted
boot: floppy
#boot: disk
floppy_bootsig_check: disabled=0
log: bochsout.txt
panic: action=ask
error: action=report
info: action=report
debug: action=ignore, pci=report # report BX_DEBUG from module 'pci'
debugger_log: -
parport1: enabled=1, file="parport.out"
#sound: driver=default, waveout=/dev/dsp. wavein=, midiout=
#speaker: enabled=1, mode=sound
有注释的地方基本都是改动过的,解决了下一步启动运行过程中,几个问题。
6. 启动运行bochs虚拟机:
bochs -f .bochsrc
注意:如果上面第5步修改的是bochsrc文件而非.bochsrc文件,那上面的启动指令就不加“.”
也可以直接输入bochs回车运行。
确保目录文件下有a.img文件,运行结果:
如果有问题,大部分都是bochsrc配置的问题,可以查看报错点,尝试注释掉,确保最基本的几个配置基本就可以正常运行了
例如:
memory: guest=512, host=256
romimage: file=$BXSHARE/BIOS-bochs-latest, options=fastboot
vgaromimage: file=$BXSHARE/VGABIOS-lgpl-latest
floppya: 1_44=a.img, status=inserted, write_protected=1
boot: floppy
启动过程可能遇到的问题:
解决方法:
linux终端下:bochs -help cpu
我选的是amd_k6_2_chomper
不用纠结你的电脑是何种类型的cpu,这里设置的是bochs模拟的硬件,而非适配你的电脑的硬件类型。我的电脑是intel core_duo,使用amd类型一样没有错误。
修改配置文件即可
1 2 |
#cpu: model=core2_penryn_t9600, count=1, ips=50000000, reset_on_triple_fault=1, ignore_bad_msrs=1, msrs="msrs.def" cpu: model=amd_k6_2_chomper, count=1, ips=50000000, reset_on_triple_fault=1, ignore_bad_msrs=1, msrs="msrs.def" |
解决方法:修改配置文件,注释掉以下两行
#sound: driver=default, waveout=/dev/dsp. wavein=, midiout=
#speaker: enabled=1, mode=sound
这是比较常见的错误了。检查目录文件下是否有软盘镜像a.img等img文件,并查看它与.bochsrc配置文件中设置的floppy名称是否一致。