bochs调试方法与指令详解

动手编写操作系统(1):初识Bochs   下面正式进入实操环节,也就是动手搭建操作系统。看着眼前的Windows/Linux/Mac OS/etc,相信绝大多数同学都会感到兴奋和迷茫:这么大个操作系统,从哪里开始呢?古人有云:“工欲善其事,必先利其器。”我们得以发挥自己聪明才智,进行学习研究创造的前提,是拥有一个好的工具。它能让我们在巨人的肩膀上欣赏与创造。在这里,我想表达对所有在相关领域为后人的方便贡献自己汗水的前辈的衷心的感谢与钦佩。   话不多说,接下来我们正式切入正题:配置调试操作系统所需的环境。 C/C++编译器,这里采用gcc/. 阅读详情

https://blog.csdn.net/acmilanvanbasten/article/details/38852173

bochs调试FAQ:

一 基本调试命令

1.       Q:如何从引导扇区开始设置断点?

A: BIOS被载入内存中运行,其引导扇区的地址一般都是在0x7c00,因为在实模式下,逻辑地址和物理地址是一一对应的, 所以我们可以在启动bochs调试的命令行下输入

        pb 0x7c00 或者 vb 0:0x7c00

就着输入

        c

bochs就会在0x7c00处停下 

2.       Q: 我想在单步执行(s)后看到寄存器的变化情况, 该怎么设置?

A: 输入

               trace-reg on

   后, 再执行单步调试的时候都会显示寄存器的当前状态了.

 

3.       Q: 在单步调试的时候,遇到一个调用子程序的指令,输入s会把调试跳进子程序中,如何只执行子程序而不要陷进去调试?

A: 在调试子程序的指令处,不用s改为n或p

4.       Q: 查看当前堆栈的命令?

A: print-stack

 

Table 1. 部分Bochs调试指令

行为

指令

举例

在某物理地址设置断点

b addr

b 0x30400

显示当前所有断点信息

info break

info break

继续执行,直到遇上断点

c

c

单步执行

s

s

单步执行(遇到函数则跳过)

n

n

查看寄存器信息

info cpu

r

fp

sreg

creg

info cpu

r

fp

sreg

creg

查看堆栈

print-stack

print-stack

查看内存物理地址内容

xp /nuf addr

xp /40bx 0x9013e

查看线性地址内容

x /nuf addr

x /40bx 0x13e

反汇编一段内存

u start end

u 0x30400 0x3040D

反汇编执行的每一条指令

trace-on

trace-on

每执行一条指令就打印CPU信息

trace-reg

trace-reg on

其中"xp /40bx 0x9013e"这样的格式可能显得有点复杂,读者可以用"help x"这一指令在Bochs中亲自看一下它代表的意义

 

二执行控制

 

c|cont 向下执行,相当于WinDBG的“g”。 

s|step|stepi [count] 单步执行,相当于WinDBG的“t”,count 默认为 1。 

p|n|next 单步执行,类似于WinDBG的“p”。 

q|quit|exit 退出调试,同时关闭虚拟机。 

Ctrl-C 结束执行状态,返回调试器提示符。 

Ctrl-D if at empty line on command line, exit

(至少在Windows版本中我没有发现Ctrl-D有什么功能)

 

三 执行断点

 

vb|vbreak [seg:off] 在虚拟地址上下断点。 

lb|lbreak [addr] 在线性地址上下断点,相当于WinDBG的“bp”。 

pb|pbreak|b|break [addr] 在物理地址上下断点。(为了兼容GDB的语法,地址前可以加上一个“*”)。 

blist 显示断点状态,相当于WinDBG的“bl”。 

bpd|bpe [num] 禁用/启用断点,WinDBG的“be”和“bd”。num是断点号,可以用blist命令查询。 

d|del|delete [num] 删除断点,相当于WinDBG的“bc”。mum是断点号,可

以用blist命令查询。

 

四 读写断点

 

watch read [addr] 设置读断点。

watch write [addr] 设置写断点。

unwatch read [addr] 清除读断点。

unwatch write [addr] 清除写断点。

watch 显示当前所有读写断点。

unwatch 清除当前所有读写断点。

watch stop|continue 开关选项,设置遇到读写断点时中断下来还是显示出来但

是继续运行。

 

五 内存操作 

x /nuf [addr] 显示线性地址的内容

xp /nuf [addr] 显示物理地址的内容

n 显示的单元数

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

b BYTE

h WORD

w DWORD

g DWORD64

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

 

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。 

setpmem [addr] [size] [val] 设置物理内存某地址的内容。 

需要注意的是,每次最多只能设置一个DWORD:

这样是可以的:

<bochs:1> setpmem 0x00000000 0x4 0x11223344

<bochs:2> x /4 0x00000000

[bochs]:

0x00000000 <bogus+ 0>: 0x11223344 0x00000000 0x00000000 0x00000000

这样也可以:

<bochs:1> setpmem 0x00000000 0x2 0x11223344

<bochs:2> x /4 0x00000000

[bochs]:

0x00000000 <bogus+ 0>: 0x00003344 0x00000000 0x00000000 0x00000000

或者:

<bochs:1> setpmem 0x00000000 0x1 0x20

<bochs:2> x /4 0x00000000

[bochs]:

0x00000000 <bogus+ 0>: 0x00000020 0x00000000 0x00000000 0x00000000

下面的做法都会导致出错:

<bochs:1> setpmem 0x00000000 0x3 0x112233

Error: setpmem: bad length value = 3

<bochs:2> setpmem 0x00000000 0x8 0x11223344

Error: setpmem: bad length value = 8 

crc [start] [end] 显示物理地址start到end之间数据的CRC。 

 

六 寄存器操作

 

set $reg = val 设置寄存器的值。现在版本可以设置的寄存器包括:

eax ecx edx ebx esp ebp esi edi

暂时不能设置:

eflags cs ss ds es fs gs 

r|reg|registers reg = val 同上。 

dump_cpu 显示完整的CPU信息。 

set_cpu 设置CPU状态,这里可以设置dump_cpu所能显示出来的所有CPU状态。 

 

七 反汇编命令 

u|disas|disassemble [/num] [start] [end]

反汇编物理地址start到end 之间的代码,如

果不指定参数则反汇编当前EIP指向的代码。

num是可选参数,指定处理的代码量。

set $disassemble_size = 0|16|32 $disassemble_size变量指定反汇编使用的段

大小。 

set $auto_disassemble = 0|1 $auto_disassemble决定每次执行中断下来的

时候(例如遇到断点、Ctrl-C等)是否反汇

编当前指令。

 

八 其他命令

trace-on|trace-off Tracing开关打开后,每执行一条指令都会将反汇编的结果

显示出来。 

ptime 显示Bochs自本次运行以来执行的指令条数。 

sb [val] 再执行val条指令就中断。val是64-bit整数,以L结尾,形如“1000L” 

sba [val] 执行到Bochs自本次运行以来的第val条指令就中断。val是64-bit整数,以L结尾,形如“1000L” 

modebp 设置切换到v86模式时中断。 

record ["filename"] 将输入的调试指令记录到文件中。文件名必须包含引号。 

playback ["filename"] 回放record的记录文件。文件名必须包含引号。 

print-stack [num] 显示堆栈,num默认为16,表示打印的条数。 

?|calc 和WinDBG的“?”命令类似,计算表达式的值。 

load-symbols [global] filename [offset]

载入符号文件。如果设定了“global”关键字,则符号针对所有上下文都有效。offset会默认加到所有的symbol地址上。symbol文件的格式为:"%x %s"。

 

九 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网卡信息。

【linux源码学习】【实验篇】使用bochs运行linux0.11系统(搭建一个自己的工作站) bochs运行linux0.11实验(包括双环境) 阅读详情

相关推荐

bochs编译安装和调试方法

最近在研究从0开始编写操作系统,使用bochs模拟器进行调试,bochs支持单步运行汇编代码,比qemu-system-x86_64会更加方便,这里记录一下bochs的操作方法。

1121

Bochs 虚拟机下载与使用教程

最近正在学习自制操作系统的相关内容,教程里说最好使用Bochs虚拟机来运行操作系统,于是我百度了一下,竟然没有一篇相关的完整教程,所有就有了这一篇文章。

weixin_44322146的博客 1万+

Bochs源码分析 - 12:这才是真正的调试姿势!!

前言 之前我们为了正确的调试bochs,采用了很多方法,一种是利用IDA进行调试,第二种是采用bochs-dbg配合调试,第三种是在cpu_loop(..)中下循环来进行调试。这三种来实际操作中都很不方便。 真正的调试姿势 IDA以二进制模式分别以0x7c00,0x8000-2为偏移打开uboot.bin与setup.bin文件,静态分析;配置调试模式编译bochs,精确下断点定位指令;再通过visual studio 在cpu_loop(..)函数中下软件断点分析指令...

WriteAnything_的博客 687

bochs用户手册-1简介

qquadBochs是一个模拟完整的英特尔x86计算机的程序。它包括Intel x86 CPU的仿真、常见I/O设备和自定义BIOS。Bochs可以被编译来模拟许多不同的x86 CPU,从早期的386到最新的x86-64 Intel和AMD处理器,这些处理器甚至可能还没有进入市场。Bochs解释从通电到重新启动的每一条指令,并为所有标准PC外围设备提供了设备型号:键盘、鼠标、VGA卡/显示器、磁盘、定时器芯片、网卡等。因为Bochs模拟整个PC环境,所以在模拟中运行的软件“相信”它是在真实的机器上运行的。

weixin_45499326的博客 1505

R语言分段回归

1.利用虚拟变量进行线性回归 (MEdata.csv的数据来源:https://github.com/ChenQihome9/CSDN-Data-Library/blob/master/MEdata.csv) 问题13:针对TAX~GDP,使用分段回归方法,找到其回归方程。编程,并根据程序结果叙述如下几方面问题:(1)分几段最佳?(不超过5段内)(2)分段位置定在哪儿最佳?(3)写出最佳方...

ChenQihome9的博客 1万+

Python速成指南:进阶篇

欢迎来到Python速成指南的进阶篇。如果你已经完成了基础篇的学习(Python速成指南:从零开始的编程之旅-CSDN博客),并且对Python的基本概念有了扎实的理解,那么你已经为进入更深层次的Python世界做好了准备。在这个进阶篇中,我们将深入探讨Python的高级特性,并着重于如何在实际工作中应用这些知识。深入理解Python的高级特性掌握在实际项目中常用的技巧和最佳实践提高代码质量和性能了解Python在各个领域的专业应用让我们开始这段激动人心的Python进阶之旅吧!

weixin_44067082的博客 2326

00 【哈工大_操作系统】Bochs 汇编级调试方法及指令

本文将介绍一下哈工大李治军老师《操作系统》课程在完成Lab时所使用到的 Bochs 调试工具的使用方法。

weixin_53159274的博客 2702

Vivado SDK中LWIP库版本冲突与RTL8211FDI兼容性实战解析

本文深入解析Vivado 2019.1 SDK中LWIP 1.0库与RTL8211FDI千兆PHY芯片的版本冲突问题,并提供实战解决方案。通过手动移植高版本LWIP库、整合第三方驱动及优化BSP配置,有效解决了以太网通信兼容性问题,确保千兆性能稳定运行。

ios99的博客 267

bochs调试玩具操作系统的方法

我用的是bochs 2.6.11 首先进入bochs的调试模式使用的是 ,打开bochsdbg。同理他也会让你选择配置文件。 选择完了配置文件,弹出两个窗口,一个是调试命令行,一个是操作系统窗口 最初的时候,他会显示一些日志,然后注意: 显示了下一条指令的所在地和指令内容。我们观察因为实模式下 BIOS的引导代码实在 0xf000:0xfff0这里,也就是机器一加电后,cs和ip的初始化内容...

懒羊羊的梦想 1013

网络抓包实战:如何捕获与解析802.1Q VLAN标签报文

在网络通信中,数据包是信息传输的基本单元,而VLAN(虚拟局域网)技术通过在数据链路层插入802.1Q标签,实现了网络流量的逻辑隔离与高效管理。其核心原理是在标准以太网帧头中嵌入4字节的VLAN标识,使交换机能够根据VID(VLAN ID)进行精准转发。掌握VLAN报文的捕获与解析技术,对于网络故障排查、安全审计和性能优化具有重要价值,尤其在需要验证网络隔离策略或诊断Trunk链路异常时。本文聚焦于使用Wireshark工具,结合端口镜像等实操方法,详细演示如何抓取并解读携带802.1Q标签的原始报文,帮助

weixin_33417488的博客 380

ESP32水墨屏日历实战:低功耗自动更新与HTTPS数据解析

本文详细介绍了ESP32水墨屏日历项目的开发实践,重点讲解了低功耗自动更新与HTTPS数据解析的实现方法。通过ESP32的自动休眠功能和水墨屏的零功耗特性,结合HTTPS请求安全获取网络数据,实现了高效节能的桌面日历应用。项目代码开源,适合物联网开发者参考。

xx56789的博客 769

bochs调试方法

bochs一般用法 bochs是一个开源x86虚拟机软件。在他的实现中定义了各种数据结构来模拟硬件,用软件模拟硬件速度慢。 bochs的硬件调试体现在: 1)可以查看页表、gdt、idt等数据结构 2)可以查看栈中数据 3)可以反汇编任意内存 4)实模式、保护模式互相变换时提醒 5)中断发生时提醒 bochs中x和xp命令都是用来查看内存的,它们两个的区别在于x命令用于查看线性地址,而xp用来查看...

AlexSmoker的博客 3246

深入剖析Zynq AMP模式下CPU1中断响应机制:从原理到创新实践

在异构计算领域,Zynq-7000系列SoC的AMP(Asymmetric Multiprocessing)模式堪称多核编程的瑞士军刀。独立运行环境:CPU0运行Linux,CPU1运行FreeRTOS或裸机程序硬件资源独占:CPU0管理DDR,CPU1使用OCM(片上内存)中断隔离:默认所有中断路由到CPU0这种架构非常适合需要实时响应的工业控制系统——比如用CPU0处理网络通信,CPU1负责电机控制。AMP模式下中断路由的底层原理多维度性能优化技巧工业级可靠性的实现方案。

QQ_778132974的博客 484

bochs调试最常用的指令

这个表格中的指令是目前我们进行bochs调试最常用的指令: Table 1. 部分Bochs调试指令 行为 指令 举例 在某物理地址设置断点 b addr b 0x30400 显示当前所有断点信息 info break info break 继续执行,直到遇

xueli1991的博客 775

PostgreSQL核心原理:数据库崩溃恢复的唯一真相详解

PostgreSQL崩溃恢复机制通过WAL日志确保数据一致性和持久性。核心流程包括:触发恢复(非正常关闭时)、读取控制文件获取检查点LSN、顺序扫描WAL日志进行Redo阶段重做已提交事务、利用MVCC标记未提交事务为ABORTED实现逻辑撤销,最后执行检查点完成恢复。该机制依赖WAL原子性、检查点锚点和无Undo的可见性模型三大支柱,保证即使系统崩溃也能恢复到逻辑一致状态。关键设计包括延迟写入、LSN顺序控制和FPW防部分写,最终通过确定性重放实现ACID特性。

数据知道的博客 2643

多模型动态路由(Fusion):从“算力霸权”到“架构分权”的工程范式转型

多模型动态路由(Multi-Model Dynamic Routing)是指在多个大语言模型之间,根据请求特征、资源约束和业务目标,动态选择最优模型或模型组合的技术范式。传统网关擅长管理请求流量,但不理解“任务类型”。而AI路由层需要对每个请求进行语义理解、能力匹配和成本评估。从“算力霸权”到“架构分权”,这不是技术的线性演进,而是工程范式的根本转型。过去三年,开发者的核心能力是“选对模型”——在GPT、Claude、Gemini之间做出正确选择。

ZDQ58818的博客 65

bochs调试指令

先看下bochs的简介吧,百度的: Bochs是一个x86硬件平台的开源模拟器。它可以模拟各种硬件的配置。Bochs模拟的是整个PC平台,包括I/O设备、内存和BIOS。更为有趣的是,甚至可以不使用PC硬件来运行Bochs。事实上,它可以在任何编译运行Bochs的平台上模拟x86硬件。通过改变配置,可以指定使用的CPU(386、486或者586),以及内存大小等。一句话,Bochs是电脑里的

lp19911126的博客 1145

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Bochs相关

Bochs相关

T_Megan的博客 593

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Bochs调试指令

bochs调试FAQ: 1.       Q:如何从引导扇区开始设置断点? A: BIOS被载入内存中运行,其引导扇区的地址一般都是在0x7c00,因为在实模式下,逻辑地址和物理地址是一一对应的, 所以我们可以在启动bochs调试的命令行下输入         pb 0x7c00 或者 vb 0:0x7c00 就着输入         c bochs就会在0x7c00处停下   2

多媒体编程、网络编程、系统编程、网络安全编程、驱动编程 782

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

linux如何运行bochs,使用Bochs调试Linux内核初级入门

使用Bochs调试Linux内核初级入门使用Bochs调试Linux内核初级入门之所以能用Bochs调试Linux内核,还是因为Bochs做了一些工作;安装完成以后如下;如果使用bochs.exe加载操作系统映像,就是在虚拟机中运行操作系统;如果使用bochsdbg.exe加载操作系统映像,就同时附带有调试命令,可进行调试;如下图,.bxrc文件,是欲加载的操作系统映像的配置文件;我这个是Boch...

weixin_39884738的博客 720

Bochs 调试指令

  Bochs就像一台真机一样,处理器在加电之后,要开始取指令并执行指令。 jmpf f000:e05b ;转移目标位置ROM-BIOS   如图在左侧显示了该指令所在的物理内存地址 0x0000fffffff0。   但为什么是0x0000fffffff0?因为和8086不同,现代处理器在加电时,段寄存器CS的内容为,0xF000,指令指针寄存器IP的内容为0xFFF0,这就使得处理器地址线...

Cdreamfly的博客 1006
上一篇: Bochs常用调试命令
下一篇: 关于Bochs虚拟硬盘的启动问题
guozuofeng
博客等级 码龄9年 60粉丝 151原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值