一步步问,我要了解虚拟内存真相(2)

为什么堆栈段要定义为向下生长的,有什么好处?以下的话怎么理解?
一般只有堆栈数据段才使用向低端扩展的属性(堆栈段也可使用向上扩展的段),这是因为,向下扩展的段是为以下两个目的而设计的:
第一,堆栈段被定义为独特段,即DS和SS包含不同的选择器。
第二,一个堆栈段是靠将它复制到一个更大的段来扩充自己(而不是靠将现存的页增加到它的段上)。不打算用这种方法实现堆栈的设计者不需要定义向下扩展的段。
下面的又是怎么理解呢?
通过使用段环绕,可以把向下扩展段定义到任何线性地址且可定义为任何大小。
[284 byte] By [lamputa_lito-lamputa] at [2008-1-9]
# 1
容易计算
BaseAddr - HeadAddr就得长度.这个BaseAddr不变。
gaoqing000-gongkejin at 2007-10-19 > top of Msdn China Tech,其他开发语言,汇编语言...
# 2
顶一下
# 3
应该是便于计算
# 4
向上也好算啊
# 5
>为什么堆栈段要定义为向下生长的,有什么好处?
因为SP初始化为堆栈段的大小,SP一直指向栈顶,同时,SP也标志着整个堆栈段的剩余空间大小,CPU可以很容易的通过检测SP<0来判断堆栈段是否溢出。
mengshijie_1981-云中雀 at 2007-10-19 > top of Msdn China Tech,其他开发语言,汇编语言...
# 6
同意 mengshijie_1981() 的说法
cfy_yelong at 2007-10-19 > top of Msdn China Tech,其他开发语言,汇编语言...
# 7
____________ 0x00005000
----- SP -------->| |
| //// |
| //// |
| |
----- SS -------> ------------ 0x00006000 <----初始SP(跟SS一样)
| |
| |
| |
------------

>因为SP初始化为堆栈段的大小,SP一直指向栈顶,同时,SP也标志着整个堆栈段的剩余空间大
>小,CPU可以很容易的通过检测SP<0来判断堆栈段是否溢出。

如上图,SP指示的是栈的顶(暂且叫顶吧,那么SS就叫底了),初始化的时候SP应该是0吧,0偏移嘛,随着数据的压如,SP的指针向地址底方向发展,但是SP只不过是一个“偏移”的概念,SP的值应该是》0的,如果堆栈益处,那么应该是SP的偏移值>堆栈段的段大小,而不会是SP<0吧。
其实SP怎么指示剩余空间的大小呢?剩余空间的大小应该是堆栈的段限-SP的偏移值吧。

请mengshijie_1981() 释疑。

lamputa_lito-lamputa at 2007-10-19 > top of Msdn China Tech,其他开发语言,汇编语言...
# 8
对SP是指针,不代表地址
karamay at 2007-10-19 > top of Msdn China Tech,其他开发语言,汇编语言...
# 9
由于段的影响。你如果是定义为向上。那么ss+sp就溢出了段。
bigbat-大漠苍穹 at 2007-10-19 > top of Msdn China Tech,其他开发语言,汇编语言...