IA-32中的段选择器

时间:2012-02-02 13:38:17

标签: assembly operating-system x86 ia-32

分段选择器何时进入图片。英特尔指南中的专栏说:

  

“每个段描述符都有一个关联的段选择器。一个段   选择器提供使用它的软件和GDT的索引   或LDT(其相关段描述符的偏移量),a   全局/本地标志(确定选择器是否指向GDT   或LDT)和访问权限信息。“

我不太明白。

是否有单独的段选择器寄存器?    它是如何计算的?    为什么我们需要它。?

3 个答案:

答案 0 :(得分:14)

GDT代表全局描述表 这里重要的是单词 table ,而表格中的Intel表示数组。

一个表一个数组,它有元素,每个元素都叫做 Descriptor 。当然,每个元素都可以被索引,即它具有唯一索引

段选择器寄存器保存描述符的索引。段选择器寄存器中的值称为 selector

然而,事情要详细一点 索引 不是 选择器

index 之外,段选择器寄存器还包含两件事:

  1. 程序员想要用来访问描述符的权限。对于每个寄存器,这称为 RPL (请求权限级别),但CS称为 CPL (当前权限级别)。 RPL CPL 在使用段选择器寄存器时所扮演的角色在英特尔手册中定义,它太长了,无法在此解释。

  2. 用于查看的表格。一个表是 GDT ,另一个是 LDT 。英特尔手册中也存在差异和用法。

  3. 所以非正式规则是:

    选择器 = 索引 + table_to_use + 权限
    table_to_use + index = descriptor = 有关要使用的内存段的所有信息

    当然,+并不意味着算术加。段选择器寄存器的实际位字段是

    15                                                 3    2        0
    +--------------------------------------------------+----+--------+
    |          Index                                   | TI |   RPL  |
    +--------------------------------------------------+----+--------+
    
    TI = Table Indicator: 0 = GDT, 1 = LDT
    

    因此,例如值05h选择索引为0的描述符(在 LDT 中使用 RPL = 1),这在英特尔明确规定时无效不使用描述符0 可以使用选择器 08h访问第一个可用的描述符,选择 GDT RPL = 0。值08h-0bh全部选择 GDT 中索引为1的描述符,只是使用不同的 RPL

    这是术语的完整ASCII艺术

    <---- Selector ---->    +----- Segment Selector Register
    +-------+----+-----+    v
    | Index | TI | RPL | = DS
    +-------+----+-----+            GDT                        LDT
       |      |             +---------------------+   +---------------------+
       |      +------------>| Null Descriptor     |   | Null Descriptor     |
       |                    +---------------------+   +---------------------+
       |                    | Descriptor 1        |   | Descriptor 1        |
       |                    +---------------------+   +---------------------+
       |                    |                     |   |                     |
       |                    ...     ...    ...   ...  ...     ...    ...   ...
       |                    |                     |
       |                    +---------------------+
       +------------------->| Descriptor K        |
                            +---------------------+
                            |                     |
                            ...     ...    ...   ...
    

    关于如何计算以及我们需要它的原因

    简短回答:阅读英特尔手册,因为它是完整的参考资料。

    长答案:我们,用户模式程序员,不计算它。因为段的所有这些都归结为限制程序的特权,因为它是命令而不是我们的操作系统,我们只是使用操作系统给我们的值(通过基本上加载我们的程序)作为 GDT LDT 由操作系统设置,现在它愿意在任何方面与我们合作。

    我们需要细分受众群,因为在真实模式中存在细分市场(Google可获取更多信息),因为他们可以避免在没有传呼的情况下重新定位收集隔离(Google了解更多信息),并且因为细分现在包含更多信息比简单的基本偏移和限制。其中之一: Descriptor Privilege Level 限制用户模式程序的权限。

答案 1 :(得分:1)

在实模式中,对存储器的访问是分段的,即通过指定段位置和段偏移来访问它。然后通过将偏移量添加到偏移的左段位置来计算物理地址。段位置段和段偏移量均为16位。

由于英特尔的设计选择显然非常注重向后兼容性,因此他们选择保留16位大小的段寄存器。当保护模式出现时,这会引起问题。在保护模式下,GDT(全局描述符表)和LDT(本地描述符表)保存在内存中的某处。这些描述符包含有关处理器使用的段的所有必要数据。为了访问这些描述符,您需要一个段选择器,它实际上是段描述符数组(即LDT或GDT)的索引。

基本上,将5指定为段选择器的值会导致CPU使用本地/全局描述符表中的第5个(索引从零开始)描述符。

答案 2 :(得分:1)

所以会发生什么:

无论何时加载程序,链接加载程序都会使用适当的选择器加载“Segment寄存器”。
段寄存器(例如CS,DS,SS等)分为两部分:可见和隐藏。
它是由装载机装载的可见部分,具有适当的值。
该值是GDT或LDT中的索引,具体取决于选择器的TI标志 处理器自己加载隐藏部分。隐藏部分中的信息是线性地址空间中的段基地址,段限制,访问信息。