转发: 段选择符,段描述符,段寄存器

转发自:https://blog.csdn.net/chen1540524015/article/details/74075397

段寄存器(segement register) 段选择符(segement selector) 段描述符(segement descriptor) 学习总结

1 段寄存器
段寄存器包括CS,SS,DS,ES,FS,GS。结构如下图:
这里写图片描述
段寄存器包括可见部分和不可见部分。可见部分是段选择符字段,不可见部分包括基地址字段、界限字段和访问信息。段寄存器首先加载段选择符来填充可见部分,不可见部分的字段由段选择符指向GDT或LDT中的段描述符的字段填充。

2 段选择符(Segment Selectors)
段选择符为16位,描述段的一些信息,它不是直接指向段,指向在GDT或LDT中的段描述符。如下图所示,
这里写图片描述
段选择符的包含以下字段:
索引(index)—位3到位15。可以在GDT或LDT中寻址到213(8192)个描述符。
TI标志—位2。为0,描述符在GDT中,为1,描述符在LDT中。如下图所示。
这里写图片描述
请求特权级(RPL)—位0到位1。表示特权级0,1,2,3。描述符中则为DPL(描述特权级)。

3 段描述符(Segment descriptors)
段描述符是保存在GDT或LDT中一种数据结构,为处理器提供段的大小和位置以及控制和状态信息。通常段描述符是由编译器,连接器,装载器或操作系统生成,而不是应用程序。下图描述段描述符的结构:
这里写图片描述
段选择符的字段如下:
(1)段界限字段—指定段的大小。段界限字段为20位,如果G标志设置,表明表明段的大小从4KB到4GB,4KB增长;如果G标志清除,段的大小从1Byte到1Mbyte。
(2)基地址字段—32位,定义在4GB的线性地址空间中段0字节的位置(开始位置)。
(3)类型字段—说明段或门的类型和指出段的访问方式和增长方向。跟是否是应用程序(代码或数据)描述符或者系统描述符有关。
(4)S标志—被清除,说明是系统段;设置,说明是代码或数据段。
(5)DPL字段—说明段的特权级0,1,2,3。
(6)P标志—置位,说明该段在内存中;被清除,说明该段不在内存中。
(7)D/B标志—根据段描述符是可执行代码段、向下扩展的数据段还是栈段完成不同功能。如果是可执行代码段,该标志称为D标志,表明指令引用段中有效地址和操作数的长度。如果是栈段,该标志称为B标志,表明隐式栈操作(pops,pushes,calls)栈指针的大小。如果是向下扩展的数据段—该标志称为B标志,表明段的上限。
(8)G标志—决定段的界限字段的的大小和步进。
(9)L标志—表明代码段是否包含原生的64位代码,为1表明该代码段的指令运行在64位模式,为0表明代码段指令运行在32位模式。
(10)可用和保留位—系统软件可用或保留。

代码段、数据段和系统段的结构如下图:

这里写图片描述
选择符和描述符的关系举例:
由选择符访问描述表中的描述符,得到基址信息,在加上偏移,完成逻辑地址向线性地址(虚拟地址)的转变。

这里写图片描述

--------------------- 本文来自 chen123lin 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/chen1540524015/article/details/74075397?utm_source=copy

猜你喜欢

转载自blog.csdn.net/Jbinbin/article/details/82965888