📄 用bochs调试保护模式程序 .txt
字号:
用bochs调试保护模式程序
作者:Zoologist 于2007-9-16上传
--------------------------------------------------------------------------------
最近一段时间,特别流行“自己动手写操作系统”,上次我在国内操作系统论坛上浏览贴子,其中一个主题就是让大家报一下自己的年龄,结果是从毕业五六年的到高中生都有,最令人惊讶的莫过于一个人声称自己小学六年级。莫非编写操作系统也要“从娃娃抓起”?
不过,只要脸皮够厚,编写操作系统也是世界上最简单的事情:首先是“挖墙脚”,随便找一个*nix,去掉他们的copyrigh,加上自己的logo,直接就可以声明这是我的了;如果想再弄得“正经”一点,还需要来个什么“二进制混叠”,这叫“掺沙子”;倘若还有人不服,再出来让他单挑,给他“甩石头”……
小的操作系统,完全可以抛开什么“保护模式”“处理器特性”,安静的呆在640K下,
老老实实的一个任务一个任务的运行。不过稍微复杂一些就不得不涉及到保护模式的概念了。问题是保护模式无法使用普通的工具进行动态调试,无论是debug32还是传说中的 Soft ICE for DOS,只要一抬腿,准备迈入保护模式的大门,肯定是要重新启动的。
Bochs是一个虚拟机,就是专门为调试操作系统这样的事情设计的,有For Win 和 For Linux版本。它本身自带了一个调试器:bochsdbg 我们今天就主要靠它完成工作。
关于这个软件的使用,在此就不介绍了。主要说一下如何进行保护模式的程序的调试。
第一个问题是:Bochs是为了调试保护模式的操作系统设计的。就是说,从引导过程开始的程序,而不是已经进入了纯dos,再进入保护模式的程序。对于这个问题,我们的思路是,设置好断点,进入dos之后,让我们的程序触发中断即可…….
查一下Bochs的手册,上面有内存读写的中断,于是首先选择了这样的指令:
watch read [addr]
但是随后发现,不知道为什么,程序无法触发这样的中断。也许是因为addr给出的地址是线性地址,而我们的程序,最开始,只能触发[seg:ofs]这样的地址。(说明:在Bochs中,即使这两种格式即使指向相同的物理地址,对断点来说也是不同的)。
第二个问题就是:设置一种容易实现的断点,最终,发现Bochs在执行断点上是可以区分“段+偏移”和“线性地址”的。我们只要设置一个绝对执行的位置就可以了。
编写程序如下:
jmpseg equ 40h ;打算修改的段
mov ax,jmpseg
mov ds,ax ;ds=打算修改的段
xor si,si
mov ax,ds:[si] ;修改 ds:0 的位置
push ax ;安全起见,在堆栈保存这个位置的值
mov byte ptr ds:[si],0cbh ;将这个位置设置为 retf
push cs
push offset back ;设置返回位置
db 0eah ;远跳转
dw 0
dw jmpseg
back: ;跳过去后马上回来
pop ax
mov ds:[si],ax ;再恢复下面就是继续执行了
思路就是我们在内存中挖出一个绝对位置的“洞”,然后程序跳进这个洞,这个洞里面放的是返回,一下又回来。只要我们监视这个洞就好了。当然,安全起见,这个洞最后还要再填上。另外,这个洞选择的位置,上面程序选择的是[40:0h]位置,这个位置是存放BIOS 报告操作系统信息的位置,纯数据。
这段程序是用来添加在你的保护模式程序的运行的起始位置。比如我的程序做好了命名为bo.asm,编译为bo.exe。格式化一张软盘,放上dos系统的那三个必要的文件,拷上bo.exe. 之后,将软盘做成img文件(我一般用hdcopy)。这个img要丢到bochs的目录下。运行bochsdbg加载img之后,会在模拟第一条指令开始的时候停下来。输入vb 0x40:0 下断点输入 c 让它继续执行,模拟器这边就进入dos了。运行 bo.exe 看,停在我们设置的断点了。 这个位置也算是程序的开始,下面可以使用s命令跟踪了~
参考资料:
1.关于编写操作系统的一些方法,可以参考:《自己动手写操作系统》于渊 编著
2.关于保护模式的介绍,可以参考《80x86汇编语言程序设计教程》 杨季文(传说中的黑皮书)或者电子版图书《80x86保护模式系列教程》作者:李彦昌(美中不足的是它上面这两份资料内容基本相同,程序也都是Tasm的,用Masm直接编译有问题,可以参考 http://www.begin.org.cn 上面提供的部分Masm版本的例子)
3.关于BIOS接口方面的图书,可以参考《PC技术内幕》,这本书是唯一的涉及底层的,非常全面的图书。
4.Bochs 下载 http://bochs.sourceforge.net/
Zoologist 2007 年8月07 日 编写
--------------------------------------------------------------------------------
<<<上一篇 欢迎访问AoGo汇编小站:http://www.aogosoft.com 下一篇>>>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -