上次关于这个问题问了老师,由于是刚开始学习,所以以为懂了,可以今天又细细研究下,发现还是很迷茫,恳请老师解惑!
最近在研究保护模式,一个问题一直在困扰我,就是段的向下扩展,看雪里有一篇关于向下扩展的,但还是没看明白,希望达人能给我解惑假设我有一个16位段,段基址是 0x2000h,段限是0x5h,那么这个段大小应该是0x6H,但是向下扩展的布局应该是什么样的呢?第一种可能是:0 <-------- 低地址0x1ffbh <-------- 段限(0x2000h-0x5h得到)........0x2000h <-------- 段基址(不确定这该不该是段基址)0xffff <-------- 高地址那有效的区域应该是那一块?我觉得应该是 0x1ffb~0x2000h,但书上说偏移的有效位应该是Limit+1 ~ 1M-1,那么假设我要访问第一个自己,Limit+1 = 6,我实在是想不通 段基址和6是如何关联起来访问到第一个字节的。(而且我对第一个字节的位置在哪里也不确定,是0x1ffbh还是0x2000h-1?第二种可能是,只要是向下扩展的,那么段就从 Base+Limit 变成了Limit+1 ~ 0xffffh,也就是如下:0 <-------- 低地址0x2000h <-------- ........0x2005h <-------- ................0xffff <-------- 高地址这时段的大小从 6 变成了 0xffff-0x2005h+1,那么这个时候,段基址为0x2000h(我认为),段偏移有效位 Limit+1~1M-1我就能理解了,有效的区域是 0x2005h~0xffff,但感觉这样思考很别扭,而且和书上说的:由此可见,如果一个段是向下扩展的,则所有的偏移必须大于限长,因为其限长是指下限,其基地址从高地址出开始。,和蓝色的那句话冲突!我确实分析不清楚了,网上关于向下扩展的资料极少,哎。另外,我也看到说ED的方向决定了计算的方式(加/减),但对这句话没有深刻的认识。
我又想了想,在第一种布局下,如果0x2000h为基址,0x1ffb~0x2000h为有效区域,那么如果要访问到0x1ffffh那个字节,就是要0x2000h-1,而-1 <==> 0xFFFF(有符号)<==>0xFFFF(无符号)<==>1M-1,而1M-1正好处于书上所说的Limit+1~1M-1的有效偏移去,难道CPU把对向下扩展的段的偏移强制看成是无符号的,然后和基址相加吗??
谢谢!
刚刚看了下Intel的白皮书,在书中有这么一段话:
For expand-down data segments, the segment limit has the same function but is interpreted differently. Here, the effective limit specifies the last address that is not allowed to be accessed within the segment; the range of valid offset is from (Effective-limit + 1) to FFFFFFFFH if the B is set and from (effective-limit + 1) to FFFFH is the B is clear; An expand-down segment has maximum size when the segment limit is 0.
这应该是最权威的解释了,还是以2000h为例,5的limit,16位段,那么内存布局应该如下:
0 <-------- 低地址0x2000h <-------- ........0x2005h <-------- Effective-Limit => Base+Limit................0xffff <-------- 高地址
那么这个段的有效地址范围应该为 0x2006h~0xffffh,也即Limit的有效范围是从Limit+1~1M-1,当然,所生成的线性地址应该在2006h到1m-1的范围内。
对于这个问题,我只有一个疑惑了,为什么要从Limit+1开始,这说明这个区域的可访问内存因该是从:0x2006h~0xffffH,0x2005那个位置为什么不允许访问??
谢谢