我正试图理解一些重要的操作系统概念(为了简单起见,让我们只考虑Linux内核)。假设我以内核模式运行此代码,并将以下行(仅选择A或B中的一种)添加到某个系统调用的源代码中。
# Assume __malloc() here is a simple heap memory manager
void consume_heap_forever(void)
{
for (;;)
(void) __malloc(PAGE_SIZE);
}
案例A:上述代码在循环中消耗堆内存。一开始,我会开始消耗内存,然后事情会变得正常。在消耗足够多的内存之后,在崩溃之前会发生什么?我知道内核空间位于进程地址空间中的保留块内。当我穿过内核使用的堆栈部分时,我会在哪个点崩溃?或者这会扩大那个保留空间(甚至占用整个虚拟内存)吗?
# Vanilla Factorial logic
int factorial(int value)
{
if (value == 0)
return 1;
return value * factorial(value-1)
}
案例 B: 我知道内核为其保留了一定的(且较小的)栈空间。因此,当我提供的值足够大时,我可能会用尽该预定义的栈空间。这种情况下会发生什么样的崩溃?我会跨越内核的堆部分吗?