Linux堆栈大小

我在linux内核中寻找堆栈的一个很好的描述,但是我发现很难find有用的东西。

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

Solutions Collecting From Web of "Linux堆栈大小"

文档缺乏的原因是这是一个非常依赖于架构的领域。 代码实际上是最好的文档 – 例如, THREAD_SIZE宏定义了(依赖于体系结构的)每线程内核堆栈大小。

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

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

当然,这不会触发所有的堆叠超限,只有那些打破堆叠金丝雀的堆叠超限。 但是,如果堆栈溢出,您应该始终能够从Oops输出中得知 – 如果堆栈指针位于&threadinfo之下,则是这种情况。

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

 $ ulimit -s 8192 

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

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