-
-
[原创]bochs调试windows XP系统
-
发表于:
2011-3-30 20:25
27865
-
Bochs是一款基于IA-32(x86)的开源的模拟器,它可以模拟各种硬件的配置。Bochs模拟的整个PC平台,包括I/O设备,内存和BIOS,甚至有趣的是可以不使用PC硬件来运行Bochs。事实上,它可以在任何编译运行Bochs的平台上模拟x86硬件。对它进行基本了解后,就可以开始安**ochs,我实验的版本是Bochs2.4.2,先安**ochs2.4.2,安装好以后,我们看看Bochs文件夹有哪些程序:
bochs.exe ----------------------->bochs主程序
bochsdbg.exe ----------------------->bochs调试的主程序
bximage.exe ----------------------->创建disk/floppy image的程序,注意起生成文件的几种类型(flat)
bxcommit.exe ----------------------->撤消disk image的记录日志程序
由于Bochs需要通过输入格式文件的形式来启动系统,所以必须要编写bxrc文件来执行,下面是我写的通过disk image(通过文件模拟硬盘)来启动的文件如下:
#设置默认系统BIOS ROM模块
romimage: file=$BXSHARE/BIOS-bochs-latest
#设置CPU参数
cpu:count=1,ips=22100000, reset_on_triple_fault=1, cpuid_limit_winnt=0, msrs="msrs.def"
#设置内存大小
megs: 512
#设置默认VGA ROM模块
vgaromimage: file=$BXSHARE/VGABIOS-lgpl-latest
#vga: extension
vga: extension=vbe
# hard disk
ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
ata0-master: type=disk, mode=flat, path="C.img", cylinders=16644, heads=16, spt=63
#cdrom
#ata0-slave: type=cdrom, path="winxp.iso", status=inserted
#选择引导设备.
boot: disk
#关闭日志
log: nul
# LOG CONTROLS
panic: action=ask
error: action=report
info: action=report
debug: action=ignore
# DEBUGGER_LOG:
debugger_log: -
#设置建立串口通道,可以与windbg相连
#com2: enabled=1, mode=pipe-server, dev=\\.\pipe\com_2
# VGA_UPDATE_INTERVAL
vga_update_interval: 300000
# KEYBOARD_SERIAL_DELAY
keyboard_serial_delay: 250
# KEYBOARD_PASTE_DELAY
keyboard_paste_delay: 100000
# MOUSE
mouse: enabled=0
#private_colormap
private_colormap: enabled=0
# KEYBOARD_MAPPING
keyboard_mapping: enabled=0, map=
#end of winXP.bxrc配置信息
上面就是全部内容,#代表注释行。下面重点注意boot: disk
,按照磁盘启动,这里也可以写为boot:floppy or boot:cdrom;
如果只是调试MBR或者ntldr,使用floppy=xxx。Img即可,用软驱为最先启动设备。但是这里我使用disk image来启动,首先我们利用winhex克隆C盘(主分区)或者整个硬盘,这个可以在Vmware里来克隆,克隆好以后你会得到主要分区或者硬盘的逻辑大小,重点是注意这条语句:
ata0-master: type=disk, mode=flat, path="C.img", cylinders=16644, heads=16, spt=63
这里cylinders指的是柱面数,Heads指的是磁头数,spt指的是每簇/扇区数。这三个参数的值必须满足条件,Bochs才会加载镜像,这是我遇到比较麻烦的问题,首先我查看bochs源代码iodev工程中的harddrv.c(void bx_hard_drive_c::init(void)函数)里面有一段过程使通过”type”比较为== BX_ATA_DEVICE_DISK里,得到C/H/S参数,通过类型比较将harddrv指向对应的类,比如flat格式的类型是default_image_t,如果没有找到就返回给用户关于虚拟的硬盘类型无法匹配到,但是我仍然没有找到判断的条件,只是源代码中有这么一句:Bit64u disk_size = (Bit64u)cyl * heads * spt * 512;不管如何尝试始终提示:ata0-0 disk size doesn't match specified geometry(磁盘尺寸无法匹配指定数),难道就没有别的办法那,我好想遇到瓶颈了,弄了一天不管自己如何计算总是无法满足条件,帮助文件和这部分源代码也反复也看了几遍、网上也不停的找资料和到处问人,仍然无法解决,真的是没有办法那吗?我把眼球停在了bximage.exe进程,这个进程是用来创建disk image的,而且里面就有条件规定,我想我可以先创建一个合法的条件的diskimage,然后再把克隆好的镜像文件写入到创建的这个disk image里,如下图所示:
大家可以根据上图所提示的cyl、heads、sectors per track这三个参数得到文件大小,然后大于镜像系统文件即可,再利用winhex写入即可;我在在源代码,也找到了如下CHS与逻辑大小的换算规则:
int hdsize, cyl, heads=16, spt=63;
//如何换算cy1,hdsize是前面输入的创建磁盘大小
cyl = (int) (hdsize*1024.0*1024.0/16.0/63.0/512.0);
assert (cyl < 65536);条件限制柱面数最大<65536
sectors = cyl*heads*spt;扇区总数
................................
//按照条件创建disk镜像文件
make_image (sectors, filename, write_function);
printf ("\nI wrote %lld bytes to %s.\n", sectors*512, filename);
imagesize=sectors*512;//最终文件大小(磁盘大小)
步骤:
一、 先用bximage.exe创建 xx大小的image(两种方法来进行设置cyl、heads、spt,一、通过bximage.exe分配的镜像大小;二、通过源代码给出的运算)
二、 克隆好的image2
三、 将iamge2的内容写入image里
四、 编写bat加载disk image启动windows xp
批处理内容如下:
set BXSHARE=E:\Bochs-2.4.2
%BXSHARE%\bochs.exe -q -f bochsrc.txt
Pause
效果示意图如下:
终于搞定了使用克隆win xp系统的主分区来进行bochs调试,但是bochs没有符号表,这必须要windbg和Bochs联合起来才行,但是这个我目前没有成功,网上的某篇资料是说,自己在bochs源码中加命名管道通信代码,还说是Bochs串口速度太快的原因,希望有知道的大牛给我一点思路,谢谢!
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课