bochs教程

来源:互联网 发布:软件服务器怎么架设 编辑:程序博客网 时间:2024/06/05 08:50
Bochs教程.txt
2009/04/01 13:36

Bochs是一个开源的虚拟机。它可以实现vpc和vmware的大部分功能。你也可以像使用vmware一样的在Bochs里面安装操作系统。但 是,由于它是全模拟的。所以,速度要远远慢于vmware.这样看来Bochs好像没有什么优势.是这样吗?在应用方面的确如此。

但是,在其他一个方面它是处于绝对优势的。那就是它具有调试功能!这是一个让人振奋的功能。这个功能在你调试操作系统或者其他一些在裸机上运行的程 序时候,会让你有一种在写windows下运行的应用程序的感觉。有时候它是我们的救命稻草。没了它,也能活,但是肯定要糟糕的多。好了我们开始切入正 题。

一、 配置Bochs
实际上配置Bochs是很简单的,为什么很多人不会配置呢?我觉的就是因为他使用和配置方式和普通程序不一样——配置文件。实际上配置文件是和ini文件、bat文件类似的。Bochs没有给我们提供图形界面的配置工具。这就需要我们自己来修改配置文件。

简单的配置就可以让你的操作系统在Bochs里面跑起来。用Bochs跑完整的linux和windows是不现实的。实在是太慢了。一般我们也只 能把他当成调试器来使用。现在,我们先看一下如何让dos在他里面跑起来。如果你细心的话你会发现在Bochs文件夹里面有一个Bochsrc- sample.txt的文本文件。里面包含了所有了Bochs参数的信息。这个是官方的教程。可惜是英文的,而且我也没有找到有中文的教程(不然也没有我 这篇文章)。在这里我们仅仅介绍最简单的配置选项。好了,废话就不多说了。我们现在就开始。
我们以一个例子来说明,这个例子是我用来跑dos以及我自己的小操作系统的。下面就是我们要用到的最基本的选项:
# 在一行的最前面加上“#”表示这一行是注释行。
# 内存,以MB为单位,对于dos来说最大可以访问16MB
# 的内存,所以我就给了他16MB,你可以根据自己的机器来调整
megs: 16
# 下面两句一般是不可以改的,至于干什么用的就不用我说
# 了。从他们的文件名就可以看出来。
romimage: file=../BIOS-Bochs-latest, address=0xf0000
vgaromimage: file=../VGABIOS-lgpl-latest
# 这个还用说吗?当然是软驱了,我想我们写操作系统肯定是先
# 把操作系统放在软盘(或映像)里面吧?在Bochs里面是可
# 以使用任意大小的软驱映像的。可以是1.44或2.88,我一般使
# 用2.88。还有就是Bochs里面可以使用两个软驱。不过好像
# 我们并不经常这样做。
floppya: 2_88=test.img, status=inserted
#floppyb: 1_44=floppyb.img, status=inserted
# 下面是硬盘,很简单,还有就是Bochs也是可以支持多个硬
# 盘的。那么,硬盘文件是怎么生成的呢?我们可以发现硬盘是
# img格式的。你注意没有在Bochs文件夹里有一个工具叫
# bximage.exe,我想你应该猜出来了。他就是用来生成这个硬盘
# 文件的工具。我在这儿还想说的是硬盘分三种格式的,最好选
#用growing类型。这种有一个好处就是节省硬盘空间,不过使用
#这种类型的硬盘还需要在下面加上mode = growing这个选项。
ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
ata0-master: type=disk, path="dos.img", cylinders=306, heads=4, spt=17
# 下面这个就是光驱,没什么好说的。如果你想使用物理光驱,
# 只要让path=E:(我们假设E盘是光驱)
ata0-slave: type=cdrom, path="dos.iso", status=inserted
# 这个是启动设备,可以使用cdrom(光驱)、c(硬盘)或floppy(软
# 驱)。
#boot: cdrom
boot: c
#boot: floppy
# 这一句可以不要,他只是指定用来保存日志的文件。如果不指定的
# 话他就会输出到命令控制台上。
log: Bochsout.txt
# 这一句是设置在开机时是否激活鼠标,Bochs对于鼠标的控制不是# 很好。建议如果不是特别需要的话不要激活他。在运行期间也可以点窗口右上角的鼠标图标来激活他。
mouse: enabled=0
以上这些设置就可以让你的DOS或自己的小操作系统在Bochs里面跑起来了。至于其他的一些高级支持,你可以查看Bochsrc-sample.txt里面的说明。不要害怕他,其实很简单。关键是抛弃恐惧。

二、 启动Bochs
配置文件已经写好了,硬盘文件等也都已经弄好了。那么我们如何来启动Bochs呢?很简单,你右击一下上面写的那个配置文件(例如myos.bxrc,注意:扩展名要是.bxrc。)选择“运行”或双击即可。不过我一般都不这样做,我一般是写一个批处理文件。

很简单,如下所示:
cd "d:/Bochs-2.2.1/dos"
../Bochs.exe -q -f Bochsrc.bxrc
这样做的好处就是无论这个启动脚本放在哪儿都是可以使用的。那么,我们如何进入调试状态呢?下面我们就来讨论这个问题。

三、 调试功能
新建一个批处理文件,写入一下内容:
cd "d:/Bochs-2.2.1/dos"
../Bochsdbg.exe -q -f Bochsrc.bxrc
运行这个批处理文件,你就可以进入调试状态了。不过你会发现,程序卡住了。没有想普通运行状态一样进入你的dos操作系统。为什么?因为调试在等待你的命令。你只有给他一个命令他才会继续。我们输入“c”,然后回车。是不是dos已经可是运行了?

如果没有运行说明你输入的窗口不对,你不会把c输入到那个没有光标的窗口了吧?如果真是那样我真是服了你了。真的!但是,dos运行起来了,如何在 返回调试状态?很简单,按ctrl+c。什么你正在运行的程序被结束了?谁让你在操作系统窗口中按了,我是说在调试窗口按。至于哪个是调试窗口,哪个是操 作系统窗口,我就不说了。如果你不知道你就干脆别使用Bochs了,也不要写什么程序了,更不要开发什么操作系统了。为什么?因为你不可能成功。从这儿就 可以看出来。最好是找块豆腐撞死,这样你会很幸福的死去,不然你就会成为教育后代的典范——看到了吗XXX是怎么死的,笨死的。呵呵!开个玩笑。你真要不 知道
千万不要来找我,找我我也不告诉你。不好意思,我也不知道。那么,在调试状态下我们可以干哪些事呢?你用过debug吗?它能做的Bochs都能做,它不能做的Bochs也可以做。下面就是一些常用的调试命令。

help

我最想告诉大家的是这个指令,因为他可以告诉我们一切。古语说:“授之以鱼,不若授之以渔”。我觉的很有道理。但是,有些人就是不想学这种一劳永逸的方法。所以,我还要继续写下去。
输入help,回车。你会得到以下信息:
help - show list of debugger commands
help 'command'- show short command description
-*- Debugger control -*-
help, q|quit|exit, set, instrument, show, trace-on, trace-off,
record, playback, load-symbols, slist
-*- Execution control -*-
c|cont, s|step|stepi, p|n|next, modebp
-*- Breakpoint management -*-
vb|vbreak, lb|lbreak, pb|pbreak|b|break, sb, sba, blist,
bpe, bpd, d|del|delete
-*- CPU and memory contents -*-
x, xp, u|disas|disassemble, r|reg|registers, setpmem, crc, info, dump_cpu,
set_cpu, ptime, print-stack, watch, unwatch, ?|calc
需不需要我翻译一下前两句?那好吧。
help - 现实调试命令列表
help '命令' - 显示某条命令的详细用法。
命令分为哪些?很明显,四类:调试控制,运行控制,断点管理,CPU和内存控制。我不想在这儿一一介绍了。没有必要,我只介绍一下最常用的就可以了。
c:继续,前面我们已经用过了。
s:单步执行。他还有一个扩展用法。
s n :执行n步。
b 0x7c00:在内存0x7c00处设置一个断点.当程序执行到0x7c00处就自动进入到调试状态.后面的这个数指的是内存的线性地址

。也可以使用10进制的数,但是好像没有人会这样做。
x /20 0x7c00: 以16进制的形式从内存的0x7c00开始显示20个字的数据。这个是很常用的命令,但是需要注意的是他的显示顺序和16进制编辑器中的显示顺序有一点小 的区别。他的显示是以字为单位的,而且在字中是从低到高显示的.不过也没有什么大不了的。你只要稍微注意一下就可以了。

dump_cpu:这个是我最长用的三个指令之一。他的功能是显示现在的寄存器的状态,详细内容类似于:
eax:0x00000000, ebx:0x00000000, ecx:0x00000000, edx:0x00000683
ebp:0x00000000, esp:0x00000000, esi:0x00000000, edi:0x00000000
eip:0x0000fff0, eflags:0x00000002, inhibit_mask:0
cs:s=0xf000, dl=0x0000ffff, dh=0xff009bff, valid=1
ss:s=0x0000, dl=0x0000ffff, dh=0x00009300, valid=1
ds:s=0x0000, dl=0x0000ffff, dh=0x00009300, valid=1
es:s=0x0000, dl=0x0000ffff, dh=0x00009300, valid=1
fs:s=0x0000, dl=0x0000ffff, dh=0x00009300, valid=1
gs:s=0x0000, dl=0x0000ffff, dh=0x00009300, valid=1
ldtr:s=0x0000, dl=0x00000000, dh=0x00000000, valid=0
tr:s=0x0000, dl=0x00000000, dh=0x00000000, valid=0
gdtr:base=0x00000000, limit=0xffff
idtr:base=0x00000000, limit=0xffff
dr0:0x00000000, dr1:0x00000000, dr2:0x00000000
dr3:0x00000000, dr6:0xffff0ff0, dr7:0x00000400
cr0:0x00000010, cr1:0x00000000, cr2:0x00000000
cr3:0x00000000, cr4:0x00000000
u /20 0x7c00 :反汇编内存0x7c00处,反汇编的长度是20。你想不想知道dos的引导程序是什么样子的?执行一下这个命令就可以了。你还可以使用这样的命令 u /20 cs:0x120a,至于什么意思,我也不说了。

现在,我们已经介绍了6条命令了。够了。对于日常应用已经完全够用了。如果你想了解其他命令的用法只要执行一下help “命令名”就可以了(注意,命令上要带有引号)。好了。现在已经把Bochs的基本功能介绍完了。你是不是感觉Bochs很简单?对于简单的应用来说,确 实如此。但是,想让他支持一些高级功能就有点麻烦了。毕竟它是全模拟的虚拟机,所以在有些方面实现起来并不容易。但是,向网络之类的功能还是可以支持的。 你只要看一下Bochsrc-sample.txt就知道了。我在这儿就不说了。我还要说的是Bochs不仅仅可以调试操作系统,还可以调试dos下的程 序。我们知道dos没有多少好的调试器。那么我们完全可以使用Bochs来调试。你知道在程序的开头输出一下程序的段地址和偏移地址,然后暂定一下,在虚 拟机里面设置一下断点就可以了。我一般都是在在程序里面潜入一句汇编:
jmp $
这样在程序死循环的时候在调试窗口按下ctrl+c就可以看到他的段地址和偏移地址了。然后,在去掉这一句,设置一下断点,运行这个程序。是不是在指定位置中断了?

=================================

ATA[0-3]-MASTER,ATA[0-3]-SLAVE
指定硬盘或光盘的参数,并指明它是主盘还是从盘。标准的参数是ata0- master: type=disk, mode=flat, path="30M.sample", cylinders=615, heads=6, spt=17,type参数只能是两者,disk(硬盘),cdrom(光盘),mode这个参数镜像类型,它仅仅是针对磁盘才有效,有几 种,flat(一个文件的布局)concat(多个文件的布局)external(开发者指定的,通过C++的类BOCHS就是C++开发的)dll(开 发者指定的,通过dll文件)vmware3(wmware3使用的硬盘镜像)。还有几个其它的不介绍;path是指定硬盘或是光盘镜像的文件。 Cylinders,Heads,Spt这几个参数通过这名字就能知道了。注意,这通常来说也不算是太重要,但是某些时候,则是特别重要,比如装 minix1.5的时候,用bximage这个bochs自带的创建磁盘工具创建了个硬盘,然后就指明路径就运行,结果分区的时候一直出错,查了半天才发 现这几个参数没有设置好,bximage创建的硬盘的Heads和Spt似乎是固定的,和模板自带的不一样,结构分区的时候,自然按配置文件里的计算,和 实际的自然不符。

总之,有了配置模版文件,只要稍微懂一些英文很容易就能明白各个参数的作用和如何使用。这个表示我从网上copy下来的。可以参考一下。


参数名
说明

config_interface
关于配置文件的接口。其实就是在BOCHS运行过程中改变配置的界面

display_library
图形库。

Romimage
ROM BIOS

Megs
内存

optromimage [1-4]
ROM镜像的选项

vgaromimage
VGA ROM BIOS

floppya
软驱A

floppyb
软驱B

ata[0-3]
硬盘或光驱的ata控制器

ATA[0-3]-MASTER ATA[0-3]-SLAVE
ata设备的类型

Boot
启动驱动器

Ips
模拟的频率,有些时候特别有用,比如我装minix1.5的时候,在login的时候,如果机子高档的话,输入passwd的时间特别短,这时候就需要调整频率了。当然,听说软件如果对实时控制特别研的时候,也必须改它。

Clock
时钟

floppy_bootsig_check
是否检查软盘引导时候的引导的标记0xaa55

log
调试用的日志

logprefix
日志记录的格式

panic
Bochs这个软件本身错误的信息,如配置文件出错或是模拟错误如不支持图形模式

Error
Bochs遇到不能模拟的情况,如出现非法指令

Info
一些不常出现的情况

Debug
主要用来开发Bochs这个软件时报告情况用的

debugger_log
调试器输出错误的文件。

com1
串行端口。

parport1
并行端口。

sb16
声卡

vga_update_interval
VGA卡刷新率

ne2k
网卡


当我们写好配置文件后,将其后缀名改为.bxrc,就可以被Bochs识别了。这时候我们只要双击该配置文件Bochs就启动并按照该配置文件进行配置,自动执行。下面以DOS安装为例进行说明:

我们用光盘镜像来安装,然后用个引导盘启动,这个引导盘要能挂光驱。我们所用的引导盘就是前面提到的msdos.img这个。我的是用win98的 引导盘做的。假如光盘镜像文件是msdos.iso。我们先做个硬盘,用bximage这个工具创建硬盘,创建的时候,选择你所用虚拟的硬盘的大小。然后 把创建的镜像(c.img)复制到msdos6这个目录中,把msdos.img和msdos.iso也复制到msdos6这个目录中,嗯,还有 bochsrc-sample.txt也复制过去并改名字为filename.bxrc,然后编辑这个配置文件,主要是把光盘挂上,把软盘和硬盘也挂上, 并且把启动的取得器设定为a,然后双击filename.bxrc则开始运行了,安装正常的安装msdos622的方法,先用fdisk分区,然后 format,然后重新启动(格式化完必须重新启动),然后进入光驱安装。


=================================


Questions:

1. Bochs是做什么用的软件

Bochs是用C++开发的一个模拟器,模拟整个PC。它被设计成可以运行于多种主流平台下,包括x86, PPC, Alpha, Sun和MIPS。和Bochs同类的软件还有:VMware和Virtual PC。


2. 为什么选择Bochs(Bochs的优点)
Bochs完全是靠软件模拟来实现的。从启动到重启,包括PC的外设键盘,鼠 标,VGA卡,磁盘,网卡等,全部都是有软件来模拟的。这和其它的模拟器如VMware,plex86等有很大的区别。也正是由于Bochs完全是靠软件 来模拟整个PC环境,因此它非常的适合开发操作系统,这对广大操作系统爱好者来说是一个福音。因为有它,使得调试操作系统非常非常的容易,它自带一个调试 器bochsdbg,它可以从PC机刚启动的那一刹那起就开始模拟,注意,这不是从读取磁盘中的引导扇区那开始模拟。


3. Bochs运行的系统平台
Bochs有windows和linux2个版本


本文不是一本专门的使用手册,软件毕竟只是工具,使用不是我最终的目的,工具就是用来提高和改善我们工作环境的,我的目的是能够尽快地开始 调试我的OS——不能调试太痛苦了,我无法面对自己错误百出的程序。所以如果你想玩转Bochs那么这篇文章恐怕不适合你。另外由于我比较懒,不怎么愿意 学习新的东西,(但是发现没有其它的软件可调试OS)所以我坚持“用到哪里学到哪里,即学即用”的原则。

在这里我使用的是Bochs for Windows

Bochs的配置


首先要明白我们为什么要配置Bochs——配置的目的是什么。原因很简单,因为Bochs能够模拟多种硬件平台,所以它需要知道你想模拟一个什么样的平台。

配置的方法:配置的方法有2种(应该是,我没有仔细考证)1.运行Bochs后会自动让你选择进行配置;2.通过配置文件配置。第一种方法我觉得比较麻烦,没有仔细研究,我选择的是第二种通过配置文件配置的方法。

Bochs为我们提供了一个配置文件的模版,这个模版为bochsrc-sample.txt,可以在 bochs的安装目录中找到。稍微看一下,你就会知道:在配置文件中”#”为注释符号,表明后面#后面的全部是注释的内容(类似于C / C++ 中的行注释“//”)


Romimage

找到“romimage: file=bios/BIOS- bochs-latest, address=0xf0000”,这里定义了Bochs模拟BIOS文件的位置。Bochs安装文件夹中没有BIOS这个子目录,但有“BOOS- bochs-latest”这个文件,因此我们在这里将其更改为“romimage: file=BIOS-bochs-latest, ddress=0xf0000”。

这个参数我们知道就可以,一般没有必要修改。


Vgaromimage

找到“vgaromimage: bios/ VGABIOS-elpin-2.40”,基于同样的理由,将之更改为“vgaromimage: VGABIOS-lgpl-latest”。这个一般我们也没有必要修改。


Megs

指定内存大小。“megs: 32”表示虚拟系统被分配到32MB内存,如果你嫌少的话,可以在行首添加“#”将之屏蔽,然后选择更大的内存,当然不要忘记将行首的“#”删除.

Floppya
这是A驱动器的参数,当然,自然也是模拟的。通常所用的软驱是1。44MB的,因此后面跟的参数是1_44=/dev /fd0 注意:/dev/fd0表示你当前的真实软驱。如果你想使用镜像文件(在编写操作系统中,我们一般都使用镜像文件)则把/dev/fd0改成你镜像文件的 路径,如果你的配置文件和镜像文件在同一个文件夹中则可以直接写镜像名称,比如1_44=msdos.img就可以。

当然,也可以模拟其它的软驱,如2。88M,720K,360K的,这非常的有用!你装minix1.5版的时候就知道了,网站上download 的都是360K,说明那是360K的磁盘,你可以模拟除360K的软驱使用。后面的参数status标明软驱的状态,只能有两个inserted(软盘插 入软驱),ejected(软盘未插入软驱)。完整的就是floppya: 1_44=msdos.img, status=inserted。别的软驱如B类似。


Boot
这是启动的驱动器,它的频率也比较高。它可以带的参数有floppy(软驱启动),disk(磁盘启动),cdrom(光驱启动)。