如果你以某种方式设法让内核强制释放已经给予程序的内存,那么只要它试图访问该内存就可能崩溃。这样的事情很可能是不受支持的:程序不应该继续检查以查看它们被授予的内存是否仍然是他们使用的,并且程序在这样的环境中运行是非常困难的。
任何编写良好的程序都会在尝试使用它们之前检查堆分配是否成功。如果一个被拒绝,程序可以检测到这个(在C中,malloc()
将返回一个空指针)并选择如何处理它(例如,它可能会打印错误消息并退出,或者它可能会继续尝试获取内存)。为了知道如果无法获得任何内存,你的限制性程序会做什么,我们需要访问大量文档或其源代码。
让我们说内核无论如何都会这样做。它为程序分配了一块内存foo
,用它来存储一些数据。过了一会儿,内核会抢回内存,可能会将其重新分配给其他程序(甚至是操作系统)。怎么foo
应该现在得到它的数据?如果它试图访问曾经拥有其数据的内存块,系统应该杀死它 - 这是正确的!内存现在可能包含另一个用户的敏感数据,在这种情况下允许foo
读取它将是一个安全漏洞。如果它被分配给作为另一个用户或操作系统运行的程序,允许foo
写入它可能会导致任何数量的不良和不可预测的事情发生。
当然,堆栈中也存储了变量。我从来没有听说过检查这些分配是否成功的方法; 一切似乎只是假设它们是。我猜每个程序会自动获得一些最小的内存量; 如果该内存不可用,系统将拒绝启动该程序。