首页
社区
课程
招聘
[求助]保护模式中段偏移计算的问题
发表于: 2005-1-8 23:39 4264

[求助]保护模式中段偏移计算的问题

2005-1-8 23:39
4264
原文:

需要注意的是,只有数据段的段属性中才有扩展方向属性位ED,也就是说只有数据段(堆栈段作为特殊的数据段)才有向上扩展和向下扩展之分,其它段都是自然的向上扩展。
数据段的扩展方向和段界限一起决定了数据段内偏移的有效范围。当段最大为1M字节时,在向高端扩展的段内,从0到Limit的偏移是合法有效的偏移,而从Limit+1到1M-1的偏移是非法无效的偏移;在向低端扩展的段内,情形刚好相反,从0到Limit的偏移是非法无效的偏移,而从Limit+1到1M-1的偏移是合法有效的偏移,注意边界值Limit对应地址的有效性。段最大为4G时,情形类似。由此可见,如果一个段是向下扩展的,则所有的偏移必须大于限长,因为其限长是指下限,其基地址从高地址出开始。反之,若一个段是向上扩展的,则所有偏移必须小于等于限长,因为其限长是指上限,基地址从低地址处开始。通过使用段环绕,可以把向下扩展段定义到任何线性地址且可定义为任何大小。

问题:

1.段界限是有符号数吗?可以是负数吗?

2.在段向地址生长、段最大为1M的时候,有效地址是base+limit+1--base+1M-1是不是以下情况:

低地址方向

base

。       <==无效地址

base+limit+1

。       <==有效地址

base+1M-1

高地址方向

这样base跟有效地址就被分开了,感觉很奇怪,而且和蓝色部分说法矛盾。

期望高手指导解释一下,感激不尽!!

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 208
活跃值: (55)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
原文来自ebook《80x86保护模式教程》,“分段管理机制”部分。
2005-1-8 23:42
0
雪    币: 220
活跃值: (55)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
3
低地址方向

base             向下扩展时这是无效地址,不是base

。       <==无效地址

base+limit+1    相当于栈顶

。       <==有效地址

base+1M-1      向下扩展时这是base,相当于栈底

高地址方向

字面意思如此
2005-1-9 02:08
0
雪    币: 208
活跃值: (55)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
我的直觉也是这样的,按字面意思就是



base-1M+1

。  <==无效地址

base-limit   <==栈顶

。 <==有效地址

base        <==栈底



但两个算法是不同的,一个是跟limit+1相加,一个是跟-limit相加,除非limit是有符号数。

但这样的话,段属性中的ED位不就多余?不管ED位是什么,把limit直接加上就可以了(因为limit可正可负)。还望赐教!

原文:
为了适应普通数据段和堆栈数据段在两个相反方向上的扩展,数据段的段属性中安排了一个扩展方向位,标记为ED。ED=0表示向高端扩展,ED=1表示向低端扩展。
2005-1-9 11:09
0
雪    币: 208
活跃值: (55)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
或者举个例子说明一下,谢谢^_^
2005-1-9 11:10
0
雪    币: 208
活跃值: (55)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
顶……求答!
2005-1-10 10:42
0
雪    币: 220
活跃值: (55)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
7
limit是20位,最大可以覆盖整个4G空间,所以limit不可能是有符号数
而ED则是确定这个运算的符号
ED = 0时:
base + limit
ED = 1时:
base - limit
2005-1-10 13:37
0
雪    币: 208
活跃值: (55)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
谢谢XCyber大哥!

原文从来没有提及有base-limit的算法,可能是原文作者考虑不周吧^_^

再次感谢!!
2005-1-10 23:16
0
游客
登录 | 注册 方可回帖
返回
//