从头写一个操作系统 07

2019-04-12  本文已影响0人  半步江南

lesson 9

你需要自己去查: GDT

本节目标: 编写 GDT

还记得lesson 6的segmentation吗?段地址左移一位,只有16位的寻址总线却达到了20位的寻址能力。

在32位模式下,段地址的使用方法有了变化。现在,偏移量是GDT中段描述符的索引。段描述符定义了基础地址(32位)、地址范围(20位)和其他一些标志位(只读,权限等)。更让人容易迷惑的是GDT的数据结构有点奇怪,打开os-dev.pdf看第34页,或者GDT的维基。

编写GDT最简单的方式是定义两个段,一个是代码段,另一是数据段。让它们重叠在一起放弃对内存的保护,今后我们会用c语言来修复这个缺陷。

第一个GDT入口必须是0x00,确保程序员管理内存是没有出错

然后,CPU不能直接加载GDT地址,它需要先取得一个GDT的大小(16bit)、地址(32bit)的数据结构(GDT descriptor)。用lgdt操作符加载GDT descriptor即可。

让我们直接跳转到GDT的汇编代码。这一节的理论比较复杂,最后仔细看看os-dev上的内容。

下一节课,我们会完成32位保护模式的跳转,并且测试今天的代码。

上一篇下一篇

猜你喜欢

热点阅读