操作系统学习笔记——保护模式——分段机制

来源:互联网 发布:台达dvp14ss编程软件 编辑:程序博客网 时间:2024/05/16 23:48
以前学习微机原理的时候,接触到的是8086/8088处理器,这些处理器都是16位的,地址线为20位,共可寻址1MB的内存空间,即它们都工作在实模式下。

        1985年,IBM公司引入AT机时,使用的是INTER80286CPU,具有24根地址线,可寻址16MB的地址空间,并且保留了实模式来向下兼容。直到今天的32位/64位的CPU,上电后CPU的初始模式仍然是实模式。

         实模式和保护模式的最大区别,就在于内存的寻址和保护机制。在实模式下,寻址方式为 (段基址):(段内偏移)来确认要找的内存空间,这种寻址方式比较单纯,段基址左移四位,加上段内偏移值,就得到要寻址的物理空间。而实模式下的寻址方式限制了寻址的空间,同样不能提供完善的保护机制,随着计算机的发展,用户的需求越来越多,大型的程序和多任务的出来要求有更大的寻址空间,这就要求在操作系统运行的过程中,要处理更多的段,保护模式无法提供这样的服务,所以,将各个段集中在一个表中,是有利的。保护模式就是用的这种机制完成分段机制的。

        保护模式分段机制的关键词:段描述符、段描述符表、段选择符。

段描述符

        段描述符包含了对一个段的完整描述,包括段的基址、段的限长和段的属性。段基址指明了段的起始地址,段限长指明了段的长度,两者的结合就定义了一个段的全部空间,段的属性描述了该段的一些相关信息,包括类型(数据段、代码段、系统段)、权限等。每一个段描述符为8个字节,其就是对段的抽象,代表一个段的实体,该数据也可以理解为一个段在操作系统中存在的身份证,每个定义的段都有一个描述符,就相当于每一个人都有一个身份证一样。

段描述符表

         操作系统中会包括很多的段,包括操作系统的代码段、数据段和用户程序的代码段、数据段等,每个段都有一个描述符,但这些描述符不是随便存在于内存中的,操作系统定义了段描述符表,将段描述符进行统一的管理,就是全局描述符表GDT、局部描述符表LDT和中断描述符表IDT。

         段描述符表就是段描述符的一个数组,描述符表没有固定的长度,但最多只有8192个8字节的描述符。随后会介绍。

全局描述符表

         全局描述符表GDT是操作系统维护一个特殊的数据结构,并且有处理器的内存管理硬件来引用。在但处理器系统中只有一个GDT,在多处理器系统中,每一个CPU都要有一个GDT。GDT可用于系统中所有的程序和任务。GDT不能算是严格意义上的段,而是线性地址空间中的一个数据结构。GDT的段限长和段基址要加载到CPU的GDTR中,一般操作系统设置完GDTR后,不会再改变了,用于对内存的寻址。

局部描述符表

         局部描述符表也可以理解为操作系统中特殊的数据结构,但其和GDT有一定的区别。每个任务可以定义一个局部描述符表,存放该任务的代码段、数据段等,LDT中存放的段描述符指向的是该任务的私有空间,但LDT表作为一个段被寻址,要将它的描述符存放在全局描述符中,这个是必须的!LDT的段限长和段基址要存放在CPU的LDTR中,并且在任务切换的时候,这个LDTR的内容会改变。

段选择符

        前面介绍了在保护模式下,8字节的段描述符如何对一个段进行整体的描述,随后介绍了操作系统通过GDT和LDT如何管理描述符,那么我们如何寻址呢?在程序中如何去找我们要访问的段呢?在实模式下,我们通过(段基址):(段内偏移)进行寻址,在保护模式下,也是类似的,我们用(段选择符):(段内偏移)。注意,实模式下的段基址和保护模式下的段选择符!!!保护模式下的分段机制确实有些复杂,但在这里,分段机制的寻址上,不要害怕,不要想的太多,让脑子单纯一些,其实也很好理解。只要一点::保护模式下的分段寻址最关键的,就是比实模式下的分段寻址多了一个查表的步骤,就这么简单!!!第一步:段选择符会和GDTR或LDTR中的数据相结合,找到我们要寻址的段的段描述符,段描述符存放着段的基地址,我们找的就是这个基地址。第二步:将基地址和段内偏移地址相加,就将逻辑地址转换成了线性地址(仅仅当成一个地址,这个地址就是我们要找的,不要多想,否则越想越乱),后面的一步就和实模式的寻址很相近了。下面一个图来说明分段机制如何寻址。


转载自:http://blog.csdn.net/andrew_yau/article/details/7719806

          段选择符是16位的,前位0和位1为请求权限,位2为TABLE INDEX,当TI为0时,该选择符索引GDT,当TI为1,该选择符索引LDT。索引号共13位,故一个GDT可以可以存放2^13个描述符表,即8192个。同样LDT也可以存放8192个描述符表。整个虚拟空间被分成了2^14个段,一半由GDT来映射,作为全局虚拟地址空间(由操作系统和用户任务共享),一半由LDT映射,作为局部虚拟地址空间(用户任务私有自己的空间)。

         这个图完整的描述了保护模式分段寻址。程序中,我们给出的逻辑地址包括16bit的索引号,和32bit的偏移地址。第一步:GDTR(全局描述表寄存器)存放的是GDT的基地址,索引号和GDT相结合(由分段机制的硬件完成),找到我们要访问的段描述符,从段描述符中取出段基址。第二步:这一步就和实模式很类似了,将段描述符中的段基址取出,找到相应段的首地址,偏移量负责段内寻址,即(段基址):(段内偏移)。

0 0