2

我正在编写一个基本的引导加载程序,直到我有某种环境,我可以在其中编写一个简单的 C 程序,将其写入硬盘(无文件系统)并运行它。这就是我想做的。

这是我到目前为止所做的。

阶段1:

  1. 设置堆栈和段寄存器
  2. 将视频模式更改为 640x480x8
  3. 将下一个扇区读入内存
  4. 远远跳到它

第 2 阶段:

  1. 再次设置堆栈和段(我需要再次这样做吗?)
  2. 设置 GDT(这部分让我很困惑 - TBH 我只是复制/粘贴)
  3. 启用 A20 门
  4. 进入保护模式

我之前已经成功进入保护模式,但由于某种原因现在我不能。当我尝试时,Bochs 进入引导循环,但据我所知,该代码与有效的旧代码相同。

我尝试注释掉启用 A20 和 GDT 的调用,但这并没有阻止引导循环。

我在 PasteBin 上有我的整个引导加载程序代码,但我也会在这里放一些东西:


设置堆栈:

CLI           ;Disable interrupts while setting up the stack
XOR AX,AX     ;Real mode flat memory model
MOV DS,AX
MOV ES,AX
MOV FS,AX
MOV GS,AX
MOV SS,AX
MOV SP,0xFFFF
STI           ;Enable interrupts

启用 A20:

MOV AX,0x2401
INT 0x15
RET

进入保护模式:

MOV EAX,CR0
OR  EAX,1
MOV CR0,EAX

GDT代码有点啰嗦,不是我自己写的。但是,正如我所说,不加载 GDT 并不能阻止以后的引导循环。

顺便说一句...如果您对我的引导加载程序有任何一般性评论(这是我的第一个),请随时提及。

4

1 回答 1

2

“引导循环”可能意味着您的代码存在三重错误

既然您无论如何都在虚拟机中运行,我建议您尝试一下qemu,原因有两个。首先,维基百科的文章说:“在 QEMU 中,三重故障会在控制台中生成虚拟机转储,指令指针设置为触发第一个异常的指令。” 让模拟器将您指向失败的确切指令将使您的调试速度更快。

其次,如果这还不够,QEMU 支持附加gdb到虚拟 CPU,它允许您单步执行代码、打印寄存器内容以及所有常见的事情。请参阅该选项的qemu手册页。-gdb

于 2012-11-08T01:43:39.823 回答