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

时间:2012-11-08 01:31:57

标签: assembly x86 nasm bootloader protected-mode

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

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

第1阶段:

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

    1. 再次设置堆栈和段(我是否需要再次执行此操作?)
    2. 设置GDT(这部分混淆了我 - TBH我只是复制/粘贴)
    3. 启用A20门
    4. 进入保护模式
    5. 我之前已经成功进入保护模式,但由于某种原因,我现在不能。当我尝试时,Bochs进入启动循环,但据我所知,代码与旧代码相同。

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

      我有我的整个引导加载程序代码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 个答案:

答案 0 :(得分:2)

“引导循环”可能意味着您的代码为triple-faulting

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

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