堆溢出或堆栈溢出时的Linux内核行为

时间:2017-02-14 04:17:41

标签: linux linux-kernel operating-system

我试图了解一些重要的操作系统概念(为简单起见,让我们坚持使用Linux内核)。假设我在 内核模式 中运行它,可能会将这些行(caseA或caseB不是两者)添加到某个系统调用的源代码中。

# 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: 我知道内核有一个固定(和小)的堆栈保留。所以也许当我给出足够大的值时 - 我将耗尽预定义的堆栈空间。这里发生了什么样的崩溃?我会进入内核的堆部分吗?

1 个答案:

答案 0 :(得分:0)

在您的示例A中,您的应用程序将永远循环。在某些时候,malloc将无法将页面映射到逻辑地址空间并返回0。

在您的示例B中:每个进程都有自己的内核模式堆栈(通常,有一个共享中断堆栈)。

您最终可能会在堆栈末端点击一个防护页面并获得访问冲突。你不会跑过内核的内存池。