一步步问,我要了解虚拟内存真相(2)
为什么堆栈段要定义为向下生长的,有什么好处?以下的话怎么理解?
一般只有堆栈数据段才使用向低端扩展的属性(堆栈段也可使用向上扩展的段),这是因为,向下扩展的段是为以下两个目的而设计的:
第一,堆栈段被定义为独特段,即DS和SS包含不同的选择器。
第二,一个堆栈段是靠将它复制到一个更大的段来扩充自己(而不是靠将现存的页增加到它的段上)。不打算用这种方法实现堆栈的设计者不需要定义向下扩展的段。
下面的又是怎么理解呢?
通过使用段环绕,可以把向下扩展段定义到任何线性地址且可定义为任何大小。
____________ 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() 释疑。