本文主要介绍80386在保护模式下,将分段形式的逻辑地址段选择符:偏移地址(ES:BX)转换成实际的物理内存地址的过程。

整个转换分成两个阶段:段转换(逻辑地址转换成线性地址)和页转换(线性地址转换成实际物理地址)。

                                                       段转换

80386 内存寻址机制

如上图所示,描述符表是操作系统初始化时,在内存区域创建的一张表,具体的创建过程在后面的文章中会结合代码来说明。描述符表里面的每一项就是段描述符。需要特别注意的是,当选择符装入段寄存器时,CPU会把相应的描述符中的段起始地址、段界限和段属性等自动地装入描述符寄存器(段寄存器隐藏部分)。这里的偏移值,按照目前我的理解应该是在执行call指令时后面跟的函数标号,这个有待后续阅读初始化代码时进一步确认。

到这里,段转换的过程就介绍完了,下面具体看下选择符段描述符的格式:

选择符的结构

选择符的结构
索引 TI RPL

 

 

 

索引字段占13bit,可以索引8192描述符表项.处理器将索引值乘以8然后加上描述符表基地址便可以找到具体的描述符表项。

表指示器TI(Table Indicator),指示选择符所引用的描述符表,0表示引用的是GDT表,1表示引用的是LDT。

请求者特权级RPL(Requestor privilege level):该2位bit用于保护机制。 

段描述符的结构

段描述符分为以下两种,第一种是代码段和数据段描述符:

80386 内存寻址机制

第二种是特殊系统段的描述符:

80386 内存寻址机制

从上面两幅图可知,段描述符有以下特点:

1)总共占用8个字节

2)低2和3字节+第5字节+最高1字节共4字节构成了32位基地址;

3)最低位两字节+第7字节的低4位构成了20位的段限长;

4)段限长的单位由G位指示,0表示1字节,1表示4K字节;分别对应段限长1M,4G两个档;

5)DPL--descriptor privilege level描述符特权级。

6)代码数据段比特殊系统段描述符多了一个A位,当CPU访问过该段时,该bit会被置为1;

描述符表

由段描述符构成描述符表,最大包含8192个段描述符。可分为全局描述符表和局部描述符表即GDT和LDT。

处理器用GDTR和LDTR来定位存储器中的这两张表格。通过指令LGDT和SGDT来访问GDT表的内容。GDTR如下图所示:

80386 内存寻址机制

可见,LGDT指令把描述符表的基地址和表限长加载到了GDTR寄存器中。

说明:对于LLDT指令代码中好像没有几处,这里暂且存疑,仅保留下面一句话,访问LDTR寄存器所使用的是2个字节的操作数,表示全局描述符表中一个局部描述符项的选择符

                                                     页转换

将CR0最高位的PG标志置1将开启80386的分页功能。PG位在上篇文档中没有画出。

80386 内存寻址机制

上图展示了,将第一步段转换获取的线性地址转换成物理内存地址的过程。下面详细说明这个过程:

1)当前页目录表的基地址存放在CR3寄存器中,因此CR3也被称为页目录基地址寄存器。

2)线性地址中含10位页目录即可索引1024(1K) 个页目录项。

3)线性地址中含10位页表项即可索引1024(1K)个页表项。

4)每个页表项对应的偏移值可有2^12即(4K)内存空间。

因此,整个页目录可寻找1K*1K*4K即4G物理空间。

页目录项(或称为一级页表项)的结构如下:

80386 内存寻址机制

说明:当向物理内存写入数据时,二级页表的已修改位D需要被设置而一级页表项的已修改位D无需设置。访问位A都需要被设置。页框地址指定了一页内存的物理起始地址,因为内存页位于4K边界上,因此低12位被用作它用。P位指示了该页表项是否可用。

至此,逻辑地址到线性地址再到物理内存地址的转换过程就描述完了。下篇文章会继续沿着这个思路介绍多任务和中断相关的操作过程。

 

 

相关文章: