开启保护模式
实验任务
框架理解
我们先要开启保护模式,现在我们可以打开给出的代码文件。
文件的结构是这样的:
bootloader(这个文件夹编译生成bootloader)
start.s(通过它开启保护模式)
boot.c(通过它来加载app,app即我们的微型“OS”)
boot.h(包含辅助函数,与硬件交互,了解即可,不必掌握)
Makefile(编译bootloader的makefile)
app(微型os)
app.s(显示hello,world)
Makefile(编译app)
utils
genboot.pl
Makefile(总体的makefile,生成os.img)
我们目前需要修改的文件是start.s。
为了开启保护模式,我们要做如下几步:
关中断
开启A20地址线(请自行搜搜看A20地址线是什么)
加载GDTR(请看一下代码中的gdtDesc是什么)
把cr0的最低位设置成1(翻阅一下前面的教程,会告诉你为什么要置为1)
长跳转切换到保护模式
对于长跳转指令,不知道大家还有没有印象。它有两个操作数,第一个操作数是代码段选择子,第二个操作数是跳转地址,具体是做什么的,请回顾PA学过的内容~😎
我们需要实现的地方只有三处:
把cr0的最低位置为1
思路:可以借助eax作为中转寄存器,先把cr0存入eax,然后把eax最低位置为1,最后存回cr0
当然,如果有自己的思路更好
填写GDT
GDT的第一个描述符都是0,请自行搜索为什么。
base和limit的大小请参考Linux的实现。
输出helloworld
Last updated