那我们看接下来看练习三
练习三呢 我们要看
看Bootloader到底干什么事情
那Bootloader它实际上
就是完成了最基本一些功能
比如说它能够把80386的保护模式给开启
使得现在的软件进入了
一个32位的寻址空间
就是我们的寻址方式发生了改变
为了能够做好这一步
它还需要干如下几件事情
开启A20
初始化全局描述符表
最后 要使能和进入保护模式
这三步是它干的事情
那这三步看起来好像有点复杂
但实际情况怎么样呢
我们可以拿个小的程序来看
我们现在不用lab1
我们知道 其实之前讲很多这些代码
也是由一个一个小的Project
一步步形成了这个lab
就是每个lab呢 实际上
由一系列小的Project来构成的
当然我们这里面已经是直接给大家提供lab
其实我们可以看一下 lab1是什么构成的
我们第一个lab的构成
是由一系列的Project构成的
那么如果我们只关注Bootloader的话
我们会发现其实Bootloader很小
这个代码量很小
因为它确实只有512个字节
所以说你可以看到我们的Project1
当时开发的Project1
就是一个lab1最早的一个版本
那么这个版本干什么呢
就是完成一个Bootloader
它能够显示一个字符串
这是一段很小的代码
那么这个汇编代码
这是Bootloader很重要一段代码
这段代码虽然是汇编
但是它完成的功能
我们刚才说到的三个功能
打开A20 建立全局描述符表
然后使能 进入保护模式 32位的保护模式
都是在这个汇编里面完成的
所以说我们会给大家做个简单介绍
这个代码其实量挺小的
也就大约几百行代码
两三百行代码就完成了这个功能
那有的同学可能感兴趣
执行出来什么效果呢
我们可以看看
好 它其实又编译了这么几个文件
一个.S 一个.C
那么这个sign.c呢
它是一个工具
它不是Bootloader组成部分
而是生成主引导扇区的一个辅助工具
通过它 生成了一个合格的Bootloader主引导扇区
然后这个bootblock
就是我们需要去用到一个
需要用到一个主引导扇区
运行一下可以看到
它大概干什么事情
这里面很多细节看不出来
我们只看到显示了一个字符串
显示一个字符串 Hello world!!
这是Bootloader完成了一个
Hello World的一个事情
但在打印Hello World到屏幕上之前呢
它其实干了很多事情
我们刚才说的进入保护模式的
那几件事情都完成了
然后最后才是显示了Hello World
而且Hello World还通过几种方式
并口 串口和CGA
我们说的Monitor 显示器
这三种外设来显示
当然这里面 我们只看到两种
怎么开启A20的
如何初始化GDB
如何使能并进入保护模式
需要大家仔细阅读这个文件的第16行到第56行
当执行完第56行代码的时候 ljmp
这个ljmp指令之后
整个CPU 计算机系统会进入32位保护模式
大家需要去了解 它怎么来进入的
那么这里面需要去读一下它相关的代码
以及全局表述符表的信息
这个需要大家去稍微理解一下
这是练习三