Windows下Bochs的简单使用

mac2022-06-30  119

Bochs的安装

安装Bochs后,安装目录如下: 可以用到的东西分为两大类:

应用程序

先说一下bochs.exe、以及bochdbg.exe前者直接运行虚拟机,后者可以从头开始调试。 然后就是bximage.exe,这是一个专门用于生成软盘或者磁盘镜像的软件,并且可以对镜像的参数进行调整。 其余都不常用。

各种资源文件

在用于配置虚拟机,告诉Bochs要运行的虚拟机是什么样的:

BIOS系统镜像,在上图,镜像有BIOS-bochs-latest和BIOS-bochs-legency。VGABIOS镜像,是提供屏幕显示接口,例如10h中断,在上图,VGABIOS开头的文件就是。键盘映射,在keymaps文件夹中。

Bochs的使用

除了Bochs的应用程序之外,还需要两个先决条件:

需要有虚拟机镜像,以虚拟磁盘或者虚拟软盘的形式存储。需要有配置文件。

虚拟机镜像

虚拟机镜像有很多种格式,一般没有太过特殊的要求就直接使用flat格式。下面使用bximage生成一张磁盘镜像:

在Windows中,双击应用程序就会显示出一个命令行: 我们要创建一个镜像,所以选择1,然后就是问要创建软盘还是硬盘: hd即HardDisk,就是磁盘,fd即FloopyDisk,就是软盘,这里选hd,然后就是问要创建何种格式的镜像: 相对于其他镜像,flat格式的内容可以直接用WinHex之类的软件打开查看,排查起来相对简单,所以直接选flat格式,下一个问题是设置大小: 对于初学操作系统的我来说,大的尺寸没有太大的意义,所以直接选个最小好了,最后一个问题是文件名,设置好后如下图: 上面的图中,最重要的是镜像的CHS参数,这里把它记下来,后面要用的。 这只是一张空白的磁盘镜像,没有任何内容,在做好系统后,可以使用dd直接将系统拷到镜像中去,这里假设我有一个512B的引导扇区文件boot.bin,命令如下:

dd if=./boot.bin of=mydisk.img bs=512 count=1 conv=notrunc

if指定输入文件,of指定输出文件,bs为块的大小,count指定拷贝多少块,注意要加上conv=notrunc,当boot.bin的大小小于mydisk.img的时候,此项可以避免dd将mydisk.img截短为boot.bin的大小。

至此,虚拟机镜像准备完毕。

配置文件

Bochs的安装目录下有配置文件的示例bochsrc-sample.txt。这里讲一个简单的示例,井号开头的是单行注释:

# 指定虚拟机的内存大小为32M megs:32 # 指定虚拟机的BIOS镜像 romimage: file=BIOS-bochs-latest vgaromimage: file=VGABIOS-lgpl-latest # 告诉Bochs,该虚拟机加载了一个叫做mydisk.img的硬盘镜像作为主盘,ata1为副盘 # 第二行的CHS参数就填刚刚记下来的参数 ata0: enabled=1,ioaddr1=0x1f0,ioaddr2=0x3f0,irq=14 ata0-master:type=disk,path=mydisk.img,mode=flat,cylinders=20,heads=16,spt=63 # 从硬盘启动 boot:disk # 指定日志文件,里面有各种运行时信息 log: bochsout.txt # 不使用鼠标 mouse: enabled=0 # 指定键盘映射 keyboard: keymap=x11-pc-us.map

这里笔者没有搞明白的是,使用绝对路径配置BIOS镜像和键盘映射文件的时候,bochs似乎没有办法读取相应的文件,最后笔者是将需要读取的文件拷贝到配置文件的目录中,这样就不需要使用绝对路径了。

运行虚拟机

双击bochsdbg.exe弹出两个框:

前面用来载入配置文件,后面就是运行时的控制台。点击Load载入配置文件,让后点击Start如图: 原来的小框不见了,新增了一个黑框,作为虚拟机的屏幕。此时虚拟机停留在执行BIOS镜像的第一条指令之前。

Bochs调试的命令跟GDB很像,后面列出常用的调试命令。

这里我们只需要从引导扇区开始调试即可,命令如下:

b 0x7C00 c

虚拟机就会停留在引导扇区的第一条指令上,然后就可以愉快的调试了。

Bochs常用命令

b addr 在物理地址处设置断点 addr为物理内存地址,不加段基址

lb 在线性地址处设置断点 addr为线性物理地址,不加基址

vb 在虚拟地址上设置断点 addr为段基址:偏移地址, cs段

c 继续执行知道遇到断点

n 单步执行 跳过子程序和int中断程序

s 单步执行

s num ( s指令后加一数字) 执行n步

dump_cpu 查看寄存器信息 (实测下来这个指令好像不好使。。。)

x /nuf addr 显示指定内存地址的数据,addr可以是线性的内存地址,也可以是虚址 格式是基址:偏移或者基址寄存器:偏移

n 显示的数据长度

u 数据单元大小 b,h,w,g分别对应1,2,4,8字节

f 数据显示格式 x,d,u,o,t,c分别对应十六进制、十进制、无符号十进制、八进制、二进制、字符串

u [/count] start end 反汇编一段线性内存(作用与上面的一样)

(count 参数指明要反汇编的指令条数 ,例子:u /5 --反汇编从当前地址开始的5条指令)

info指令组

info b 展示当前的断点状态信息

info dirty 展示自从上次显示以来物理内存中的脏页(被写的页)

info program 展示程序的执行状态 (无法使用!)

info r|reg|rigisters 展示寄存器内容

info cpu 展示CPU寄存器内容

info fpu 展示FPU寄存器的状态

info idt 展示中断描述表

info ivt 展示中断向量表(保护模式下无效)

info gdt 展示全局描述表

info tss 展示当前的任务状态段

info cr 展示CR0-CR4寄存器状态 (无法使用)

info flags 展示标志寄存器 (无法使用)

寄存器查询

r 查看通用寄存器

sreg 查看段寄存器(es,cs,gs,ss,fs,ds以及idt,gdt,ldt,tr)

creg 查看控制寄存器(cr0,cr1,cr2,cr3)

dreg 查看调试寄存器(dr0-dr7)

x /nuf [addr] 显示线性地址(Linear Address)的内容

xp /nuf [addr] 显示物理地址(Physical Address)的内容

参数 n 显示的单元数

参数 u 每个显示单元的大小,u可以是下列之一:

b BYTE h WORD w DWORD g DWORD64

注意: 这种命名法是按照GDB习惯的,而并不是按照intel的规范。

f 显示格式,f可以是下列之一:

x 按照十六进制显示 d 十进制显示 u 按照无符号十进制显示 o 按照八进制显示 t 按照二进制显示 c 按照字符显示

n、f、u是可选参数,如果不指定,则u默认是w,f 默认是x。如果前面使用过x或

者xp命令,会按照上一次的x或者xp命令所使用的值。n默认为1。addr 也是一个

可选参数,如果不指定,addr是0,如过前面使用过x或者xp命令,指定了n=i,

则再次执行时n默认为i+1。

最新回复(0)