Update 卷一:基本架构.md 3.4.2

This commit is contained in:
zxtian
2021-11-12 01:35:45 -08:00
parent 69f660d711
commit ceec64c8b1

View File

@@ -8,8 +8,33 @@
## 3.4 BASIC PROGRAM EXECUTION REGISTERS
### 3.4.2 Segment Register
### 3.4.2 段寄存器
段寄存器控制(代码段寄存器,数据段寄存器,堆栈段寄存器,扩展段寄存器,标志段寄存器,全局段寄存器)16位的段选择器。段选择器是一种特殊的指针用来标识内存中的段。为了访问内存中特定的段
该段的段选择器必须存在于适当的段寄存器中。
在编写应用代码的时候,程序员通常用汇编指令和标识符创建段选择器。汇编器和其他工具通过这些汇编指令和标识符创建实际的段选择器的值。如果编写系统代码,程序员需要直接创建段选择器。可以参考
Intel® 64 and IA-32软件架构开发手册卷三的第三章保护模式下的内存管理。
如何使用段寄存器取决于操作系统或执行器使用的内存管理模型。在平坦模型(未进行分段)下段寄存器加载指向重叠段的段选择器每个段都从线性地址空间的0地址处开始(见图3-6)。这些重叠
的段构成了程序的线性地址空间。通常定义两个重叠段一个用于代码另一个用于数据和堆栈。CS段寄存器指向代码段其他所有段寄存器指向数据和堆栈段。
图3-6
使用分段内存模型时,每个段寄存器通常加载不同的段选择器,以便每个段选择器指向线性地址空间内的不同段(见图3-7)。因此在任何时候,程序最多可以访问线性地址空间中的六个段。要访问一个
没有被任何段寄存器指向的段,程序必须先加载一个段选择器用来访问段寄存器。
图3-7
每个段寄存器都与以下三种存储类型相关联代码数据或堆栈。比如CS寄存器包含代码段的段选择器存储正在执行的指令。处理器从代码段中获取指令使用的逻辑地址由CS寄存器中的段选择器和
EIP寄存器的内容组成。EIP寄存器包含了代码段中下一条被执行的指令的偏移量。CS寄存器不能由应用程序显式加载。而是通过改变程序控制的指令或内部处理器操作隐式加载(比如过程调用,中断处理或
任务切换)。
DS,ES,FS和GS寄存器指向四个数据段。四个数据段可以安全有效的的访问不同类型的数据结构。比如创建四个独立的数据段第一个用于当前模块的数据结构第二个用于从高级模块导出的数据第三用
于动态创建的结构体第四个用于和其他程序的共享数据。为了访问额外的数据段应用程序必须根据需要将这些段的段选择器加载到DS,ES,FS和GS寄存器中。
SS寄存器包含了堆栈段的段选择器当前正在执行的程序任务或处理程序的过程堆栈都存储在这里。所有的堆栈操作都使用SS寄存器来查找堆栈。不像CS寄存器SS寄存器可以被显示加载这允许应用
程序建立多个堆栈并在它们之间切换。
参考3.3"内存组织",了解段寄存器如何在实模式下使用。
CS,DS,SS和ES这四个段寄存器与Intel 8086 and Intel 286处理器中的段寄存器相同而FS和GS寄存器通过Intel386™系列处理器引入到IA-32结构中的。
#### 3.4.2.1 64位模式下的段寄存器
在64位模式下CS,DA,ES,SS每个段基址被视为0而不管相关段描述符基址的值。这为代码数据和堆栈创建了一个平坦地址空间。FS和GS是例外。这两个段寄存器在计算线性地址时都可以作为
附加基址寄存器(在本地数据和某些操作系统的数据结构中寻址)。
即使分段通常被禁用,段寄存器加载也可能会导致处理器执行段访问辅助。这些活动进行期间,处理器仍然可以对加载值进行大多数传统检查(即使这些检查不适用于64位模式)。需要这些检查是因为
在64位模式下加载的段寄存器可能会被兼容模式下运行的应用程序所使用。
在64位模式下禁用CS,DA,ES,SS,FS和GS的限制检查。
@翻译人:墨