gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 11:21:20 38 4
gpt4 key购买 nike

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

# Assume __malloc() here is a simple heap memory manager
void consume_heap_forever(void)
{

for (;;)
(void) __malloc(PAGE_SIZE);
}

案例A:上面的循环消耗堆。我将首先开始消耗内存,一切都会正常进行。在足够高的消耗之后,什么开始发生(在崩溃之前)?我知道内核空间在进程地址空间的保留 block 内。当我越过内核使用的堆栈部分时,我会崩溃吗?还是这会扩大保留范围(并可能消耗整个虚拟内存)?

# Vanilla Factorial logic
int factorial(int value)
{
if (value == 0)
return 1;
return value * factorial(value-1)
}

案例 B:我知道内核为它保留了固定的(和少量的)堆栈。所以也许当我给出一个足够大的值时——我会用完预定义的堆栈空间。这里发生了什么样的崩溃?我会进入内核的堆部分吗?

最佳答案

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

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

很可能您最终会访问堆栈末尾的保护页并遇到访问冲突。您不会超出内核的内存池。

关于Linux 内核在堆溢出或堆栈溢出时的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42217778/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com