Browse Source

Update 卷一:基本架构.md

pull/4/head
BaoZR 4 years ago
committed by GitHub
parent
commit
7a4ef957c5
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 22
      Intel 手册中文版/卷一:基本架构.md

22
Intel 手册中文版/卷一:基本架构.md

@ -11,7 +11,29 @@
### 3.4.2 Segment Register
@翻译人:墨
3.4.2 段寄存器
段寄存器(CS,DS,SS,ES,FS,GS)有16位段选择器。一个段选择器是指向内存段的一个指针。为了访问内存中特定的一个内存段,这个段的段选择器必须体现在合适的段寄存器中。
当程序员写应用程序代码的时候,通常会使用汇编指令和符号创建段选择器。然后,汇编程序和其他工具然后创建与这些指令和符号关联的实际段选择器。当写系统代码时,程序员需要直接创建段选择器。参见第三章 “Protected-Mode Memory Management,” in the *Intel® 64 and IA-32 Architectures Software Developer’s* Manual, Volume 3A.
如何使用段选择器取决于操作系统或执行者使用的内存管理模型的类型。当使用平坦的(未分段的)内存模型,段寄存器加载的段选择器指向重叠的内存段,每个段寄存器器都指向线性地址空间的0地址(参见 3-6)。这些重叠段构成了程序的线性地址空间。通常定义两个重叠的段,一个指向代码段,另一个指向数据段和栈段。CS段寄存器指向了代码段,另外的其他段寄存器指向了数据段和栈段。
使用分段内存模型时,每个段寄存器通常由不同的段选择器加载,使每个段寄存器指向线性地址空间内的不同段(参见图3-7)。任何时候,程序能访问线性地址空间的六个段的地址,要访问一个没有被任何段寄存器指向的段,一个程序需要先加载这个段的段选择器到段寄存器中。
图 3-6
图 3-7
每一个段寄存器都与三种存储类型中的一种相关联:代码,数据或是栈。例如,CS寄存器包含代码段的段选择器,其中存储正在执行的指令。处理器从代码段中取指令,使用CS寄存器中的段选择器和EIP寄存器中的内容组成的逻辑地址。EIP寄存器包含下一个要执行指令在代码段中的偏移量。应用程序不能显式地加载CS寄存器。相反,它是通过指令或内部处理器操作隐式加载从而改变程序控制(比如过程调用,中断处理,任务选择)。
DS,ES,FS,GS寄存器指向四个数据段。四种数据段允许高效和安全的访问不同的数据结构类型。比如,可以创建四个独立的数据段:一个指向当前模块的数据结构,另一个指向高等级模块导出的数据,第三个指向动态创建的数据段,第四个指向与其他程序共享的数据。为了访问另外的数据段,应用程序需要加载这些段的段选择器到DS、ES、FS和GS寄存器中。
SS寄存器包含了指向栈段的段选择器,程序栈存储了正在被运行的程序,任务和处理器。所有的段操作使用SS寄存器去寻找栈段。不同于CS寄存器,SS寄存器是被显式加载的,它允许应用程序设置多个堆栈并在它们之间切换。
参见3.3节,“Memory Organization” 概述如何在真实地址模式下使用段寄存器.
四个段寄存器CS,DS,SS,ES同Intel 8086和Intel 286处理器中的段寄存器相同,从IA-32架构的Inter386™系列处理器开始引入了FS和GS寄存器。
# 第四章

Loading…
Cancel
Save