Bochs是用C++开发的,它被设计成可以运行于多种主流平台下,包括x86, PPC, Alpha, Sun和MIPS。它完全是靠软件模拟来实现的。从启动到重启,包括PC的外设键盘,鼠标,VGA卡,磁盘,网卡等,全部都是有软件来模拟的。这和其它的模拟器如VMware,plex86等有很大的区别。也正是由于Bochs完全是靠软件来模拟整个PC环境,因此它非常的适合开发操作系统,这对广大操作系统爱好者来说是一个福音。因为有它,使得调试操作系统非常非常的容易,它自带一个调试器bochsdbg,它可以从PC机刚启动的那一刹那起就开始模拟,注意,这不是从读取磁盘中的引导扇区那开始模拟。后面我会提到如何使用它来调试。
鉴于Bochs对操作系统设计的巨大作用,《操作系统:设计与实现》这一伟大的操作系统书籍所带的光盘中就有Bochs软件。
下面谈BOCHS的用法。首先从bochs.sourceforge.net里面把BOCHS给Download下来,鉴于Windows的普及,仅仅谈BOCHS在win下的使用方法,其实在其它的OS中方法差不多,不过我仅仅在Window和Linux下安装使用过。
在bochs.sourceforge.net里面把Bochs-2.1.1.exe给抓了下来,双击就开始安装。这软件不大,安装完才3兆多,当然,这是标准安装,如果你选择的是完全安装,则比标准安装多个DLX linux demo这个OS,如果你是第一次使用BOCHS,建议你用完全安装,装完 ,现不用着急学会BOCHS的一大堆配置,可以先用用它自带的这个OS,感受下BOCHS。
在BOCHS的目录里面有个dlxlinux子目录,进去,双击bochsrc,就进入图1。
图1
这就等于机子里面已经安装了dlx linux这个操作系统,你现在可以进去感受它了!:)
这dlx linux是系统自带的,如果自己想用别的操作系统该怎么办呢?嘿嘿,别着急,BOCHS的开发者们已经为我们考虑好了,bochs.sourceforge.net里面,你能找到很多img文件,这些都是开发者们做好的镜像文件了,嗯,说白了,就等于是机子的硬盘了,咱们仅仅需要的就是配置好,能运行就可以。
通常我喜欢的方法是改配置文件,这方法似乎也是BOCHS的使用者们通常喜欢采用的吧,我详细介绍这方法。
比方说,咱们想用msdos这个操作系统,从网上找个msdos的启动盘的镜像文件,如果找不到的话,可以自己做个,方法:首先做个启动盘,然后用dos下的hd-copy这个工具做出这个启动盘的镜像文件,取名msdos.img这就做好了。单独建立个目录(随意地方)msdos,然后把bochs安装目录里面的bochsrc-sample.txt这个文件复制到msdos这个目录里面,并改名,注意,后缀最好是bxrc,这个后缀是bochs可以识别的。bochsrc-sample.txt这个文件是配置文件模板,我们就是在这个模板的基础上修改参数成为我们的操作系统所使用的配置文件。
先说最有用的几个参数,这几个参数是使用频率最高的,如果你同我一样很忙以致没有耐心看完整篇文章,你仅仅需要知道这几个参数的用法,就可以应付大多数的了。注意,#在这配置文件中是注释标记,表明后面#后面的全部是注释的内容。
第一个参数:floppya这是A驱动器的参数,当然,自然也是模拟的。通常所用的软驱是1。44MB的,因此后面跟的参数是1_44=/dev/fd0 注意,这个/dev/fd0必须是你的软驱的镜像,比方说咱们的msdos就是msdos.img,你把/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(光驱启动)。
这两个参数是最最常用的,几乎是必用吧。嗯~~下面的参数是关于硬盘的,有些麻烦,也算是比较常用吧。
第三个参数:ata0,ata1,ata2,ata3,这应该算是四个参数吧,没事别改它,反正我是没改过它,还常常吧后面的ata1,ata2,ata3给注释掉,仅仅留ata0。至于参数吗,你自己看看吧,不常用,我后面说。
第四个参数: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似乎是固定的,和模板自带的不一样,结构分区的时候,自然按配置文件里的计算,和实际的自然不符。
知道这3个参数(除了第三个),基本上就能应付大多数的了。
下面安装模板中的参数的位置,一个一个参数介绍,由于不常用,仅仅介绍下,不会象前面纳几个参数那样详细介绍,除非我觉得特别有用,或是使用过程中用过了。
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这个软件时报告情况用的。
以上四个参数(panic,error,info,debug)是Bochs运行时遇到的不同等级的情况。
debugger_log:调试器输出错误的文件。
com1:串行端口。
parport1:并行端口。
sb16:声卡。
vga_update_interval:VGA卡刷新率。
ne2k:网卡。
下面举例子说明如何使用,分两种例子举。第一个是操作系统是商业的操作系统,也就是说拿来就可以用的,把这种操作系统安装到bochs里面。第二种是自己开发操作系统。事实上,两种的本质没什么区别。
第一种:安装msdos6.22操作系统。
我们用光盘镜像来安装,技巧,如果文件比较多,比较大,就尽量搞到光盘镜像中(ISO文件),然后用个引导盘启动,这个引导盘要能挂光驱。我们所用的引导盘就是前面提到的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,然后重新启动(格式化完必须重新启动),然后进入光驱安装。
第二种:安装自己开发的操作系统。
其实通过上面的那个例子,你也应该知道这个的安装方法和在实际机器中的差不多,仅仅需要把所用的文件配置好就可以,这里提到它,仅仅是因为用这个模拟器的大多数人都是操作系统爱好者,否则大可不用Bochs,毕竟它是纯软件模拟,速度较慢。需要注意的还是引导磁盘的问题,这个通常用winimage这个软件来做。然后把所需要安装的文件挂到光盘镜像中一次性搞定,我曾经就傻乎乎的把所需要的文件分卷压缩,然后用winimage做成磁盘,一个一个复制到硬盘上,然后解压缩后安装,累死了,嘿嘿,希望大家吸取我的教训。
Bochs是开发操作系统的极品模拟器的另外一个原因是它带有调试功能。这也是本文的另一个需要重点讲解的地方。Bochsdbg这个程序是调试模式。在调试模式中,我不会象前面的那样直接双击配置文件就进入调试模式的法子。我用的是笨法子。在Bochs目录里面把配置文件配好,注意,关于光驱,软驱,硬盘的路径一定要指定正确。然后双击Bochsdbg.exe, 进入图2显示界面
选择2后,选择配置文件的路径和配置文件的文件名,然后选择5就开始运行了。事实上,由于Bochs2.1.1默认的配置文件名是bochsrc.txt,在Bochs目录中,如果你的配置文件的文件名就是这,直接运行Bochsdbg就出现上面的画面,再直接回车就可以了。当然,此种方法也可以运行Bochs,不是调试模式的。
当然,你也可以学dlxlinux的方法,把run.bat文件种的bochs改成bochsdbg就可以。方法类似。
下面则进入如何调试了。敲入help,可以列出各个命令的用法。下面主要调试命令的用法。
下面分类进行讨论。
控制执行类:
c 继续执行
stepi [count] 执行count条指令,默认count为1
step [count] 执行count条指令,默认count为1
s [count] 执行count条指令,默认count为1
Ctrl-C 停止执行, 并返回命令行
quit 退出调试
q 退出调试
断点类:
注意:这里面的’seg’和’addr’所用的数的格式和c语言中的一致,例如
十六进制:0xcdef0123
八进制 :01234567
十进制 :12345678
vbreak seg:off 设置指令的虚拟地址的断点位置。
vb seg:off
lbreak addr 设置指令的线性地址的断点位置。
lb addr
pbreak
addr 设置指令的物理地址的断点位置。pb
addr (’*’这个选项是为GDB兼容设置的)break
addrb
addr
info break 显示现在所有的断点的状态
delete n 删除第n个断点
del n 同上
d n 同上
操作内存类:
x /nuf addr 查看线性地址的内存
xp /nuf addr 查看物理地址的内存
n 显示多少个字节的内存
u 单位长度; one o单位f
b 字节
h 半字(2 字节)
w 字 (4 字节)
g 双字 (8 字节)
注意:这些并不是Intel中的术语,但是它们和GDB的是一致的。
F 打印格式:
x 打印十六进制
d 打印十进制
u 打印无符号十进制
o 打印八进制
t 打印二进制
n, f, 和u都是可选参数。U和f默认的是你最后一次用的值,如果没有用过的话,就是w(word)和x(hex)。N默认的是1。addr也是可选参数。如果你没有知道他的话,它将是下一条地址。
setpmem addr datasize val 设置物理内存某地址的内容。Addr是内存地址,datasize地址长度,val所想设置的值。
crc addr1 addr2 显示物理内存addr1到addr2之间的CRC
Info 命令
info program 程序的执行状态
info registers 显示寄存器内容
info break 显示断点状态
操作CPU寄存器set $reg = val 改变CPU寄存器的值为val。寄存器可以为eax,ecx,edx,ebx,esp,ebp,esi,edi。 不能为eflages,cs,ss,ds,es,fs,gs。info registers 见Info部分dump_cpu 显示完整的CPU信息。set_cpu 设置CPU的状态 “dump_cpu”和“set_cpu”的格式: "eax:0x%x\n" "ebx:0x%x\n" "ecx:0x%x\n" "edx:0x%x\n" "ebp:0x%x\n" "esi:0x%x\n" "edi:0x%x\n" "esp:0x%x\n" "eflags:0x%x\n" "eip:0x%x\n" "cs:s=0x%x, dl=0x%x, dh=0x%x, valid=%u\n" "ss:s=0x%x, dl=0x%x, dh=0x%x, valid=%u\n" "ds:s=0x%x, dl=0x%x, dh=0x%x, valid=%u\n" "es:s=0x%x, dl=0x%x, dh=0x%x, valid=%u\n" "fs:s=0x%x, dl=0x%x, dh=0x%x, valid=%u\n" "gs:s=0x%x, dl=0x%x, dh=0x%x, valid=%u\n" "ldtr:s=0x%x, dl=0x%x, dh=0x%x, valid=%u\n" "tr:s=0x%x, dl=0x%x, dh=0x%x, valid=%u\n" "gdtr:base=0x%x, limit=0x%x\n" "idtr:base=0x%x, limit=0x%x\n" "dr0:0x%x\n" "dr1:0x%x\n" "dr2:0x%x\n" "dr3:0x%x\n" "dr4:0x%x\n" "dr5:0x%x\n" "dr6:0x%x\n" "dr7:0x%x\n" "tr3:0x%x\n" "tr4:0x%x\n" "tr5:0x%x\n" "tr6:0x%x\n" "tr7:0x%x\n" "cr0:0x%x\n" "cr1:0x%x\n" "cr2:0x%x\n" "cr3:0x%x\n" "cr4:0x%x\n" "inhibit_int:%u\n" "done\n"
反汇编命令:disassemble start end 反汇编的地址范围
set $disassemble_size = n 告诉调试器,反汇编段的属性(16位或32位,默认32位)。
相信到这里,大家也基本会用BOCHS这个模拟器了。本文的重点主要在前面的Bochs的使用方面。后面的调试部分,仅仅列个表,大家用的时候,参考下每个命令的用法,也就差不多会调试了。关于更具体的,大家可以参考bochs的文档,里面有更详细的介绍。
转自:http://blog.csdn.net/yxin1322/archive/2006/04/14/664077.aspx