Chinaunix首页 | 论坛 | 博客
  • 博客访问: 82576
  • 博文数量: 9
  • 博客积分: 1529
  • 博客等级: 上尉
  • 技术积分: 113
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-16 02:14
文章分类

全部博文(9)

文章存档

2011年(5)

2010年(4)

我的朋友

分类: 系统运维

2010-12-17 00:00:15

80x86保护模式下的基本概念


      

IA32下,CPU有两种工作模式:实模式和保护模式。在实模式下,段寄存器含有段值,为访问存储器形成物理地址时,处理器引用相应的某个段寄存器并将其值乘以16,形成20位的段基地址。计算公式如下:

      物理地址 = 段值*16 + 偏移

其中段值和偏移都是16位的,这样通过“段:偏移”的方式达到了1MB的寻址能力。

在保护模式下,寄存器是32位的,但是为了兼容性,地址仍然用“段:偏移”的方式来表示,只不过这时的保护模式下的“段”的概念已经发生了根本的改变,虽然段值仍然由原来的csds等寄存器表示,但是此时它仅仅是一个索引,叫做选择子,指向一个数据结构(叫做GDTGlobal Descriptor Table全局描述符表或者LDTLocal Descriptor Table局部描述符表)的一个表项(叫做Descriptor描述符)。

1.全局描述符表寄存器GDTR

GDTR48位,其中高32位为基地址,低16位为界限。由于GDT 不能有GDT本身之内的描述符进行描述定义,所以处理器采用GDTRGDT这一特殊的系统段提供一个伪描述符。GDTR给定了GDT,如下图所示。

GDTR中的段界限以字节为单位。由于段选择子中只有13位作为描述符索引,而每个描述符长8个字节,所以用16位的界限足够。

2.局部描述符表寄存器LDTR

局部描述符表寄存器LDTR规定当前任务使用的局部描述符表LDTLDTR类似于段寄存器,由程序员可见的16位的寄存器和程序员不可见的高速缓冲寄存器组成。实际上,每个任务的局部描述符表LDT作为系统的一个特殊段,由一个描述符描述。而用于描述符LDT的描述符存放在GDT中。在初始化或任务切换过程中,把描述符对应任务LDT的描述符的选择子装入LDTR,处理器根据装入LDTR可见部分的选择子,从GDT中取出对应的描述符,并把LDT的基地址、界限和属性等信息保存到LDTR的不可见的高速缓冲寄存器中。随后对LDT的访问,就可根据保存在高速缓冲寄存器中的有关信息进行合法性检查。

LDTR寄存器包含当前任务的LDT的选择子。所以,装入到LDTR的选择子必须确定一个位于GDT中的类型为LDT的系统段描述符,也即选择子中的TI位必须是0,而且描述符中的类型字段所表示的类型必须为LDT

 

BIT47—BIT16

BIT15—BIT0

全局描述符表寄存器GDTR

基地址

界限

中断描述符表寄存器IDTR

基地址

界限



 

BIT15—BIT0

局部描述符表寄存器LDTR

选择子

任务状态段寄存器TR

选择子

 

BIT31—BIT0

BIT31—BIT0

BIT11—BIT0

基地址

界限

属性

基地址

界限

属性

 

3.段选择子

在实模式下,逻辑地址空间中存储单元的地址由段值和段内偏移两部分组成。在保护方式下,虚拟地址空间(相当于逻辑地址空间)中存储单元的地址由段选择子和段内偏移两部分组成。与实模式相比,保护模式下的段选择子代替了段值。

段选择子长16位,其格式如下表所示。从表中可见,段选择子的高13位是描述符索引(Index)。所谓描述符索引是指描述符在描述符表中的序号。段选择子的第2位是引用描述符表指示位,标记为TI(Table Indicator)TI=0指示从全局描述符表GDT中读取描述符;TI=1指示从局部描述符表LDT中读取描述符。



选择子
  

BIT15

BIT14

BIT13

BIT12

BIT11

BIT10

BIT9

BIT8

BIT7

BIT6

BIT5

BIT4

BIT3

BIT2

BIT1

BIT0

描述符索引

TI

RPL



选择子确定描述符,描述符确定段基地址,段基地址与偏移之和就是线性地址。所以,虚拟地址空间中的由选择子和偏移两部分构成的二维虚拟地址,就是这样确定了线性地址空间中的一维线性地址。

 

4.段描述符高速缓冲寄存器

在实模式下,段寄存器含有段值,为访问存储器形成物理地址时,处理器引用相应的某个段寄存器并将其值乘以16,形成20位的段基地址。在保护模式下,段寄存器含有段选择子,如上所述,为了访问存储器形成线性地址时,处理器要使用选择子所指定的描述符中的基地址等信息。为了避免在每次存储器访问时,都要访问描述符表而获得对应的段描述符,从80286开 始每个段寄存器都配有一个高速缓冲寄存器,称之为段描述符高速缓冲寄存器或描述符投影寄存器,对程序员而言它是不可见的。每当把一个选择子装入到某个段寄 存器时,处理器自动从描述符表中取出相应的描述符,把描述符中的信息保存到对应的高速缓冲寄存器中。此后对该段访问时,处理器都使用对应高速缓冲寄存器中 的描述符信息,而不用再从描述符表中取描述符。

各段描述符高速缓冲寄存器之内容如下表所示。其中,32位段基地址直接取自描述符, 32位的段界限取自描述符中20位的段界限,并根据描述符属性中的粒度位转换成以字节为单位。其它十个特性根据描述符中的属性而定,“Y”表示“N”表示“R”表示必须可读,“W”表示必须可写,“P”表示必须存在,“D”表示根据描述符中属性而定。



段描
述符
高速
缓冲
寄存
器的
内容

段寄存器

段基地址

段界限

段属性(对程序员来说是看不见的)

存在性

特权级

已存取

粒度

扩展方向

可读性

可写性

可执行

堆栈大小

一致特权

CS

32位基地址

32位段界限

P

D

D

D

D

D

N

Y

-

D

SS

32位基地址

32位段界限

P

D

D

D

D

R

W

N

D

-

DS

32位基地址

32位段界限

P

D

D

D

D

D

D

N

-

-

ES

32位基地址

32位段界限

P

D

D

D

D

D

D

N

-

-

FS

32位基地址

32位段界限

P

D

D

D

D

D

D

N

-

-

GS

32位基地址

32位段界限

P

D

D

D

D

D

D

N

-

-



段描述符高速缓冲寄存器再处理器内,所以可对其进行快速访问。绝大多数情况下,对存储器的访问是在对应选择子装入到段寄存器之后进行的,所以,使用段描述符高速缓冲寄存器可以得到很好的执行性能。

段 描述符高速缓冲寄存器之内保存的描述符信息将一直保存到重新把选择子装载到段寄存器时再更新。程序员尽管不可见段描述符高速缓冲寄存器,但必须注意到它的 存在和它的上述更新时机。例如,在改变了描述符表中的某个当前段的描述符后,也要更新对应的段描述符高速缓冲寄存器的内容,即使段选择子未作改变,这可通 过重新装载段寄存器实现。

阅读(638) | 评论(0) | 转发(0) |
0

上一篇:发一个Linux下的线程池

下一篇:jos-开篇

给主人留下些什么吧!~~