段界限 描述符表 32位保护模式

本文详细介绍了32位保护模式下段描述符的结构,特别是界限值的计算方式,以及G位对最大偏移的影响。讨论了代码段和数据段在不同G位设置下的有效偏移地址范围,并且提到了栈段的特殊情况。同时,解释了D/B位的作用,它决定了代码段使用eip还是ip,以及栈段使用esp还是sp。最后,文章还展示了如何通过添加描述符来修改代码段。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

描述符表 由8字节的描述符组成, 高32位为描述符起始地址,低16位为界限值
界限: 最大偏移 == 总字节数-1

描述符内的界限 == 长度单位 根据G位来计算最大偏移,G(0) = 1, G(1) = 4k
由于偏移从0开始计算,因此 (界限+1) == 总长度, 总长度 * (4K或1) == 总字节数
因此最大偏移 : (界限+1)*(4K或1) - 1 

比如(代码段/数据段)基址:0 , 界限0x1ff
若G位=0(1字节), 偏移:(0x1ff+1)*1-1 = 0x1ff,占用字节数(0x1ff+1)*1 = 512b,eip 从 [ 0 ~ 1ff ] 为有效偏移地址
若G位=1(4K) , 占用字节数(0x1ff+1)*4k,最大偏移(0x1ff+1)*4k-1 =  1FFFFF,eip从[0~1FFFFF] 为有效偏移

栈段的界限也类似
假设基址:0, 界限:0xffffe , esp:0xffffffff
若G=0, 最大偏移(esp最小值):(0xffffe+1)*1 - 1 + 1 = 0xffffe, 字节:0xffffffff- 0xffffe + 1
若G=1, 最大偏移(esp最小值):(0xffffe+1)*4k - 1 + 1= 0xFFFFF000‬, 字节数:0xffffffff-0xFFFFF000‬+1
为什么还要+1 ?  栈顶指向最高地址的下一个内存地址


描述符D/B位 
D/B == 1  , 代码段则使用eip, stack段使用esp
D/B ==0 , 代码段用ip , stack用sp
如果代码段使用 push 4字节指令, 但stack段的B位为0,使用 sp - 4, 用sp/esp由stac

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值