【从头开始写操作系统系列】使用 Bochs 调试操作系统

在上一篇文章《环境搭建以及第一个Hello-World》中,笔者讲了如何安装 bochs 以及运行一个 helloworld 操作系统,但是使用上一篇文章中的方法安装的 bochs 是不支持调试的,下面我讲介绍如何使用源码编译的方法来安装 bochs,以及使用 bochs 来调试操作系统。

编译安装 Bochs

  • 下载 bochs 源码

http://sourceforge.net/projects/bochs/files/bochs/2.6.8/

  • 解压之后进入该目录,进行配置

sudo ./configure --enable-debugger --enable-disasm

  • 编译安装

sudo make

sudo make install

这时,bochs 就编译安装完成了,接下来我们继续使用上一篇文章中所使用的软盘映像。

用 Bochs 调试操作系统

启动带有调试的 bochs 之后,我们会看到bochs 会进入一个选项界面,我们选择『6.Begin simulation』就可以开始调试了

部分 Bochs 调试指令

行为 指令 举例
在某物理地址设置断点 b addr b 0x7c00
显示当前所有断点信息 info break info break
继续执行,直至遇到断点 c c
单步执行 s s
单步执行(遇到函数跳过) n n
查看寄存器信息 info cpu
r
fp
sreg
creg
info cpu
r
fp
sreg
cre
查看堆栈 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

- 我们可以使用 help 来查看调试帮助

举例

采用上一篇文章中的镜像来进行调试

<bochs:1> b 0x7c00
<bochs:2> c
00000003305i[BIOS  ] $Revision: 1.257 $ $Date: 2011/01/26 09:52:02 $

……

00014041008i[BIOS  ] Booting from 0000:7c00

(0) Breakpoint 1, 0x00007c00 in ?? ()
Next at t=14041069
(0) [0x000000007c00] 0000:7c00 (unk. ctxt): mov ax, cs                ; 8cc8

<bochs:4> x /64xb 0x7c00
[bochs]:
0x00007c00 <bogus+       0>:    0x8c    0xc8    0x8e    0xd8    0x8e    0xc0    0xe8    0x02
0x00007c08 <bogus+       8>:    0x00    0xeb    0xfe    0xb8    0x1e    0x7c    0x89    0xc5
0x00007c10 <bogus+      16>:    0xb9    0x0d    0x00    0xb8    0x01    0x13    0xbb    0x0c
0x00007c18 <bogus+      24>:    0x00    0xb2    0x00    0xcd    0x10    0xc3    0x48    0x65
0x00007c20 <bogus+      32>:    0x6c    0x6c    0x6f    0x2c    0x20    0x77    0x6f    0x72
0x00007c28 <bogus+      40>:    0x6c    0x64    0x21    0x00    0x00    0x00    0x00    0x00
0x00007c30 <bogus+      48>:    0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
0x00007c38 <bogus+      56>:    0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00

<bochs:5> n
Next at t=14041070
(0) [0x000000007c02] 0000:7c02 (unk. ctxt): mov ds, ax                ; 8ed8

<bochs:6> trace-reg on
Register-Tracing enabled for CPU0

<bochs:7> n
Next at t=14041071
eax: 0x00000000 0
ecx: 0x00090000 589824
edx: 0x00000000 0
ebx: 0x00000000 0
esp: 0x0000ffd6 65494
ebp: 0x00000000 0
esi: 0x000e472c 935724
edi: 0x0000ffac 65452
eip: 0x00007c04
eflags 0x00000082: id vip vif ac vm rf nt IOPL=0 of df if tf SF zf af pf cf
(0) [0x000000007c04] 0000:7c04 (unk. ctxt): mov es, ax                ; 8ec0

<bochs:8> c
……


版权声明:本文为博主原创文章,未经博主允许不得转载。

文章来源:http://blog.luoyuanhang.com

版权声明:本文为博主原创文章,未经博主允许不得转载。(文章来源:http://blog.luoyuanhang.com)

时间: 2024-10-12 07:16:18

【从头开始写操作系统系列】使用 Bochs 调试操作系统的相关文章

从头开始写项目Makefile(六):参数传递、条件判断、include

[版权声明:转载请保留出处:blog.csdn.net/gentleliu.Mail:shallnew at 163 dot com] 在多个Makefile嵌套调用时,有时我们需要传递一些参数给下一层Makefile.比如我们在顶层Makefile里面定义的打开调试信息变量DEBUG_SYMBOLS,我们希望在进入子目录执行子Makefile时该变量仍然有效,这是需要将该变量传递给子Makefile,那怎么传递呢?这里有两种方法: 1.     在上层Makefile中使用"export&qu

【百度地图-安卓SDK】从头开始写android程序

首先确保有这四个文件 安装jdk 先安装android开发SDK(并不只是为eclipse服务的),即运行installer_r15-windows,指定存储目录,然后就安装,安装到后期指定你要安装的android的版本等,例如我选1.6的版本,继续安装,很快就能结束. 解压eclipse到任意地方,运行eclipse.exe,点help点install new software,选择 http://dl-ssl.google.com/android/eclipse/ 注意不能是https 然后

手把手教你写Windows 64位平台调试器

本文网页排版有些差,已上传了doc,可以下载阅读.本文中的所有代码已打包,下载地址在此. -------------------------------------------------------------------------------------------------------------------------------------------------------------- 手写一个调试器有助于我们理解hook.进程注入等底层黑客技术具体实现,在编写过程中需要涉及大

给jdk写注释系列之jdk1.6容器(6)-HashSet源码解析&amp;Map迭代器

今天的主角是HashSet,Set是什么东东,当然也是一种java容器了. 现在再看到Hash心底里有没有会心一笑呢,这里不再赘述hash的概念原理等一大堆东西了(不懂得需要先回去看下HashMap了),需要在啰嗦一句的是hash表是基于快速存取的角度设计的,也是一种典型的空间换时间的做法(这个在分析HashMap中都有讲过).那么今天的HashSet它又是怎么一回事的,他的存在又是为了解决什么问题呢? 先来看下Set的特点:Set元素无顺序,且元素不可以重复. .想到了什么?无顺序,由于散列的

从头开始写项目Makefile(三):变量的使用

[版权声明:转载请保留出处:blog.csdn.net/gentleliu.Mail:shallnew at 163 dot com] 仔细研究我们的之前Makefile发现,我们还有改进的地方,就是此处: target_bin : main.o debug.o ipc.o timer.o tools.o >---gcc -o target_bin main.o debug.o ipc.o timer.o tools.o 如果增加一个源文件xx.c的话,需要在两处或多处增加xx.o文件.我们可以

从头开始写项目Makefile(零):前言

[版权声明:转载请保留出处:blog.csdn.net/gentleliu.Mail:shallnew at 163 dot com] 一不小心工作三年了,也就是写了三年代码了,码农生活过的真快.最近发现我们项目的Makefile不够好,于是着手改了一下,以前Makefile写好后就很少动它了,直接在项目之间拷来拷去直接拿来用,这次重新修改项目Makefile,发现自己又学到不少东西,于是乎决定总结一下记录下来与各位苦逼的程序猿一道分享一下. 其实各大论坛博客已经有很多关于Makefile的文章

趣写算法系列之--匈牙利算法(真的很好理解)

[书本上的算法往往讲得非常复杂,我和我的朋友计划用一些简单通俗的例子来描述算法的流程] 匈牙利算法是由匈牙利数学家Edmonds于1965年提出,因而得名.匈牙利算法是基于Hall定理中充分性证明的思想,它是部图匹配最常见的算法,该算法的核心就是寻找增广路径,它是一种用增广路径求二分图最大匹配的算法. -------等等,看得头大?那么请看下面的版本: 通过数代人的努力,你终于赶上了剩男剩女的大潮,假设你是一位光荣的新世纪媒人,在你的手上有N个剩男,M个剩女,每个人都可能对多名异性有好感(-_-

从头开始写项目Makefile(四):伪目标

[版权声明:转载请保留出处:blog.csdn.net/gentleliu.Mail:shallnew at 163 dot com] 一般情况下,Makefile都会有一个clean目标,用于清除编译过程中产生的二进制文件.我们在第一节的Makefile就用到了这个 clean目标,该目标没有任何依赖文件,并且该目标对应的命令执行后不会生产clean文件. 像这种特点目标,它的规则所定义的命令不是去创建文件,而仅仅通过make指定目标来执行一些特定系统命令或其依赖为目标的规则(如all),称为

给jdk写注释系列之jdk1.6容器(13)-总结篇之Java集合与数据结构

是的,这篇blogs是一个总结篇,最开始的时候我提到过,对于java容器或集合的学习也可以看做是对数据结构的学习与应用.在前面我们分析了很多的java容器,也接触了好多种常用的数据结构,今天我们就来总结下这些内容. 下面我们以数据结构的维度来总结下,在Java集合的实现过程中,底层到底使用了哪些常用的数据结构中,他们分别又有什么特点.      1. 数组(Array) 结构说明:在程序设计中,为了处理方便, 把具有相同类型的若干变量按有序的形式组织起来.这些按序排列的同类数据元素的集合称为数组