操作系统学习6 使用Bochs调试自己的引导程序
一、Bochs简介Bochs是一个x86 的软件模拟器,用来模拟x86CPU、一些硬件和BIOS等,可以用来运行Windows、Linux等软件。由于它是纯软件模板,所以运行速度比起VmWare,VirtualBox可能会慢一点。二、启动镜像的操作过程1. 下载地址https://sourceforge.net/projects/bochs/files/bochs/2.6.11/安装后启动。2.
操作系统学习6 使用Bochs调试自己的引导程序
一、Bochs简介
Bochs是一个功能丰富、可定制、适用于教育和研究的开源 x86 软件模拟器,用来模拟x86CPU、一些硬件和BIOS等,可以用来运行Windows、Linux等软件。
其特点 :
- 跨平台支持:Bochs 可以在多种操作系统上运行,包括 Windows、macOS、Linux、BSD 和 Solaris 等,因此你可以在几乎任何计算机上使用它。
- 模拟功能:Bochs 提供了完整的 x86 CPU 模拟,包括 CPU、内存、显卡、硬盘、网络等硬件设备的模拟。这使得你可以在虚拟环境中运行各种操作系统和软件。
- 调试功能:Bochs 提供了丰富的调试功能,包括单步执行、断点、寄存器和内存查看等。这使得它成为一个强大的调试工具,用于分析和调试操作系统和应用程序。
- 可定制性:Bochs 可以通过配置文件进行高度定制,你可以设置虚拟机的硬件参数、引导顺序、操作系统映像等。这使得它非常适合于研究和教学目的。
- 开源项目:Bochs 是一个开源项目,采用 GNU Lesser General Public License (LGPL) 许可证发布。这意味着你可以自由地下载、使用、修改和分发它。
- 性能:由于 Bochs 是一个完全模拟的 x86 系统,它的性能通常比基于硬件虚拟化的解决方案(如 VirtualBox、VMware 等)要低。然而,它的模拟功能非常强大,可以模拟一些特定的硬件和环境,这些硬件在基于硬件虚拟化的解决方案中可能不支持。
官方文档地址:
https://bochs.sourceforge.io/doc/docbook/user/index.html
二、启动镜像的操作过程
1. 下载地址
https://sourceforge.net/projects/bochs/files/bochs/2.6.11/
安装时可以钩选上 DLX Linux Demo的选项,安装示例的Linux系统。
安装后启动。
2. 启动一个虚拟机
点Start,启动一个Linux虚拟机。
Power按钮可以关闭虚拟机。
3. 修改配置,装载自己的启动镜像
再打开Bochs,Load 默认的Linux镜像。
选择Disk & Boot,把First Floppy Drive指向之前做的启动镜像。
选择Boot Options,选择Boot drive #1 为:floppy
另外注意Memory下ROM BIOS image的路径是相对路径,要改成绝对路径:
同样 :
- Keyboard & Mouse 下的 Keymap filename
- Display & Interface 下的 VGA BIOS image 和 ROM BIOS image
- ata0-master
也改成绝对路径。
设置完点Save把设置另外保存一个配置文件。
再启动虚拟机,加载了之前的镜像:
三、使用bochsdbg.exe调试程序
1. 进入调试状态
bochsdbg.exe在安装目录下,开始菜单可能找不到它。使用bochsdbg.exe启动镜像。
help命令可以看到一些使用帮助。
常用命令:
# 设置断点,b,pb,vb
b 0x7c00 #启动时设置断点,实模式的7c00就是启动程序入口
# 执行到断点
c
# 查看断点
info break
# 单步执行
s
# 再执行几条就中断,值是L结尾的64位整数
sb [10L]
# 切换到v86模式时中断
modelbp
# 执行几条语句
step n
# 单步运行,遇到函数跳过
n
# 查看内存值,物理地址
xp 0xffff
# 查看线性地址
x /nuf addr
# 打印寄存器
print-stack
# 单步调试显示寄存器值
trace-reg on
# 反汇编执行的每一条指令
trace-on
# 查看寄存器 r,fp , sreg, creg
r
# 查看堆栈
print-stack
# 反汇编 u/disas/disassemble [/num] [start] [end]
u start end
# 设置寄存器,支持 eax,ecx,edx,ebx,esp,ebp,esi,edi
set $reg=值
# 设置 cpu
set_cpu
# 显示CPU信息
dump_cpu
# 输入的调试指令记录到文件
record "filename"
# 回放记录
playback "filename"
# 加载符号文件
load-symbols [global] filename [offset]
2. 查看内存
- x /nuf [addr] 显示线性地址的内容
- xp /nuf [addr] 显示物理地址的内容
参数说明:
- n
显示的单元数
-u
每个显示单元的大小,u可以是下列之一:
- b BYTE
- h WORD
- w DWORD
- g DWORD64
-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。
xp /12bc 0x7c1e
3. info命令
- info program 显示程序执行的情况。
- info registers|reg|r 显示寄存器的信息。
- info pb|pbreak|b|break 相当于blist。
- info dirty 显示脏页的页地址。
- info cpu 显示所有CPU寄存器的值。
- info fpu 显示所有FPU寄存器的值。
- info idt 显示IDT。
- info gdt [num] 显示GDT。
- info ldt 显示LDT。
- info tss 显示TSS。
- info pic 显示PIC。
info ivt [num] [num]
显示IVT。- info flags 显示状态寄存器。
- info cr 显示CR系列寄存器。
- info symbols 显示symbol信息。
- info ne2k|ne2000 显示虚拟的ne2k网卡信息。
参考:
https://blog.csdn.net/liu0808/article/details/53099099#t0
更多推荐
所有评论(0)