|
|
@ -105,25 +105,39 @@ Intel 和 IA-32 处理器都是采用“little endian(小端)”方式存储 |
|
|
|
|
|
|
|
### 3.4.2 段寄存器 |
|
|
|
@翻译人:墨 |
|
|
|
段寄存器控制(代码段寄存器,数据段寄存器,堆栈段寄存器,扩展段寄存器,标志段寄存器,全局段寄存器)16 位的段选择子。段选择子是一种特殊的指针,用来标识内存中的段。为了访问内存中特定的段,该段的段选择子必须存在于适当的段寄存器中。 |
|
|
|
在编写应用代码的时候,程序员通常用汇编指令和标识符创建段选择子。汇编器和其他工具通过这些汇编指令和标识符创建实际的段选择子的值。如果编写系统代码,程序员需要直接创建段选择子。可以参考 Intel® 64 and IA-32 软件架构开发手册卷三的第三章:保护模式下的内存管理。 |
|
|
|
如何使用段寄存器取决于操作系统或执行器使用的内存管理模型。在平坦模型(未进行分段)下,段寄存器加载指向重叠段的段选择子,每个段都从线性地址空间的0地址处开始(见图 3-6 )。这些重叠 |
|
|
|
|
|
|
|
段寄存器控制(代码段寄存器,数据段寄存器,堆栈段寄存器,扩展段寄存器,标志段寄存器,全局段寄存器)16 位的段选择子。段选择子是一种特殊的指针,用来标识内存中的段。为了访问内存中特定的段,该段的段选择子必须存在于适当的段寄存器中。 |
|
|
|
|
|
|
|
在编写应用代码的时候,程序员通常用汇编指令和标识符创建段选择子。汇编器和其他工具通过这些汇编指令和标识符创建实际的段选择子的值。如果编写系统代码,程序员需要直接创建段选择子。可以参考 Intel® 64 and IA-32 软件架构开发手册卷三的第三章:保护模式下的内存管理。 |
|
|
|
|
|
|
|
如何使用段寄存器取决于操作系统或执行器使用的内存管理模型。在平坦模型(未进行分段)下,段寄存器加载指向重叠段的段选择子,每个段都从线性地址空间的0地址处开始(见图 3-6 )。这些重叠 |
|
|
|
的段构成了程序的线性地址空间。通常定义两个重叠段:一个用于代码,另一个用于数据和堆栈。 CS 段寄存器指向代码段,其他所有段寄存器指向数据和堆栈段。 |
|
|
|
图3-6 |
|
|
|
使用分段内存模型时,每个段寄存器通常加载不同的段选择子,以便每个段选择子指向线性地址空间内的不同段(见图 3-7 )。因此在任何时候,程序最多可以访问线性地址空间中的六个段。要访问一个没有被任何段寄存器指向的段,程序必须先加载一个段选择子用来访问段寄存器。 |
|
|
|
|
|
|
|
使用分段内存模型时,每个段寄存器通常加载不同的段选择子,以便每个段选择子指向线性地址空间内的不同段(见图 3-7 )。因此在任何时候,程序最多可以访问线性地址空间中的六个段。要访问一个没有被任何段寄存器指向的段,程序必须先加载一个段选择子用来访问段寄存器。 |
|
|
|
图3-7 |
|
|
|
每个段寄存器都与以下三种存储类型相关联:代码,数据或堆栈。比如,CS寄存器包含代码段的段选择子,存储正在执行的指令。处理器从代码段中获取指令,使用的逻辑地址由CS寄存器中的段选择子和 |
|
|
|
|
|
|
|
每个段寄存器都与以下三种存储类型相关联:代码,数据或堆栈。比如,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 结构中的。 |
|
|
|
|
|
|
|
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 位模式下:CS , DA , ES , SS 每个段基址被视为 0 ,而不管相关段描述符基址的值。这为代码,数据和堆栈创建了一个平坦地址空间。FS 和 GS 是例外。这两个段寄存器在计算线性地址时都可以作为附加基址寄存器(在本地数据和某些操作系统的数据结构中寻址)。 |
|
|
|
|
|
|
|
即使分段通常被禁用,段寄存器加载也可能会导致处理器执行段访问辅助。这些活动进行期间,处理器仍然可以对加载值进行大多数传统检查(即使这些检查不适用于64位模式)。需要这些检查是因为 |
|
|
|
在 64 位模式下加载的段寄存器可能会被兼容模式下运行的应用程序所使用。 |
|
|
|
在 64 位模式下禁用 CS , DA , ES , SS , FS 和 GS 的限制检查。 |
|
|
|
|
|
|
|
在 64 位模式下禁用 CS , DA , ES , SS , FS 和 GS 的限制检查。 |
|
|
|
|
|
|
|
# 第四章 Data Types |
|
|
|
|
|
|
|