我正在编写一个基本的引导加载程序,我只能在某种环境中编写一个简单的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 回答
"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
手册页 .