段选择符和段寄存器

  80x86使用了一种称为段(Segment)的寻址技术。这种寻址技术把内存空间分成一个或多个称为段的线性区域,从而对内存中一个数据对象的寻址就需要使用一个段的起始地址(即段地址)和一个段内偏移地址两部分构成。段地址部分使用16位的段选择符指定,其中14位可以选择214即16384个段。段内偏移地址部分使用32位的值来指定,因此段内地址可以是0~4GB。即一个段的最大长度可达4GB。程序中由16位的段和32位的偏移构成的48位地址或长指针称为一个逻辑地址(虚拟地址)。它唯一确定了一个数据对象的段地址和段内偏移地址。而仅由32位偏移地址或指针指定的地址是基于当前段的对象地址。

    8086中有4个16位的段寄存器:CS、DS、SS、ES,分别用于存放可执行代码的代码段、数据段、堆栈段和其他段的基地址。

    80X86为段部分提供了6个存放段选择符的段寄存器:CS、DS、ES、SS、FS和GS,但是,这些段寄存器中存放的不再是某个段的基地址,而是某个段的选择符(Selector)。因为16位的寄存器无法存放32位的段基地址,段基地址只好存放在一个叫做描述符表(Descriptor)的表中。因此,在80X86中,我们把段寄存器叫做选择符。

其中CS总是用于寻址代码段,而堆栈段则专门使用SS段寄存器。

在任何指定时刻由CS寻址的断称为当前代码段,此时EIP寄存其中包含了当前代码段内下一条要执行指令的段内偏移地址,因此要执行指令的地址可表示成CS:[EIP]。

由段寄存器SS寻址的段称为当前堆栈段,栈顶由ESP寄存器内容指定,因此堆栈顶处地址是SS:[ESP]。

另外4个段寄存器是通用段寄存器,当指令中没有指定所操作数据的段时,那么DS将是默认的数据段寄存器。


以下来自对选择符和描述符的介绍:http://www.kerneltravel.net/kernel-book/第二章%20Linux运行的硬件基础/2.3.5.htm

在实模式下,段寄存器存储的是真实的段地址,在保护模式下,16位的段寄存器无法放下32位的段地址,因此,它们被称为选择符,即段寄存器的作用是用来选择描述符。选择符的结构如图2.16所示:              

           图 2.16选择符的结构(Segment Selector)

可以看出,选择符有三个域:第15~3位这13位是索引域,表示的数据为0~8129,用于指向全局描述符表中相应的描述符。第二位为选择域,如果TI=1,就从局部描述符表中选择相应的描述符,如果TI=0,就从全局描述符表中选择描述符。第1、0位是特权级,表示选择符的特权级,被称为请求者特权级RPL(Requestor Privilege Level)。只有请求者特权级RPL高于(数字低于)或等于相应的描述符特权级DPL,描述符才能被存取,这就可以实现一定程度的保护。

我们知道,实模式下是直接在段寄存器中放置段基地址,现在则是通过它来存取相应的描述符来获得段基地址和其它信息,这样以来,存取速度会不会变慢呢?为了解决这个问题,386的每一个段选择符都有一个程序员不可见(也就是说程序员不能直接操纵)的88位宽的段描述符高速缓冲寄存器与之对应。无论什么时候改变了段寄存器的内容,只要特权级合理,描述符表中的相应的8字节描述符就会自动从描述符表中取出来,装入高速缓冲寄存器中(还有24位其他内容)。一旦装入,以后对那个段的访问就都使用高速缓冲寄存器的描述符信息,而不会再重新从表中去取,这就大大加快了执行的时间,如图2.17所示。

图 2.17 段描述符高速缓冲寄存器的作用

由于段描述符高速缓冲寄存器的内容只有在重新设置选择符时才被重新装入,所以,当你修改了选择符所选择的描述符后,必须对相应的选择符重新装入,这样,88位描述符高速缓冲寄存器的内容才会发生变化。无论如何,当选择符的值改变时,处理器自动装载不可见部分。

下面讲一下在没有分页操作时,寻址一个存储器操作数的步骤:

1. 在段选择符中装入16位数,同时给出32位地址偏移量(比如在ESI、EDI中等等)

2. 根据段选择符中的索引值、TI及RPL值,再根据相应描述符表寄存器中的段地址和段界限,进行一系列合法性检查(如特权级检查、界限检查),该段无问题,就取出相应的描述符放入段描述符高速缓冲寄存器中。

段描述符(Segment Descriptor)通用格式如下图:

3. 将描述符中的32位段基地址和放在ESI、EDI等中的32位有效地址相加,就形成了32位物理地址。

注意:在保护模式下,32位段基地址不必向左移4位,而是直接和偏移量相加形成32位物理地址(只要不溢出)。这样做的好处是:段不必再定位在被16整除的地址上,也不必左移4位再相加。

寻址过程如图 2.18所示。


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值