12、(12.4.2)保护模式下数据段和栈段保护
原创
©著作权归作者所有:来自51CTO博客作者java硕哥的原创作品,请联系作者获取转载授权,否则将追究法律责任
1/向下扩展的栈段
实际使用的段界限就是段内不允许访问的最低端偏移地址, (基地址+0)~(基地址+段界限)这段空间是不属于栈段.
举例画图说明:
例1, 基地址为0x00000010,段界限为0x10的栈段
段界限可以理解为栈向下扩展时的一个红线,不能碰, 所以压栈时ESP - 操作数的长度
后的值必须大于这个边界值.(这里这么理解与书中ESP - 操作数的长度
>=(实际使用的段界限+1)
是一个意思)
例2 , 基地址为0x7c00 , 段界限为0x10
例3,基地址为0x00007C00, 段界限为0xFFFFEFFF的栈段,粒度为4KB
基地址为 0x00007C00, 段界限为 0xFFFFE(0x0~0xFFFE,共0xFFFFE+1个粒度的内存) ,粒度为4KB
栈的最小地址
= 基地址+段界限 +1
栈的最大地址
= 基地址+ESP/SP的最大值
// 计算段界限
段界限
= (0xFFFFE+1)*4K -1
= (0xFFFFE*4k)+(4K-1)
= (0xFFFFE*0x1000)+(0x1000-1)
= 0xFFFFE*0x1000+0xFFFF
= 0xFFFFEFFF
段界限(0x00000000 ~ 0xFFFFEFFF ),共0xFFFFF000个内存单元(字节)
// 计算栈的最小地址
栈的最小地址
= 基地址+段界限 +1
= 0x00007C00 + 0xFFFFEFFF + 1
= 0x100006BFF + 1
= 0x100006C00
= 0x00006C00(保留32位)
栈的最大地址
= 基地址+ESP的最大值
= 0x00007C00 + 0xFFFFFFFF
= 0x00007BFF