Linux下 虚拟机Bochs的使用
1.虚拟一个软盘
在安装好的Bochs组件中,有一个工具叫做bximage,它不但可以生成虚拟软盘,还可以生成虚拟硬盘,这里我们生成虚拟软盘,(这是因为后面我们的测试程序是给予软盘的)。具体步骤如下:
至此就生成了一个1.44M的虚拟软盘。
2.一个简单的测试程序
我们打算从软盘启动虚拟机,这样的话我们就需要一个软盘的引导程序,来启动虚拟机,引导程序我们使用Orange's一个操作系统的实现学习(1)中的引导程序,在这里就不贴出其源代码了,具体的见原文。生成的文件:boot.bin
3.将测试程序写到虚拟软盘中
要将引导程序写到虚拟软盘中,用到dd命令:
dd if=boot.bin of = orange.img bs=512 count=1 conv=notrunc
需要注意的是这里的一个参数conv=notrunc,如果不使用它的话软盘镜像文件orange.img会被截断(truncated),这是因为boot.bin要比虚拟软盘小,而如果写的是真实的软盘则没这个问题,因为真实的软盘不可能被“截断”,毕竟真的和假的还是有区别的。(这里的截断是:虚拟的软盘是一个大小为1.44M的文件,截断就是文件的大小变小了,这样可定就不再是虚拟软盘了,因此不能截断)。
4.配置虚拟机
该准备的已经准备好了,接下来就是要创造一个虚拟机。
首先是安装Bochs虚拟机:
sudo emerge -avt bochs
安装成功后会在目录/usr/share/bochs/中有个例子:dlxlinux,可以自己研究以下。
要创建一个虚拟机其实就是配置一个配置文件,同样先看例子:
# filename of ROM images romimage: file=/usr/share/bochs/BIOS-bochs-latest vgaromimage: file=/usr/share/bochs/VGABIOS-elpin-2.40 # what disk images will be used floppya: 1_44=orange.img, status=inserted # choose the boot disk. boot: floppy # where do we send log messages? log: bochsout.txt # disable the mouse, since DLX is text only mouse: enabled=0 # enable key mapping, using US layout as default. # # NOTE: In Bochs 1.4, keyboard mapping is only 100% implemented on X windows. # However, the key mapping tables are used in the paste function, so # in the DLX Linux example I'm enabling keyboard_mapping so that paste # will work. Cut&Paste is currently implemented on win32 and X windows only. keyboard_mapping: enabled=1, map=$BXSHARE/keymaps/x11-pc-us.map
仔细研究一下上面的文件发现其实很简单,首先是BIOS设置,即romimage和vgaromimage,分别对应真实机器的BIOS和VGA BIOS,读者一定要对应其路径正确,否则会出现“couldn't open ROM iamge file”。然后是floppya配置我们要是使用的软盘将其设置为我们准备好的虚拟软盘即可。然后设置启动方式,这里设置为软盘启动。
5.启动虚拟机
如何启动虚拟起?命令如下:
bochs -f 配置文件
如果不指定参数那么Bochs将在下面的目录中搜索配置文件:
- .bochsrc
- bochsrc
- bochsrc.txt
- bochsrc.bxrc (仅对windows有效)
如在这里我们新建一个文件.bochsrc将上述配置文件写如即可,然后运行bochs,得到下面的界面:
按照提示选线6为Begin simulation(开始模拟器),我们直接回车即可。好了我们的虚拟机器已经运行起来了,看以下效果:
由于我们的虚拟软盘中没有Loader.bin所以显示的是NO LOADER。
好了到此我们的Bochs已经运行起来了,达到了我们的目的了。
6.Bochs高级用法
既然Bochs配置起来相对其他的虚拟机较为麻烦,为什么我们还使用它呢?这是因为它有着其他虚拟机没有的功能就是能调试操作系统,相对的代价就是运行速递满,肯定没其他的虚拟机快。
但是这里需要解决一个问题就是默认的安装bochs是不带调试功能的,因此需要自己手动编译带调试功能的bochs,首先下载代码:
emerge --fetchonly bochs
下载后的源代码在/usr/portage/distfiles/目录下面,然后解压压缩包:
tar -xvf bochs-2.4.5.tar.gz
先按照开启调试功能的配置进行编译的:
./configure --enable-debugger --enable-disasm sudo make sudo make install
这时,安装好的bochs其实就是有调试功能的所谓bochsdbg
我们将终端切换到bochs的默认安装目录下并将这个bochs重命名为bochsdbg:
cd /usr/local/bin sudo mv bochs bochsdbg
这样一个刚出炉还热气腾腾的bochsdbg就有了
那正常运行不带调试功能的bochs呢?重新编译下源代码,只是这次不带调试功能(记得先把终端切换到代码目录下):
./configure make sudo cp bochs /usr/local/bin/bochs
OK~~就这样就全好了~~
正常运行就用bochs,调试就用bochsdbg
好了工具准备好了,下面看怎么调试:
调试的时候启动虚拟机后,首先和原来的一样选择6运行虚拟机,然后它会停在开始的地方,这是控制台会出现命令行:可以输入命令来控制虚拟机的运行与否和单步运行等,下面具体看一下:
下断点:
b 0x7c00
运行:
c
此时虚拟机会运行到7c00处停下来.
查看cpu信息:
info cpu
r
fp
sreg
creg
这里需要注意的是要查看段寄存器:使用命令srge可以看到。
查看堆栈:print-satack 查看内存物理地址内容: xp /nuf addr (xp /40bx 0x9013e) 查看线性地址内容: x /nuf addr (x /40bx 0x9013e) 反汇编一段内存: u start end (u 0x30400 0x3040D) 每执行一条指令就打印CPU信息: trace-reg (trace-reg on) 单步执行遇到函数跳过: n 显示当前断点: info break 单步执行:s