转自:http://mayuan.is-programmer.com/posts/23314.html
目前市面上流行的全虚拟化PC仿真软件系统主要有三种:VMware公司的VMware Workstation软件、Microsoft公司的Virtual PC以及开放源代码的Bochs。这3种软件都可以虚拟或仿真Intel x86硬件环境,可以让我们在运行这些软件的系统平台上运行多种其它的“客户”操作系统。
就使用范围和运行性能来说,这3种仿真软件有一定的区别。Bochs仿真了x86的硬件环境(CPU的指令)及其外围设备,因此很容易被移植到很多操作系统上或者不同体系结构的平台上。由于主要使用了仿真技术,其运行性能和速度都要比其它两个软件慢很多。Virtual PC的性能则介于Bochs和VMware Workstation之间。它仿真了x86的大部分指令,而其它部分则采用虚拟技术来实现。VMware Workstation仅仿真了一些I/O功能,而所有其它部分则是在x86实时硬件上直接执行。也就是说当客户操作系统在要求执行一条指令时,VMware不是用仿真方法来模拟这条指令,而是把这条指令“传递”给实际系统的硬件来完成。因此VMware是3种软件中运行速度和性能最高的一种。
从应用方面来看,如果仿真环境主要用于应用程序的开发,那么VMware Workstation和Virtual PC可能是比较好的选择。但是如果需要开发一些底层系统软件(比如进行操作系统开发和调试、编译系统开发等),那么Bochs就是一个很好的选择。使用Bochs,你可以知道被执行程序在仿真硬件环境中的具体状态和精确时序,而非实际硬件系统执行的结果。这也是为什么很多操作系统开发者更倾向于使用Bochs的原因。
OK,废话少说,转入正题。
我的操作系统是Ubuntu10.10 64位(开发代号MaverickMeerkat )。
如果你使用的也是Ubuntu操作系统,可以使用下面的命令来安装Bochs:
1
|
$
sudo
apt-get
install
vgabios bochs bochs-x bximage
|
在终端中敲入这行命令,不一会系统就帮你安装好了。
这样安装虽说省事,但有个缺点不得不说,就是默认安装的Bochs没有调试功能,oh my lady gaga,这样可不行。所以最好的方法还是从源代码安装。
从Bochs的官方网站http://bochs.sourceforge.net/下载最新的Bochs源代码包,我下载的是bochs-2.4.5.tar.gz。
安装过程差不多是这个样子的:
1
2
3
4
5
6
7
8
9
|
$
tar
vxzf bochs-2.4.5.
tar
.gz
$
cd
bochs-2.4.5
$.
/configure
--
enable
-debugger --
enable
-disasm
$
make
$
sudo
make
install
|
解释一下上面几行命令:
1. 解压源代码包bochs-2.4.5.tar.gz,生成文件夹bochs-2.4.5;
2. 进入bochs-2.4.5目录;
3. 运行configure脚本,它会测试你的机器,C/C++编译器以及一些库,用来判断何种配置适合于你的机器。其中命令行参数--enable-debugger --enable-disasm便是打开调试功能的开关。成功执行完configure脚本后,会在每个源代码目录下生成一个Makefile文件;
4. make根据第三步生成的Makefile文件从源代码编译整个Bochs;
5. 当整个Bochs编译成功后,执行make install,会将Bochs的可执行文件、帮助文档以及其它一些必要文件拷贝到系统相应的目录下,以便运行Bochs。默认情况下,会将一些必要的文件放到如下目录里,这里以我的安装目录为准:
表 1
/usr/local/bin/bochs |
Bochs启动程序 |
/usr/local/bin/bximage |
Bochs自带的制作磁盘映像文件的工具 |
/usr/local/bxcommit |
把redolog放进flat磁盘镜像文件中去的交互工具 |
/usr/local/share/doc/bochs/bochsrc-sample.txt |
Bochs配置文件的例子 |
/usr/local/share/bochs/BIOS-bochs-* |
BIOS映像文件(通常为BIOS-bochs-latest) |
/usr/local/share/bochs/VGABIOS-* |
VGA BIOS映像文件(通常为VGABIOS-lgpl-latest) |
这里对第3步再进行一个补充,如果在执行configure脚本的时候遇到:
错误1:configure: error: C++ preprocessor "/lib/cpp" fails sanity check
因为Bochs是用C++写的,所以这里要安装GNU gcc/g++编译器。
解决办法:sudo apt-get install build-essential
sudo apt-get install g++
错误2:checking for default gui on this platform... x11
ERROR: X windows gui was selected, but X windows libraries were not found.
解决办法: sudo apt-get install xorg-dev
错误3:ERROR: pkg-config was not found, or unable to access the gtk+-2.0 package.
解决办法:sudo apt-get install libgtk2.0-dev
Ok,Bochs已经安装完毕。现在,我们已经有了计算机(Bochs),还差一张引导软盘。既然计算机都可以虚拟,软盘当然也可以。在刚刚装好的Bochs组件中,有一个工具叫做bximage(见表1的第二项),它既能生成虚拟软盘,也能生成虚拟硬盘,我们也称它们为磁盘映像。创建一个软盘映像的过程如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
mayuan@mayuan-ThinkPad-T400:~$ bximage
========================================================================
bximage
Disk Image Creation Tool
for
Bochs
$Id: bximage.c,
v
1.34 2009
/04/14
09:45:22 sshwarts Exp $
========================================================================
Do you want to create a floppy disk image or a hard disk image?
Please
type
hd or fd. [hd] fd
Choose the size of floppy disk image to create,
in
megabytes.
Please
type
0.16, 0.18, 0.32, 0.36, 0.72, 1.2, 1.44, 1.68, 1.72, or 2.88.
[1.44]
I will create a floppy image with
cyl=80
heads=2
sectors per track=18
total sectors=2880
total bytes=1474560
What should I name the image?
[a.img]
Writing: [] Done.
I wrote 1474560 bytes to a.img.
The following line should appear
in
your bochsrc:
floppya: image=
"a.img"
, status=inserted
mayuan@mayuan-ThinkPad-T400:~$
|
完成后,会在当前目录下生成一个a.img文件,这便是我们的软盘映像。
所谓磁盘映像文件(Disk Image File)是软盘或硬盘上信息的一个完整映像,并以文件的形式保存。磁盘映像文件中存储信息的格式与对应磁盘上保存信息的格式完全一样。空磁盘映像文件是容量与我们创建的磁盘相同但内容全为0的一个文件。这些空磁盘映像文件就像刚买来的新软盘或硬盘,还需要经过分区及格式化才能使用。
有了磁盘映像,我们写一个小小的引导扇区,可以参考《Orange's 一个操作系统的实现》,命名为boot.asm。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
org 07C00h ; 告诉编译器程序加载到0000:7C00处
mov
ax
,
cx
mov
ds
,
ax
mov
es
,
ax
call
DispStr ; 调用显示字符串例程
jmp
$ ; 无限循环
DispStr:
mov
ax
, BootMessage
mov
bp,
ax
;
ES
:
BP
= 字符串地址
mov
cx
, 16 ;
CX
= 字符串长度
mov
ax
, 01301H ;
AH
= 13H,
AL
= 01H
mov
bx
, 000CH ; 页号为0(
BH
= 0) 黑底红字(
BL
= 0CH,高亮)
mov
dl
, 0
int
10H ; 调用BIOS的10号中断
ret
BootMessage:
db
"Hello World!"
; 要显示的字符串
times 510-($-$$)
db
0 ; 填充剩余空间,使生成的二进制代码恰好为512字节
dw
0XAA55 ; 结束标志
|
我们把这段代码用NASM编译一下:
1
|
$nasm boot.asm -o boot.bin
|
如果没有安装NASM,可以用如下命令进行安装:
1
|
$
sudo
apt-get
install
nasm
|
编译完成后,会在当前目录生成一个512字节的boot.bin文件,使用dd命令将它写进刚刚创建的软盘映像a.img的第一个扇区:
1
|
$
dd
if
=boot.bin of=a.img bs=512 count=1 conv=notrunc
|
Ok,马上就可以启动Bochs了。不过别急,在启动Bochs之前还需要为运行系统预先设置一些模拟环境的参数。这些参数可以在命令行上传递给Bochs执行程序,但通常都使用一个文本形式的配置文件(例如bochsrc)为专门的一个应用来设置运行参数。在目录/usr/local/share/doc/bochs下有一个bochsrc-sample.txt,我们可以参照它来写一个。这里既有好消息也有坏消息,坏消息是这个文件很长,好消息是大部分都是注释,嘎嘎。
我们在当前目录下新建一个文件,命名为bochsrc(注意,没有后缀)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
###############################################################
# Configuration file
for
Bochs(Linux)
###############################################################
#=======================================================================
# filename of ROM images
#=======================================================================
romimage: file=$BXSHARE/BIOS-bochs-latest
#=======================================================================
# VGAROMIMAGE
# You now need to load a VGA ROM BIOS into C0000.
#=======================================================================
vgaromimage: file=$BXSHARE/VGABIOS-lgpl-latest
#=======================================================================
# what disk images will be used
#=======================================================================
floppya: 1_44=/home/mayuan/a.img, status=inserted
#=======================================================================
# 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_mapping: enabled=
0
, map=
#=======================================================================
# how much memory the emulated machine will have
#=======================================================================
megs:
32
|
万事俱备,从终端进入当前目录(假设是/home/mayuan,bochsrc与a.img也在这个目录内),输入命令:
1
|
$bochs
|
如果我们在启动Bochs时没有在命令行上指定配置文件,那么Bochs会按以下的顺序寻找默认配置文件:
.bochsrc in the current directory
bochsrc in the current directory
bochsrc.txt in the current directory
(win32 only) bochsrc.bxrc in the current directory
(Unix only) .bochsrc in the user's home directory
(Unix only) bochsrc in the /etc directory
回车,提示:
1
2
3
4
5
6
7
8
9
|
1. Restore factory default configuration
2. Read options from...
3. Edit options
4. Save options to...
5. Restore the Bochs state from...
6. Begin simulation
7. Quit now
Please choose one: [6]
|
继续回车,输入c,再按回车,Bochs便启动成功,红色的Hello World!便呈现在眼前,是不是很酷。截图如下所示: