用bochs调试自己写的系统引导代码
1 安装和配置bochs
首先从bochs.sourceforge.net里面把BOCHS给download下来,鉴于Windows的普及,仅仅谈BOCHS在win下的使用方法,其实在其它的OS中方法差不多,不过我仅仅在Window和Linux下安装使用过。
在bochs.sourceforge.net里面把Bochs-2.6.1.exe给download下来,双击就开始安装。这软件不大,安装完才4兆多,当然,这是标准安装,如果你选择的是完全安装,则比标准安装多个DLX linux demo这个OS,如果你是第一次使用BOCHS,建议你用完全安装,装完 ,现不用着急学会BOCHS的一大堆配置,可以先用用它自带的这个OS,感受下BOCHS。
在BOCHS的目录里面有个dlxlinux子目录,进去,双击bochsrc,就进入下图:
这dlx linux是系统自带的,如果自己想用别的操作系统该怎么办呢?嘿嘿,别着急,BOCHS的开发者们已经为我们考虑好了,bochs.sourceforge.net里面,你能找到很多img文件,这些都是开发者们做好的镜像文件了,嗯,说白了,就等于是机子的硬盘了,咱们仅仅需要的就是配置好,能运行就可以。
通常我喜欢的方法是改配置文件,这方法似乎也是BOCHS的使用者们通常喜欢采用的吧,我详细介绍这方法。
比方说,咱们想用msdos这个操作系统,从网上找个msdos的启动盘的镜像文件,如果找不到的话,可以自己做个,方法:首先做个启动盘镜像文件,取名boot.img这就做好了,方法可以参考我以前写的”用vmware运行简单的引导代码“或者也可以用dos下的hd-copy这个工具做出来。然后单独建立个目录(随意地方)msdos,然后把bochs安装目录里面的bochsrc-sample.txt这个文件复制到msdos这个目录里面,并改名,注意,后缀最好是bxrc,这个后缀是bochs可以识别的。bochsrc-sample.txt这个文件是配置文件模板,我们就是在这个模板的基础上修改参数成为我们的操作系统所使用的配置文件。
第一个参数:floppya这是A驱动器的参数,当然,自然也是模拟的。通常所用的软驱是1.44MB的,因此后面跟的参数是1_44=/dev/fd0 注意,这个/dev/fd0必须是你的软驱的镜像,比方说咱们的msdos就是boot.img,你把/dev/fd0改成1_44=boot.img就可以。当然,也可以模拟其它的软驱,如2.88M,720K,360K的,这非常的有用!后面的参数status标明软驱的状态,只能有两个inserted(软盘插入软驱),ejected(软盘未插入软驱)。
第二个参数:boot,这是启动的驱动器,它的频率也比较高。它可以带的参数有floppy(软驱启动),disk(磁盘启动),cdrom(光驱启动)。
这两个参数是最最常用的,几乎是必用吧。
第三个参数:ata0,ata1,ata2,ata3,这应该算是四个参数吧,没事别改它,反正我是没改过它,还常常吧后面的ata1,ata2,ata3给注释掉,仅仅留ata0。
第四个参数:ATA[0-3]-MASTER,ATA[0-3]-SLAVE,这就有用了,指定硬盘或光盘的参数,并指明它是主盘还是从盘。标准的参数是ata0-master: type=disk, mode=flat, path="30M.sample", cylinders=615, heads=6, spt=17,type参数只能是两者,disk(硬盘),cdrom(光盘),mode这个参数镜像类型,它仅仅是针对磁盘才有效,有几种,flat(一个文件的布局)concat(多个文件的布局)external(开发者指定的,通过C++的类BOCHS就是C++开发的)dll(开发者指定的,通过dll文件)vmware3(wmware3使用的硬盘镜像)。还有几个其它的不介绍;path是指定硬盘或是光盘镜像的文件。Cylinders,Heads,Spt这几个参数通过这名字就能知道了。
知道这3个参数(除了第三个),基本上就能应付大多数的了。
下面安装模板中的参数的位置,一个一个参数介绍,由于不常用,仅仅介绍下,不会象前面纳几个参数那样详细介绍,除非我觉得特别有用,或是使用过程中用过了。
config_interface:关于配置文件的接口,嗯,其实就是在BOCHS运行过程中改变配置的界面。
display_library:图形库。
Romimage:ROM BIOS
Megs:内存
optromimage [1-4]:ROM镜像的选项
vgaromimage:VGA ROM BIOS
floppya:软驱A
floppyb:软驱B
ata[0-3]:硬盘或光驱的ata控制器
ATA[0-3]-MASTER, ATA[0-3]-SLAVE:ata设备的类型
Boot:启动驱动器
Ips:模拟的频率,有些时候特别有用,比如我装minix1.5的时候,在login的时候,如果机子高档的话,输入passwd的时间特别短,这时候就需要调整频率了。当然,听说软件如果对实时控制特别研的时候,也必须改它。
Clock:时钟
floppy_bootsig_check:是否检查软盘引导时候的引导的标记0xaa55
log:调试用的日志
logprefix:日志记录的格式
panic:Bochs这个软件本身错误的信息,如配置文件出错或是模拟错误如不支持图形模式。
Error:Bochs遇到不能模拟的情况,如出现非法指令。
Info:一些不常出现的情况。
Debug:主要用来开发Bochs这个软件时报告情况用的。
以上四个参数(panic,error,info,debug)是Bochs运行时遇到的不同等级的情况。
debugger_log:调试器输出错误的文件。
com1:串行端口。
parport1:并行端口。
sb16:声卡。
vga_update_interval:VGA卡刷新率。
ne2k:网卡。
2 用bochs运行引导代码
通过前面参数的介绍,我们来配置和运行自己写的系统引导代码,并且通过前面的介绍我们已经建立了一个叫msdos的文件夹,里面包含配置文件和软盘镜像文件。
首先是设置floppya参数指向自己制作的包含引导代码的软盘镜像boot.img,具体配置如下:
floppya: 1_44=boot.img, status=inserted
然后是boot参数的设置,我们直接用软盘引导,具体配置如下:
boot: floppy
其它参数都用默认就好,然后直接双击bochsrc-sample.bxrc文件就可以运行了,如下图所示:

可以看出引导代码的输出语句”load root directory“,表明运行成功!!!
3 用bochs调试代码
直接在bochs的安装目录中双击bochsdbg文件,然后选择加装前面我们的配置文件bochsrc-sample.bxrc,点开始就进入调试模式了,如下图所示:

此时是暂停在BIOS中。而我们的代码是从0x7C00位置开始的,所以先要在那里设一个断点,然后继续运行到断点:

接下来可以用命令help来查看调试系统的各种基本命令,这里给出了一些常用的命令
3.1 执行控制指令
c/cont/continue
连续执行
s/step/stepi [count]
执行count条指令,默认为1条,会跟进到函数和中断调用的内部
p/n/next [count]
执行count条指令,默认为1条,但跳过函数和中断调用
Ctrl+C
停止执行,并回到命令行提示符下
q/quit/exit
退出调试和执行
3.2 断点设置命令
vb/vbreak seg:offset
在虚拟地址上设置指令断点,其中seg和offset可以是以0x开始的十六进制数,或十进制,或者是以0开头的八进制数
lb/lbreak addr
在线性地址上设置断点,addr同上面的seg和offset
b/break/pb/pbreak addr
在物理地址上设置断点
info break
显示当前所有断点的信息
d/del/delete n
删除一个断点
3.3 内存操作指令
x /nuf addr
检查位于线性地址addr处的内存内容
xp /nuf addr
检查位于物理地址addr处的内存内容
其中参数n、u、f分别表示:
n为要显示内存单元的计数值,默认为1
u表示单元大小,默认值为w
b(bytes) 1字节
h(halfwords) 2字节
w(words) 4字节
g(giantwords) 8字节
f为显示格式,默认为x
x(hex) 显示为十六进制数
d(decimal) 显示为十进制数
u(unsigned) 显示为无符号十进制数
o(octal) 显示为八进制数
t(binary) 显示为二进制数
c(char) 显示为对应的字符
3.4 信息显示和CPU寄存器操作命令
r/reg/regs/registers
列表显示CPU寄存器及其内容
set $reg=val
修改某寄存器的内容。除段寄存器和标志寄存器以外的寄存器都可以修改,如set $eax=0x01234567
creg
列出所有的CR0-CR4寄存器
sreg
列出CPU全部状态信息,包括各个段选择子(cs,ds等)以及ldtr和gdtr等。
print-stack
打印堆栈情况。
info tab
显示页表
3.5 反汇编命令
u/disasm/disassemble start end,反汇编给定线性地址范围的指令。也可以是u /10 反汇编从当前地址开始的10条指令。如下图

总结:bochs的调试感觉和gdb对汇编的调试很类似,所以用起来挺方便的,而且对于开发操作系统的人来说,bochs的调试功能无疑是很强大的,可以直接看到cup的执行情况,以及各个寄存器和内存单元的内容,这对于调试程序、掌握程序的运行情况是很有帮助的。
参考:https://cms.hit.edu.cn/mod/wiki/view.php?pageid=22http://blog.csdn.net/yxin1322/article/details/664077
用bochs调试自己写的系统引导代码的更多相关文章
- 使用bochs调试汇编程序
使用bochs调试汇编程序 前面我们已经搭建好了bochs的环境,并且将我们的汇编程序写入了硬盘里面,现在我们来看看如何通过bochs来调试我们的程序. 前文:https://www.cnblogs. ...
- 利用bochs调试Linux 0.11内核
引导程序调试软件bochs,跟配套的linux0.11内核img下载地址分别是: http://sourceforge.net/projects/bochs/http://www.oldlinux.o ...
- 系统引导文件之 boot.ini(有很多参数)
Windows NT类的操作系统,也就是Windows NT/2000/XP中,有一个特殊文件,也就是“BOOT.INI”文件,这个文件会很轻松地按照我们的需求设置好多重启动系统. “BOOT.INI ...
- 引用 xp系统引导修复(转载)
引用 3592wangxiaoxi 的 xp系统引导修复(转载) 原文来自百度知道a12424106关于“急需xp系统引导方面的知识!”的回复. XP系统的引导过程 如果想学习排除计算机系统故障,首先 ...
- S04_CH03_QSPI烧写LINUX系统
S04_CH03_QSPI烧写LINUX系统 3.1概述 3.2搭建硬件系统 本章硬件工程还是使用<S04_CH01_搭建工程移植LINUX/测试EMMC/VGA>所搭建的VIVADO工程 ...
- ARM开发板实现双系统引导的一种方法——基于迅为iTOP-4412开发板
前言 本文所用的uboot代码为迅为官方提供,开发板是迅为iTOP-4412开发板.本文如有错误,欢迎指正. 首先,我们确定一下系统启动的流程:首先启动uboot,uboot启动内核并挂载rootfs ...
- linux系统引导过程
linux系统引导过程 linux-0.11引导时,将依次运行BIOS程序.bootsect.s.setup.s和head.s,完成引导过程后进入到main函数运行.BIOS完成硬件的检查与初始化等工 ...
- Win7&Ubuntu12.04 双系统引导问题
周末的时候手贱,重装系统,导致原来的ubuntu12.04和win7双系统的引导不见了,所以在此进行一下说明,如何修复. 1. win7和ubuntu12.04双系统引导修复 问题描述: 在重装 ...
- 修改win8系统中启动管理器的系统引导信息
最近用某软件做了个启动U盘,软件安装在电脑上,启动盘很快做完了,结果重启电脑的时候发现悲剧,windows启动后会显示出一个系统引导菜单,显示有3秒倒计时但是倒计时结束依然不能自动进入系统.. 然后. ...
随机推荐
- OpenVPN的ipp.txt为空不生效的问题
1.ipp.txt是分配固定IP使用的,但在tun模式下里面的ip地址不是写使用着的IP,而是30位子网中没有列举出来的启动一位,比如我要给客户机分配为10.8.0.6的IP,那么它这个文件填写的是1 ...
- Ubuntu 中启用 root 帐号
参考:http://linuxtoy.org/archives/howto_enable_ubuntu_root_account.html 如果你实在需要在 Ubuntu 中启用 root 帐号的话, ...
- excel宏整理
工作以后发现excel很强大,用好excel已经成功工作中很重要的一部分内容,最近写了一些宏, 整理如下: 根据excel生成sql脚本的sc_template Sub GenSCTemplateFi ...
- vuex 基础:教程和说明
作者注:[2016.11 更新]这篇文章是基于一个非常旧的 vuex api 版本而写的,代码来自于2015年12月.但是,它仍能针对下面几个问题深入探讨: vuex 为什么重要 vuex 如何工作 ...
- MySQL主从复制的原理及配置方法(比较详细)
MySQL 的数据库的高可用性的架构大概有以下几种:集群,读写分离,主备.而后面两种都是通过复制来实现的.下面将简单介绍复制的原理及配置,以及一些常见的问题 一.复制的原理 MySQL 复制基于主服务 ...
- 搭建《深入Linux内核架构》的Linux环境
作者 彭东林 pengdonglin137@163.com 软件 Host: Ubuntu14.04 64 Qemu 2.8.0 Linux 2.6.24 busybox 1.24.2 gcc 4.4 ...
- python测试开发django-33.admin后台一对一关系OneToOneField
前言 假如有一张表(Card)记录用户的卡号信息和用户名,现在需要新增一个小功能,记录用户的手机号,邮箱和住址等更多信息. 为了不影响原来的表设计,可以新增一张表(CardDetail),专门记录用户 ...
- ios开发经常使用RGB色值
iOS中RGB经常使用的色值,同一时候可将对颜色的设置定义成宏,方便开发应用,如: // RGB颜色转换(16进制->10进制) #define UIColorFromRGB(rgbValue) ...
- SharePoint Online 创建和使用视图
前言 本文介绍如何在Office 365中创建和使用视图. 正文 首先,解释一下什么是SharePoint站点视图,所谓视图,就是列表的一个呈现形式,包含特定的栏.排序.筛选.分组等特性,我们通常创建 ...
- 豪斯医生第一季/全集House M.D 1迅雷下载
豪斯医生 第一季 House M.D. Season 1 (2004)本季看点:态度无礼,表情凶恶,跛足拄着一根藤棍,永远是牛仔裤运动鞋的便装打扮而不是整洁的白大褂,普林斯顿大学附属医院的格雷戈·豪斯 ...