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=22
http://blog.csdn.net/yxin1322/article/details/664077

用bochs调试自己写的系统引导代码相关推荐

  1. bochs调试方法与指令详解

    bochs调试FAQ: 一 基本调试命令 1.       Q:如何从引导扇区开始设置断点? A: BIOS被载入内存中运行,其引导扇区的地址一般都是在0x7c00,因为在实模式下,逻辑地址和物理地址 ...

  2. Bochs调试及相关仿真工具的使用方法

    关键词:bochs,自己动手写操作系统 一 安装具有调试功能的bochs 注意:安装bochs以后,常常发现bochs不能调试,原因如下: <span style="font-fami ...

  3. Bochs调试Linux内核5 - 启动过程调试 - 认识Bootsect.S

    先参阅 Bochs调试Linux内核 - 定位内核中的变量或数据结构_bcbobo21cn的专栏-CSDN博客​​​​​​ ,运行到<bochs:1>,输入vbreak 0x0000:0x ...

  4. Bochs调试Linux内核初步学习 - 3

    接此: https://blog.csdn.net/bcbobo21cn/article/details/120480214 前面尝试了在线性地址下断点,都是失败:下面再研究一下: 首先看一下0.11 ...

  5. Bochs调试Linux内核 - 定位内核中的变量或数据结构

    到此网址下载, http://oldlinux.org/Linux.old/bochs/linux-0.12-080324.zip 解压以后如下: 第一个文件是Bochs安装文件:安装之:安装之后如下 ...

  6. deepin系统引导_【转】deepin系统启动流程

    出自https://zhuanlan.zhihu.com/p/67118407 deepin系统整个的启动流程到底是怎么样子的?以前曾被同事缠问过类似的问题.遇到这种宏大而又不着边际的问题,我的回复往 ...

  7. 系统引导文件之 boot.ini

    Windows NT类的操作系统,也就是Windows NT/2000/XP中,有一个特殊文件,也就是"BOOT.INI"文件,这个文件会很轻松地按照我们的需求设置好多重启动系统. ...

  8. 高通平台环境搭建,编译,系统引导流程分析 .

    1.高通平台android开发总结 1.1 搭建高通平台环境开发环境 在高通开发板上烧录文件系统 建立高通平台开发环境 高通平台,android和 modem 编译流程分析 高通平台 7620 启动流 ...

  9. [技术文档] 一劳永逸,用USB设备制作多系统引导

    2019独角兽企业重金招聘Python工程师标准>>> [技术文档] 一劳永逸,用USB设备制作多系统引导  [复制链接] binghe27 艺有所成 当前离线 主题 8  UID ...

最新文章

  1. 01.Python基础-3.集合容器
  2. 双绞线、同轴电缆和光纤电缆的区别
  3. ubuntu字符界面login_Ubuntu字符界面输入密码始终提示错误 login incorrect 解决办法...
  4. 成功解决PermissionError: [WinError 5] 拒绝访问 \lib\\site-packages\\h5py\\_errors.cp38-win_amd64.pyd‘
  5. 修改linux下全局数据库名,linux/unix下修改oracle数据库实例名的方法
  6. 远程拷贝、查看端口、vim常见快捷键、查找替换命令、grep命令、查看存储空间的命令、chkconfig命令、系统自动启动级别、主机名配置、IP地址配置、域名映射、防火墙设置
  7. Couldn't find leader offsets for Set([smt,0], [smt,1], [smt,2])
  8. fastdfs java client_GitHub - happyfish100/fastdfs-client-java: FastDFS java client SDK
  9. Android Timer编写方式深解
  10. 确保客户端可以接收到服务端的异常serviceDebug includeExceptionDetailInFaults=true
  11. Python+tkinter实现超时无键盘操作自动退出
  12. 【领英如何一键批量有效地加好友?】
  13. c51单片机中断详解--适合初学者
  14. defy翻新机鉴别方法
  15. C++迷宫最短路径问题BFS
  16. Abbexa低样本量鸡溶菌酶 C (LYZ) ELISA 试剂盒
  17. s32ds 路径_S32DS 使用 tips--工程属性配置(编译选项和C编译器、汇编器及链接器设置)...
  18. python中forward(200)什么意思_Python中的Phyllotaxis模式| 算法植物学的一个单位
  19. 开源爬虫神器,Playwright vs Puppeteer 对比,你应该选择哪个?
  20. Prometheus

热门文章

  1. hdu1529 差分约束(好题)
  2. ACM JAVA大数
  3. 【Android 高性能音频】OboeTester 音频性能测试应用 ( Oboe 输出测试参数 | API 选择 | 音频输出设备选择 | 采样率 | 通道 | 采样格式 | 播放偏好 )
  4. 【Android 应用开发】Paint 图形组合 Xfermod 简介 ( 图形组合集合描述 | Xfermod 简介 | PorterDuff 简介 )
  5. Java三大特性之封装
  6. jsp经验-Filter
  7. mybatis入门-第一个程序
  8. Struts2 访问web元素
  9. 《大道至简》一书第三版,与编辑就本书写作风格的讨论
  10. 机器人动力学建模实例(二):三连杆机械臂