Content #
有栈段描述符如下,栈的32 位线性基地址是0x00000000,段界限为0x07a00,粒度为字节,属于可读可写、向下扩展的数据段。
栈是向下扩展的,因此,描述符中的段界限,和向上扩展的段含义不同。对于向上扩展的段,段内偏移量是从0 开始递增,偏移量的最大值是界限值和粒度的乘积;而对于向下扩展的段来说,段内偏移量是从最大值开始递减,段内偏移量的最小值是界限值和粒度的乘积加一。
在32 位代码中,是用ESP 作为栈指针的。因此,这里的段界限,用来和段粒度一起,决定ESP 寄存器所能具有的最小值。即,栈操作时,必须符合条件: ESP > 段界限 * 粒度值
对于描述符中G 位是“0”的段来说,粒度值是1(字节);而对于G 位是“1”的段来说,粒度值是4096(4KB)。
从该段的描述符来看,这个段的空间却是非常巨大的。ESP 的内容可能会是任何预料不到的值,比如0xFFFFFFFF。即使是这样,它也是合法的值,毕竟它大于 0x00007A00。因为当前栈段的线性基地址为0x00000000,所以,实际可以访问的空间是从物理地址0xFFFFFFFF 到0x00007A00。