⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 用bochs调试保护模式程序 .txt

📁 会变语言实现的一些程序
💻 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 + -