UNIX中的堆栈段
在UNIX中,当进程需要更多空间时,堆栈会自动生长。程序员可想象堆栈是无限大的。这是UNIX胜过其他操作系统(如MS-DOS)的许多优势之一。在UNIX的实现中,一般使用某种形式的虚拟内存。当试图访问当前系统分配给堆栈的空间之外的空间时,它将产生一个硬件中断,称为页错误(page fault)。处理页错误的方法有好几种,具体取决于对页面的引用是否有效。
在正常情况下,内核通过向违规的进程发送合适的信号(可能是段错误)来处理无效地址的引用。在堆栈顶部的下端有一个称为red zone的小型区域,如果对这个区域进行引用,并不会产生失败。相反,操作系统通过一个好的内存块来增加堆栈段的大小。在不同的UNIX实现中,具体细节有所不同,但实际效果相似。附加的虚拟内存紧随当前堆栈的尾部映射到地址空间中。内存映射硬件确保你无法访问操作系统分配给你的进程之外的内存。