在这篇文章我们将要做:
- 介绍选择子
- 实现一个选择子结构
#选择子是什么
在上篇文章中我们介绍了段描述符以及段描述符表,这篇文章我们复习一下段和段描述符以及段描述符表的功能,并且介绍一下段选择子以及段描述符表。
段(Segment):在80X86中我们知道分段机制将内存空间分为了多个线性区域,我们把这些线性区域称为段。由于我们要将这些段区分开来,于是我们对段赋予3个属性。他们分别是段基址(Base)、段界限(Limit)、段属性(Attribute),段基址表示了一个段在线性空间中的开始地址,段界限表示段内最大偏移量,也就是说,它定义了段的大小,段属性描述了段的一些特性,包括可读可写可执行、特权级等。
段描述符(Descriptor):在程序中我们需要定义一个数据结构来表示段,包括段基址(Base)、段界限(Limit)、段属性(Attribute)这3个属性,这个数据结构叫做 段描述符(Descriptor)。段是一个逻辑概念,段描述符是对应的数据结构。
段描述符表(Descriptor Table):在一个程序中,不仅仅是只有一个段(段描述符),我们需要一种方法将它们组织起来,也就是说需要一个数组来保存它们,这个结构就是段描述符表。段描述符表分为两种,一种是全局描述符表(GDT),一种是局部描述符表(LDT),系统中供所有任务使用的是全局描述符表,每个任务使用的是它自己的局部描述符表。
段选择子(Selector):我们已经知道段描述符是存储于段描述符表中的,当我们需要访问段描述符时是如何访问的呢?其实,我们是通过段描述符在段描述符表中的位置来进行访问的。段选择子就是这样的一个16位的标识符,它标识了段描述符在段描述符表中的位置。
段描述表寄存器:如何让系统知道段描述符表在什么地方呢?处理器提供了内存管理寄存器,分别是全局描述符表寄存器(GDTR)、局部描述符表寄存器(LDTR)。GDTR寄存器中用于存放全局描述符表GDT的32位线性基地址和16位的表的长度值。LDTR寄存器中用于存放局部描述符表LDT的32位线性基地址和16位的表的长度值。通过系统指令,lgdt将GDT的线性基址和长度值加载到GDTR寄存器中,lldt将LDT的线性基址和长度值加载到LDTR寄存器中。
#动手实现选择子
##选择子结构
##选择子的汇编实现
- testgdt.asm
1 |
|
- pm.inc
1 | ; 描述符类型 |
现在选择子已经初步完成,下篇文章我们重点讲解 GDT 以及它的实现。
版权声明:本文为博主原创文章,未经博主允许不得转载。