我正在编写一个基本的引导加载程序,直到我有某种环境,我可以在其中编写一个简单的 C 程序,将其写入硬盘(无文件系统)并运行它。这就是我想做的。
这是我到目前为止所做的。
阶段1:
- 设置堆栈和段寄存器
- 将视频模式更改为 640x480x8
- 将下一个扇区读入内存
- 远远跳到它
第 2 阶段:
- 再次设置堆栈和段(我需要再次这样做吗?)
- 设置 GDT(这部分让我很困惑 - TBH 我只是复制/粘贴)
- 启用 A20 门
- 进入保护模式
我之前已经成功进入保护模式,但由于某种原因现在我不能。当我尝试时,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 并不能阻止以后的引导循环。
顺便说一句...如果您对我的引导加载程序有任何一般性评论(这是我的第一个),请随时提及。