首页 文章

尝试启用保护模式时的引导循环

提问于
浏览
1

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

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

阶段1:

  • 设置堆栈和段寄存器

  • 将视频模式更改为640x480x8

  • 读取下一个扇区到内存

  • 远远跳到它

第二阶段:

  • 再次设置堆栈和段(我是否需要再次执行此操作?)

  • 设置GDT(这部分让我感到困惑 - 我只是复制/粘贴TBH)

  • 启用A20门

  • 进入保护模式

我之前已成功进入保护模式,但由于某种原因,我现在不能 . 当我尝试时,Bochs进入启动循环,但据我所知,代码与旧代码相同 .

我已经尝试注释掉启用A20和GDT的调用,但这并没有阻止启动循环 .

我有我的整个bootloader代码here on 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并不会阻止以后的启动循环 .

顺便说一下......如果你对我的bootloader有任何一般性评论(这是我的第一篇),请随时提及 .

1 回答

  • 2

    "boot loop"可能意味着您的代码是triple-faulting .

    由于你有两个原因,建议你尝试 qemu . 首先,维基百科上的文章说,"In QEMU, a triple fault produces a dump of the virtual machine in the console, with the instruction pointer set to the instruction that triggered the first exception."让模拟器指向你失败的确切指令将使你的调试更快 .

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

相关问题