用于linux进程的内核堆栈

sur*_*esh 22 linux kernel

所有进程的内核堆栈是共享的还是每个进程都有一个单独的内核堆栈?如果每个进程分开存储该堆栈指针的位置?在task_struct中?

rob*_*ger 19

只有一个共同的内核内存.在其中每个进程都有自己的task_struct +内核堆栈(默认为8K).

在上下文切换中,旧堆栈指针被保存在某处,并且实际堆栈指针指向将要运行的新进程的堆栈顶部(或底部,具体取决于硬件架构).

  • 在上下文切换中,旧堆栈指针值存储在正在用新进程替换的进程的task_struct中,并且从该新进程的task_struct读取新进程的堆栈指针. (3认同)

unw*_*ind 12

这篇旧文章说每个进程都有自己的内核堆栈.请参阅评论,为什么这似乎是一个非常好的设计.

我尝试读取当前的源代码以确保,但由于内核堆栈是"隐式"的,因此它在...中不可见task_struct.这在文章中提到.

编辑这个答案是为了结合评论中的智慧.谢谢.

  • 我严重怀疑这可以改变.内核堆栈是一个非共享空间,系统调用可以放置它们的数据.如果您在进程之间共享它们,则几个内核例程可能同时使用相同的堆栈 - >数据损坏. (3认同)