2011-06-07 257 views
34

我正在寻找linux内核中栈的很好的描述,但是我发现它很难找到有用的东西。Linux堆栈大小

我知道大多数系统的堆栈限制为4k,其他系统限制为8k。我假设每个内核线程/下半部分都有自己的堆栈。我也听说如果中断发生,它会使用当前线程的堆栈,但是我找不到任何这样的文档。我正在寻找的是如何分配栈,如果有任何良好的调试例程(我怀疑特定问题的堆栈溢出,并且我想知道是否可以将内核编译为警察堆栈大小等)。

+0

你正在使用什么内核版本?所以我们更好地了解可用的内核调试配置选项。 – 2011-06-07 20:08:27

+0

我似乎没有得到这个。为什么调试器不足以完成任务? – cnicutar 2011-06-07 20:11:32

+0

“下半部分”可能共享相同的堆栈。另外,“下半部分”很久以前就消失了,现在还剩下一些软件。 – ninjalj 2011-06-07 20:48:21

回答

1

对于进程,您可以通过ulimit命令(-s选项)控制进程的堆栈大小。对于线程,默认堆栈大小差异很大,但您可以通过调用pthread_attr_setstacksize()(假设您正在使用pthreads)来控制它。

至于使用userland堆栈的中断,我有点怀疑它,因为访问用户态内存是内核的一种麻烦,尤其是来自中断例程。但我不确定。

32

文档稀缺的原因是它是一个与架构相关的领域。代码确实是最好的文档 - 例如,THREAD_SIZE宏定义了(依赖于体系结构的)每线程内核堆栈大小。

堆栈分配在alloc_thread_info_node()或该函数的体系结构特定覆盖(struct thread_info始终位于堆栈的底部)。 struct task_struct中的堆栈指针在dup_task_struct()中更新,它被称为克隆线程的一部分。

内核通过在堆栈末尾放置一个金丝雀值STACK_END_MAGIC(紧接在内存中的struct thread_info之后)来检查内核堆栈溢出。在页面错误处理程序中,如果发生内核空间错误,则检查此金丝雀 - 例如参见the x86 fault handler,如果堆栈金丝雀已被破坏,则在Oops消息之后打印消息Thread overran stack, or stack corrupted

当然这并不会触发全部堆栈超限,只有那些可以摧毁堆栈的币种。但是,如果您遇到堆栈溢出,您应该始终能够从Oops输出中得知 - 如果堆栈指针低于&threadinfo,则情况就是如此。

5

您可以使用ulimit命令确定进程堆栈大小。我在我的系统上获得8192 KiB:

$ ulimit -s 
8192 
+5

质量差的答案,因为问题是关于内核。引用_“在Linux内核中的堆栈”_。 – catpnosis 2015-10-15 18:43:44

+2

@MilesRout我不好,我认为它关心内核堆栈大小。 – 2016-04-18 11:15:11

+0

事实上,这似乎不是正确的答案,但是寻求进程堆栈的大小(因为问题可以回答它) – 2017-12-03 21:23:38