博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Intel 64/x86_64/IA-32/x86处理器段寄存器 - 32位段寄存器/64位段寄存器
阅读量:2043 次
发布时间:2019-04-28

本文共 1639 字,大约阅读时间需要 5 分钟。

Segment Registers

本节主要讲述Intel处理器中的段寄存器,用于支持处理器的段式存储器管理机制。16位的8086/Intel286处理器有4个段寄存器CS/DS/SS/ES。32位的处理器运行在保护模式下时,除了先前的4个段寄存器,还引入了两个新的段寄存器FS/GS,这些寄存器都是16比特位宽。64位模式下的段寄存器有特殊性,后面有一节介绍。

IA-32处理器中的段寄存器(CS/DS/ES/SS/FS/GS)用于保存16位宽的段选择符(segment selector)。要访问存储器中的特定段,对应的段选择符必须要加载到正确的段寄存器中。

当设计应用程序代码时,程序员通常使用汇编器的指示符和符号(directives and symbols)来创建段选择符。汇编器和其他的工具软件会根据这些指示符和符号生成真正的段选择符值。如果是设计系统程序代码,程序员则可以直接创建段选择符(以后有专题介绍)。

段寄存器如何被使用主要取决于操作系统/管理软件采用的存储器管理模型的类型。

当使用平坦(未分段的)存储器模型时,段寄存器加载的段选择符指向重叠的段,在线性地址空间中,每个段的起始地址都是0(参看下图)。这些重叠的段构成了程序可见的线性地址空间。通常,会定义两个重叠的段:一个是代码段,另一个是数据/栈段。CS寄存器指向代码段;其他的所有段寄存器指向数据/栈段。

 

当使用分段存储器模型时,每个段寄存器通常会加载不同的段选择符,这样段寄存器指向线性地址空间中不同的段(参看下图)。任何时候,程序可以同时访问线性地址空间中最多6个段。如果要访问的段没有段寄存器指向,程序必须先将段对应的段选择符加载到某个段寄存器之后,才可以访问段中的数据。

每个段寄存器都关联下列三种存储类型(即段类型)之一:代码段,数据段,栈段。例如,CS段寄存器包含代码段的段选择符,代码段保存正在执行的指令。处理器从代码段读取指令时,使用有CS寄存器中的段选择符与EIP寄存器联合构成的逻辑地址。EIP保存要执行的下一条指令在代码段中的偏移量。CS寄存器不能有应用程序显式地的加载。相反,可以通过某些指令或处理器内部操作隐式地加载。这些指令/内部操作,例如过程调用,中断处理,或者任务切换,用于改变程序的执行流,从而导致更新CS寄存器。

DS/ES/FS/GS这四个寄存器指向四个数据段。多个数据段的存在允许高效地且安全地访问不同的数据结构类型。例如,可以创建如下的四个数据段:第一个数据段保存当前程序模块的数据结构,第二个数据段保存更高级别程序模块导出的数据,第三个数据段保存动态创建的数据结构,最后一个数据段保存另一个程序共享出来的数据。要想访问更多的数据段,应用程序必须按需将数据段对应的段选择符加载到DS/ES/FS/GS寄存器中的其中一个当中。

SS寄存器包含栈段的段选择符,这里栈段用于存储程序/任务/当前正在执行的处理器程序的栈帧。所有的栈操作都使用SS栈段寄存器来定位栈段。与CS代码段寄存器不同,SS寄存器可以显式地加载,这样就允许应用程序建立多个栈段,并在这些段间切换。

Segment Registers in 64-Bit Mode

在64位模式下:处理器把CS/DS/ES/SS的段基都当作0,忽略与之关联的段描述符中的段基地址。这样就为代码/数据/栈创建了平坦的地址空间。但是FS/GS段寄存器是例外。在计算线性地址时,这两个段寄存器可能被用作额外的基址寄存器(当寻址局部数据或寻址某些操作系统数据结构时)。

尽管分段机制被禁用了,但是段寄存器加载操作可能导致处理器执行段访问辅助。在这些辅助行为中,启用了分段机制的处理器依然会对被加载的值执行绝大多数的传统检查(即使这些检查对64位模式不起作用)。这样的检查是必要的,因为在64位模式下加载的段寄存器可能被运行在兼容模式的应用程序使用。

在64位模式下,禁用CS/DS/ES/SS/FS/GS的段限长检查。

转载地址:http://hdpof.baihongyu.com/

你可能感兴趣的文章
【Python】唯品会购买商品
查看>>
【JMeter】如何录制创建及得到曲线图
查看>>
【Loadrunner】Error -26601: Decompression function 错误解决、27728报错解决方案
查看>>
【其他】csv文件打开是乱码,怎么办?
查看>>
【Python】web.py初识学习
查看>>
【Python】【Web.py】python调用html【问题:echart图标调用html上未显示】
查看>>
【雅思】金山词霸-单词学习(1-40)
查看>>
【F12】谷歌浏览器F12前端调试工具 Console
查看>>
【服务器】如何在服务器发布网站?Sasa讲解
查看>>
【F12】九个Console命令,让js调试更简单
查看>>
【数据库】left join(左关联)、right join(右关联)、inner join(自关联)的区别...
查看>>
【雅思】【写作】【大作文】Advantage VS. Disadvantage
查看>>
【雅思】金山词霸-单词学习(41-80)
查看>>
【雅思】【写作】【大作文】Report
查看>>
【雅思】【作文】顾家北100句翻译
查看>>
【雅思】【写作】【大作文】Discuss both views and give your own opinion
查看>>
【托业】【金山词霸】21-42
查看>>
【托业】【金山词霸】单词1-20
查看>>
【Python】脚本运行报错:IndentationError: unindent does not match any outer indentation level...
查看>>
【JMeter】前置处理器
查看>>