Segment Register 也可以称作 Selector Register,它在整个 x86/x64 体系下实在太重要了。
这里讲解的是 user segment 寄存器,包括:
Code 段寄存器:CS
Data 段寄存器:ES, SS, DS, FS 以及 GS
这些段寄存器由 user segment descriptor 装载进去。
我们很有必要先去了解 segment 寄存器的真实结构:
上图是我画的 Segment Registers 内部结构图,这分为 4 个部分:
Selector
Attribute
Limit
Base
图中已经标出灰色部分是processor 内部使用的,仅仅只有 Selector部分可以由用户使用
但是在64 位模式下,它很特别:
Base是 64 位的,但是对于 CS, ES, DS 和 SS 来说 Base 是无效的,而对于 FS 和 GS 来说,它们是有效的,64位的 Base address 可以由用户设定
Attribute 只有少数几个属性位是有效的
Limit 对于所有的 segment registers 来说都是无效的。
注意上面所说的是针对在 64 位模式下。
segment registers 结构体现了 protected mode 下的几大元素:
selector
descriptor
descriptor table
1. 提供基址
Segment registers 的 base 提供基址,无论是 real mode 下还是 protected mode 下,其地址的计算方法都是:base + offset
如果有下面代码:
jmp next
next:
目标代码地址在 CS.base + eip
2. Segment Registers 的 Attribute 部分
Segment Registers 的 Attribute 是描述段的属性,它在装载 segment descriptor 的时候加载进去设置的,它包括:
G 属性:segment