我正在寻找一个关于Linux内核中堆栈的良好描述,但我发现很难找到任何有用的信息。
我知道对于大多数系统,堆栈被限制为4k,而对于其他一些系统则为8k。 我假设每个内核线程/底半部分都有自己的堆栈。 我还听说如果发生中断,它会使用当前线程的堆栈,但我找不到任何相关的文档资料。我想了解的是如何分配堆栈,是否存在任何好的调试例程(我怀疑特定问题的堆栈溢出,并且我想知道是否可以编译内核以监管堆栈大小等)。
我正在寻找一个关于Linux内核中堆栈的良好描述,但我发现很难找到任何有用的信息。
我知道对于大多数系统,堆栈被限制为4k,而对于其他一些系统则为8k。 我假设每个内核线程/底半部分都有自己的堆栈。 我还听说如果发生中断,它会使用当前线程的堆栈,但我找不到任何相关的文档资料。我想了解的是如何分配堆栈,是否存在任何好的调试例程(我怀疑特定问题的堆栈溢出,并且我想知道是否可以编译内核以监管堆栈大小等)。
THREAD_SIZE
宏定义了(依赖于架构的)每个线程内核堆栈大小。alloc_thread_stack_node()
中分配的。 struct task_struct
中的堆栈指针在 dup_task_struct()
中更新,该函数在克隆线程时被调用。STACK_END_MAGIC
。在页面错误处理程序中,如果发生内核空间故障,则会检查此金丝雀 - 例如,请参见 x86 错误处理程序,如果堆栈金丝雀已被破坏,则 Oops 消息后将打印消息 Thread overran stack, or stack corrupted
。 task-> stack ,那就是这种情况。
ulimit
命令确定进程堆栈的大小。在我的系统上,我得到了8192 KiB:$ ulimit -s
8192
ulimit -s
- Miles Rout对于进程,您可以通过ulimit
命令(-s
选项)控制进程的堆栈大小。对于线程,默认的堆栈大小变化很大,但是您可以通过调用pthread_attr_setstacksize()
来控制它(假设您正在使用pthreads)。
至于使用用户空间堆栈进行中断,我有点怀疑,因为从内核访问用户空间存储器尤其是从中断例程中访问存储器是有些麻烦的。但我不确定。
ulimit -s
命令,结果以 KiB 为单位。 - Miles Rout