我正在编写一个基本的引导加载程序,我可以在某种环境中编写一个简单的C程序,将其写入硬盘(无文件系统)并运行它。这就是我想做的一切。
这是我到目前为止所做的。
第1阶段:
第二阶段:
我之前已经成功进入保护模式,但由于某种原因,我现在不能。当我尝试时,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有任何一般性评论(这是我的第一篇),请随时提及。
答案 0 :(得分:2)
“引导循环”可能意味着您的代码为triple-faulting。
由于您无论如何都在虚拟机中运行,我建议尝试qemu
,原因有两个。首先,维基百科的文章说:“在QEMU中,三重故障会在控制台中产生虚拟机转储,指令指针设置为触发第一个异常的指令。”让模拟器指向您失败的确切指令将使您的调试更快。
其次,如果这还不够,QEMU支持将gdb
附加到虚拟CPU,这允许您单步执行代码,打印寄存器内容以及所有常见的事情。请参阅qemu
选项的-gdb
手册页。