上一篇文章,我们大致领略了现代处理器的结构和特点。点解链接查看上一篇文章:现代处理器的结构和特点
本篇文章开始,学习保护模式下的的各种机制。什么是保护模式呢?
一般来说,操作系统负责整个计算机软硬件的的管理,它做任何事情都是可以的。但是用户程序就应当有所限制,用户程序它只能访问自己的数据自己的代码,即使是转移,也只允许在自己的各个代码段之间进行转移。
但是,在本篇文章之前,我们学习的各种机制下,用户代码对内存的访问是非常自由的,没有人管!它想访问哪里就访问哪里。如果一不小心,访问到了操作系统的代码段或者操作系统的数据段,并将其修改,那么就会发生无法预测的错误!
在多用户,多任务时代,内存中会存在很多的用户程序在运行。此时我们应该让他们彼此之间有一个间隔,让他们彼此不会因为不小心修改了彼此的代码或者数据而导致出错。那么如何实现?
其实就是我们即将要学习的保护模式的内容了。
1、全局描述符表(GDT)
在进入保护模式之前。首先来介绍一下,全局描述符表(Global Descriptor Table,GDT)。
在实模式下,处理器将内存分为逻辑上的段,在访问内存时,在指令中,使用段内偏移地址。这在之前的文章学习的很深刻了。
在保护模式下,就不太一样了。对内存的访问,依然使用段地址加偏移地址,但是,在每个段能够进行访问之前,必须先进行登记。
为什么进行登记呢?我们上面有一个疑问就是如何让各个用户程序彼此隔开,说白了就是让它们不要访问彼此的代码与数据以防造成混乱。 那么在这里,我们对各个用程序的段,进行登记,并记录各个段是属于哪个用户程序啊,各个段的大小以及属性啊之类的,对这些信息进行登记,当一个程序想要访问一个地址的时候,我们首先查看这个段是否是这个用户程序能够访问的,如果不能,就产生一个段错误之类的信息给用户,这样的话,看起来可以达到我们的目的:让各个用户程序隔离。
那么,和一个段有关的信息,需要8字节来描述,称为段描述符。每个段都需要一个描述符。为了存放这些描述符,需要在内存中开辟一段内存空间用于存放各个段的描述符。这些集中存放在一起的描述符构成了描述附表。
最主要的描述符表示全局描述符表(Global Descriptor Table,GDT),所谓全局,意味着该表是为整个软硬件系统服务的。对应的还有一个局部描述符表(LDT),这在后面会进行学习。
因为在进入保护模式之后,处理器立即需要按新的内存访问模式工作,所以必须在进入保护模式之前,就定义好GDT。但是由于在实模式下,只能访问1M以下的内存,所以如下图,在进入保护模式前,我们定义的GDT大致就是在下图中的位置:
上面的GDT放在1M以下指示为了兼容实模式。在进入保护模式后,可以修改全局描述符表的位置。
上述的GDTR是什么?
为了跟踪全局描述符表,处理器内部有一个48位的寄存器,称为全局描述符表寄存器(GDTR)。该寄存器分为两部分,分别是32位的线性地址和16位的边界。如下图所示:
- GDTR的32位线性地址部分八寸的是全局描述符表在内存中的位置
- GDTR的16位边界部分保存的是 全局描述符表的边界(界限),其在数值上等于表的大小(总字节数)减一。
因为GDT的界限值是16位的,所以该表最大是216字节,也就是65536字节(64KB)。又因为一个描述符占用8字节,故最多可以定义8192个描述符。
2、总结
循序渐进,本文只记录学习全局描述符表。理解GDT与GDTR。
笔记记得不是很全,如果有不懂的可以加我联系方式一起交流。
学习探讨加个人:
qq:1126137994
微信:liu1126137994