IA-32中的段选择器

Alb*_*ert 8 x86 assembly operating-system

分段选择器什么时候出现在图片中.英特尔指南中的一行说:

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

我没理得.

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

小智 14

GDT代表全球描述表.
这里重要的是单词table和表Intel表示数组.

作为一个数组的表,它有元素,每个元素称为描述符.当然,每个元素都可以被索引,即它具有唯一索引

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

然而事情有点详细.
一个索引 不是一个选择.

除了索引之外,段选择器寄存器还包含两件事:

  1. 程序员想要用来访问描述符的特权.这称为每个寄存器的RPL(请求权限级别),但CS其中称为CPL(当前权限级别).角色RPLCPL比赛中使用的段选择寄存器在英特尔手册定义,它是太长,在这里解释.

  2. 用于调查的表格.一个表是GDT,另一个是LDT.英特尔手册中的差异和用途也是如此.

所以非正式规则是:

selector = index + table_to_use + privilege
table_to_use + index = descriptor = 有关要使用的内存段的所有信息

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

15                                                 3    2        0
+--------------------------------------------------+----+--------+
|          Index                                   | TI |   RPL  |
+--------------------------------------------------+----+--------+

TI = Table Indicator: 0 = GDT, 1 = LDT
Run Code Online (Sandbox Code Playgroud)

因此,例如,值05h选择索引为0的描述符(在LDT中使用RPL = 1),这是无效的,因为Intel明确要求不使用描述符0.
第一个可用的描述符可通过选择器 访问,选择器08h作为表格选择GDTRPL = 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        |
                        +---------------------+
                        |                     |
                        ...     ...    ...   ...
Run Code Online (Sandbox Code Playgroud)

关于如何计算以及为什么需要它

简答:阅读英特尔手册,因为它是完整的参考.

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

我们需要细分市场,因为在Real模式下有一些细分市场(谷歌可以获得更多信息),因为他们可以避免在没有分页的情况下重新定位聚集隔离(谷歌获取更多信息),并且因为细分现在包含的信息多于简单的基本偏移和限制.其中之一:Descriptor Privilege Level限制用户模式程序的权限.

  • 与 GDT 不同的 LDT 没有 NULL 描述符条目,因此第一个条目是有效的 (2认同)

Alb*_*ert 3

那么发生的事情是:

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