分段选择器何时进入图片。英特尔指南中的专栏说:
“每个段描述符都有一个关联的段选择器。一个段 选择器提供使用它的软件和GDT的索引 或LDT(其相关段描述符的偏移量),a 全局/本地标志(确定选择器是否指向GDT 或LDT)和访问权限信息。“
我不太明白。
是否有单独的段选择器寄存器? 它是如何计算的? 为什么我们需要它。?
答案 0 :(得分:14)
GDT代表全局描述表 这里重要的是单词 table ,而表格中的Intel表示数组。
一个表一个数组,它有元素,每个元素都叫做 Descriptor 。当然,每个元素都可以被索引,即它具有唯一索引
段选择器寄存器保存描述符的索引。段选择器寄存器中的值称为 selector 。
然而,事情要详细一点 索引 不是 选择器。
除 index 之外,段选择器寄存器还包含两件事:
程序员想要用来访问描述符的权限。对于每个寄存器,这称为 RPL (请求权限级别),但CS
称为 CPL (当前权限级别)。 RPL 和 CPL 在使用段选择器寄存器时所扮演的角色在英特尔手册中定义,它太长了,无法在此解释。
用于查看的表格。一个表是 GDT ,另一个是 LDT 。英特尔手册中也存在差异和用法。
所以非正式规则是:
选择器 = 索引 + 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标志
处理器自己加载隐藏部分。隐藏部分中的信息是线性地址空间中的段基地址,段限制,访问信息。