分段机制

为什么要了解intel80386的保护模式和分段机制?我们知道intel80386只有进入保护模式,才能发挥其强大的功能,提供更好的保护机制和更大的寻址空间,否则仅仅是一个快速的8086。没有一定的保护机制,任何一个用户程序都可以访问所有计算机的资源,对于8086实模式确实是如此,但是当我们已经跨越到了80386来,分段机制就一直存在,为操作系统提供了保护(当然还有分页机制,我们到后面再去谈)并且无法避免和忽视它的存在。所以如果不了解分段机制,那么对于interl80386体系操作系统设计和学习就会建在一个空中楼阁上。 
只有在保护模式下才能使用分段存储管理机制。分段机制将内存划分成以起始地址和长度这两个参数表示的内存块,这些内存块称为段。
分段机制涉及4个关键内容:逻辑地址、段描述符(描述段的属性)、段描述符表(含有多个段描述符的数组)、段选择子(段寄存器,用于定位段描述符表中的索引)。当然其中同样会涉及到线性地址、物理地址这些概念。下面是逻辑地址、线性地址、物理地址之间的转化:

分段机制开启、分页机制未开启:逻辑地址->段机制处理->线性地址= 物理地址
分段机制和分页机制都开启:逻辑地址->段机制处理->线性地址->页机制处理->物理地址

当然我们现在所说的还没有涉及到分页机制,所以可以认为分页机制没有开启,那么我们接下来所要讨论的就是(1)中所提的地址的转化。首先这又一个从逻辑地址经过段机制转化的图:
分段机制

逻辑地址由16位的段选择子(段寄存器)和32为的偏移地址构成,通过段选择子中索引值可以在全局描述符表中找到相应的段描述符,段描述符中存储有基地址和段限界,所以通过段描述符表中的基地址和逻辑地址中的偏移地址就可以转化成线性地址。
分段存储管理机制需要在启动保护模式的前提下建立。从图中和上述的描述中可以看出,为了使分页机制正常的工作,就需要建立好全局描述符表和段描述符,那么下面的内容就简单介绍以下GDT(全局描述符表)和段描述符。   
在保护模式下,对内存的访问仍然使用段地址加偏移地址,在每个段能够访问之前,必须先进性等级登记。这样就好比开公司做生意,在实模式下开公司不需要进行注册,卖什么都没有人管,随时可以开张。但是在保护模式下就不行了,开公司之前就要进行登记。这样,当你买的东西和你的登记不相符合时,就会被阻止。对段的访问也是一样的,当你访问的偏移地址超过了短的限界,处理器就会进行阻止,并产生一个叫做内部异常的中断。
和一个段有关的信息用8个字节来描述,称为段描述符,每个段都需要一个段描述符。为了存放这下段描述符,需要在内存中开辟一段空间。在这个空间里段都是连续存储的,集中在一起就构成了段描述符表。
为了跟踪段描述符表,处理器内部用一个48位的寄存器,称为全局段描述符表寄存器(GDTR)。该寄存器分为2部分,前32位用来存放全局描述符表在内存中的其实地址,后16位用存放全局描述符表的界限,其在数值上等与表的大小减1.


      换句话说,全局描述符表的界限值就是表中最后一个字节的偏移量。因为GDT的界限是16位,所以该表最大是65536字节,又因为一个描述符占8个字节,所以最多可以定义8192个描述符。
理论上,全局描述符表可以位于内存中的任何地方,但是在进入保护模式之后,处理器立即要按新的内存访问模式工作,所以在进入保护模式之前必须定义GDT。但是由于在实模式下只能访问1MB的内存,所以GDT通常定义在1MB以下的位置。当然,允许在进入保护模式之后重新定义GDT的位置。
实模式和保护模式在内存访问上是由区别的,在保护模式下,不能说随便访问那个段,在访问之前,必须现在GDT内定义要访问的内存段,想访问那个段就在GDT中定义一个描述符。
一旦确定以了GDT在内存中的起始位置,下一步就是要确定访问的段,并在GDT中为这些段创建各自的描述符。 每个描述符在GDT中占8个字节,分为高32为和低32位(段描述符的格式)
          
很明显,段描述符指定了32位起始地址,以及20位的边界地址。在32位保护模式下,段地址是32位地址线,如果未开启分页功能,线性地址就是物理地址。描述符中的段基地址和段限界不连续,把他们分为几个段好像不科学,但是没有办法,这时从80286带开的后遗症。段基址尽管可以使用0~4GB的所有内存,但是还是建议使用16字节对齐的地址。
20位的段界限用来限制段的范围。因为访问内存的方法是用基地址加上偏移地址,所以,对于向上扩充的段,如代码段和数据段来说,偏移量是从0来使递增的,段界限决定以最大的偏移量;对于向下扩展的段,如栈,段界限决定了偏移量的最小值。
 G位:粒度位。当G = 0 时。段界限以字节为单位,这时段的扩展范围是从1B ~1MB,因为描述符的界限值是20位。G= 1,段界限的单位为4KB(4KB~4GB)
  S位:用于指定描述符的类型。S = 0 ,系统段; S = 1, 代码段或数据段
  DPL位:表示描述符的特权级(在后面将会详细介绍)
 P位:段存在位。用于指示描述符所对应的段是否存在,一般来说值段是否位于内存中。如果不存在就将该为清0,存在时置1.
对于其它的位就不做详细介绍了,如果有兴趣可以在网上查找详细介绍。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值