相关疑难解决方法(0)

为什么Linux(x86)的页面大小为4 KB,如何计算?

x86架构上的Linux内核的默认内存页面大小是4 KB,我想知道这是如何计算的,为什么?

linux x86 kernel cpu-architecture

31
推荐指数
4
解决办法
3万
查看次数

为什么stackoverflow错误混乱?

这个简单的C程序很少在相同的调用深度终止:

#include <stdio.h>
#include <stdlib.h>

void recursive(unsigned int rec);

int main(void)
{
  recursive(1);
  return 0;
}

void recursive(unsigned int rec) {
    printf("%u\n", rec);
    recursive(rec + 1);
}
Run Code Online (Sandbox Code Playgroud)

这种混乱行为背后的原因是什么?

我正在使用fedora(16GiB ram,堆栈大小为8192),并使用cc编译而没有任何选项.

编辑

  • 我知道这个程序会抛出一个stackoverflow
  • 我知道启用一些编译器优化会改变行为,程序将达到整数溢出.
  • 我知道这是未定义的行为,这个问题的目的是理解/获得可能解释我们在那里观察到的实现特定内部行为的概述.

问题是更多,因为在Linux上,线程堆栈大小是固定的,并且给出了ulimit -s什么会影响可用的堆栈大小,以便堆栈溢出并不总是出现在相同的调用深度?

编辑2 @BlueMoon总是在他的CentOS上看到相同的输出,而在我的Fedora上,堆栈为8M,我看到不同的输出(最后打印的整数261892或261845,或261826,或......)

c stack-overflow recursion operating-system

6
推荐指数
1
解决办法
268
查看次数