Windows保护模式---x86内存寻址详细分析

本文详细介绍了x86架构下,Windows保护模式中的内存寻址方式,特别是段描述符的概念。段寄存器作为段选择子,通过索引全局或局部描述符表来获取段信息。段描述符包括段基址、段限、权限等关键字段,用于确定段的访问权限和范围。Windows NT主要依赖页机制进行内存管理,但在初始化时会设置段寄存器以便简化地址计算。
摘要由CSDN通过智能技术生成

概述

x86下,为了描述段的详细信息,将段用一个64位描述符(Segment Descriptor)来描述段。但段寄存器仍然为16位,但要描述段的信息显然是不可能的,所以段寄存器的16位就用来索引描述符的位置,并且系统 把所有段的段描述符顺序存放在内存的指定位置上,组成描述符表(DT)。故段寄存器中不再像16位那样直接表示段地址,而是仅仅作为一个索引,称x86的段寄存器为段选择子

段描述符表的位置与GDTR(Global DT Rigister,全局描述符表寄存器)和LDT(Local DT Rigister局部描述符表寄存器)
GDTR是48位,LDTR是16位
GDTR存放的描述符表是系统所有任务都可以用的描述符表,通常包含描述操作系统段各个任务的LDT段
LDT是每个任务所独有的描述符表,包含私有的代码段,数据段,堆栈段。
GDT指向的是具体的描述符的位置。而LDT存放的仅仅也是索引,索引的是GDT中的本任务的描述符。所以每个任务的GDT是不变的,而LDT随着任务的切换是会变的。

所以从以上来看,只有16位的段选择子是可见的,其余的是不可见。段选择子并不是全部来索引的,主要分成三部分:

段选择子结构
Index是真正的索引(高13位)之所以是13位是因为每个描述符是8字节对齐,故index*8 即右移三位,获得在描述符表的真正地址
TI(Table Indicator)表示描述符在GDT还是LDT,0表示查找GDT,1表示查找LDT(倒数第二位)
RPL是请求特权级。以什么样的权限去访问段(倒数第一位)。

段描述符的结构:
64位的段描述符段描述符是64位的,这里分割成两部分便于观察,真实情况是最下面那块是0~31位,最上面那块是32-63位。
首先是段基址,被分割成了两部分,一共是24位,为什么分割成两部分是因为要保持向后兼容
段限也是如此,被分割成了两部分,共是20位,段限与G位有密切联系,G位是粒度位,其意义是表明段限的单位是1Byte(G为0时)还是4KB(G为1时),以4KB为单位,正好20位就可以满足,因为4KB是212大小。
P位表示该描述符是否有效,P为1时表示存在该描述符,P为0时表示不存在该描述符,因为有时候内存紧张,而为了节约空间,就有可能只是建立一个假想的描述符对象,而真实内存却没有该描述符,此时P位就为0,如果此时访问不存在的描述符,就会触发一个异常。
DPL 表示描述符的特权级( Descriptor Privilege Level, DPL)。这两位用于指定段的特权级。共有 4 种处理器支持的特权级别,分别是 0、 1、 2、 3,其中 0 是最高特权级别, 3 是最低特权级别。因为处于保护模式下,对权限有着很明确的界限。特权级为0时,权限最高,一般说来是系统内核代码才会有这种权限,用户代码特权级基本为3,这样可以防止恶意代码执行特权指令破坏系统的操作。所谓的ring0层ring3层跟这个也是挂钩的,所以用2位表示4种特权级。
D/B 位是“默认的操作数大小”( Default Operation Size)。设立该标志位,主要是为了能够在 32 位处理器上兼容运行 16 位保护模式的程序D=0 表示指令中的偏移地址或者操作数是 16 位的D=1,指示 32 位的偏移地址或者操作数。例如代码段描述符的 D 位是 0,那么,当处理器在这个段上执行时,将使用 16位的指令指针寄存器 IP 来取指令,否则使用 32 位的 EIP。
AVL位,是给系统用的,我们不需要管。
S位表明它是一个系统段还是代码段或数据段(堆栈段算特殊的数据段)。为0时表明是一个系统段为1则是代码段数据段
S位与Type(段类型)相挂钩。

S为1时:
当s为1的时候
可以看到是代码段还是数据段是跟Type的最高位有关。
当最高位是1的时候表明是代码段代码段三个属性分别为C(Code)R(Read)A(Access)默认代码段可执行
C位表明是否是一致代码段,一致和非一致代码段的区别如下:

一致代码段:
操作系统拿出来的共享代码段,允许低特权级的程序访问一致代码段。
作用:
1.特权级高的程序不允许访问特权级低的数据:核心态不允许调用用户态的数据.
2.特权级低的程序可以访问到特权级高的数据.但是特权级不会改变:用户态还是用户态.

非一致代码段:
为了避免低特权级的访问而被操作系统保护起来的系统代码。
作用:
1.只允许同级间访问
2.禁止不同级别的访问

R位表明代码段是否可读,为1表示可读,为0表示不可读,代码段无写属性
A位表示代码段是否被访问过,被访问过置为1,没有则是0

当最高位是0的时候表明是数据段数据段三个属性分别E(Expand)W(Write)A(Access),默认数据段可读
E位是扩展方向(又称反转空间),当E为1时,表明段基址+段界限这段范围内的不可访问,其他空间可访问,一般情况都是E为0这样[base,base+limit]这段范围就可访问。
W位表明是否可写,为1时表示可写,为0时表示不可写。
A位跟代码段的效果一致。

s位为0时,表明是个系统段,此时的Type取值具体如下:

0 		保留
1 		16位TSS段(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值