火哥 windows内核交流QQ 群 1026716399
学保护模式,我们不可避免会学段描述符,那么在段描述符中又分数据段与代码段以及系统相关的门或任务的一些东东,
那么今天我们就来详细说一说数据段中的ED位,请看下图
在type字节中的第三位 是ED位,当ED 位 = 1的时候 是向下拓展,当ED位等于0的时候是向上拓展
那么问题来了,什么是向上拓展,什么是向下拓展?
顾名思义 向上拓展 就是 低地址向高地址累加,比如一个段的大小是4G,我的基址是0,LIMIT =0xffffffff
那么向上拓展 就是 0-LIMIT的这段空间,我可以使用
那么向下拓展又是啥意思勒?
比如一个段的大小是4G,我的基址是0,LIMIT =0xffffffff 意思是 我0-LIMIT的这段空间 我都不能用
此时的BASE 不在是基址,而是用BASE+LIMIT才是基址,LIMIT 还是LIMIT
就是BASE+LIMIT为起始地址,到LIMIT这段空间可以用,
那么问题又来了。虚拟地址 只有4GB,如果一段就有4GB大小,又是向下拓展的,这个段还能用吗?
不能。
而且在32位的情况下 ED位不会决定栈的方向,栈的方向是在eflag寄存器中被决定的
所以大家不要看了一本书就认为是对了。下面我们来贴代码。看现象
我们先在windbg中加入一段数据段描述符 把ED位设置为1,就是向下拓展
然后咱们 这个base是0,limit是ffffffff。
理论上来说,我0-LIMIT都不能读写
我们看代码
直接不允许访问。被限定了。那么我们在来修改下段描述符
这是运行的结果。
相信大家已经明白了。向下拓展的含义,
有兴趣的朋友 可是测试下 用局部变量测试下DS,然后测试下SS,看看有什么不同。
那么我们继续测试下SS的方向问题
我们ESP 是0012ff34对吧。有些书说设置了ED=1,那么久是递增的。那么我们看看是不是这样
F10一下
我们发现。和以前一样没有区别。那么通过动手实验,是不是发现x86保护模式下的ED和栈的方向 没关系
16位实模式 可能有关系。但是我没动手做过这个实验,有兴趣的朋友做做。希望大家留言给我哈