所有进程的内核堆栈是共享的还是每个进程都有一个单独的内核堆栈?如果每个进程分开存储该堆栈指针的位置?在task_struct?
答案 0 :(得分:19)
只有一个共同的内核内存。在其中每个进程都有自己的task_struct +内核堆栈(默认为8K)。
在上下文切换中,旧的堆栈指针被保存在某处,实际的堆栈指针指向要运行的新进程的堆栈顶部(或底部,具体取决于硬件架构)。
答案 1 :(得分:12)
This old article表示每个进程都有自己的内核堆栈。请参阅评论为什么这似乎是一个非常好的设计。
我尝试reading the current source来确保,但由于内核堆栈是“隐式的”,因此它在task_struct
中不可见。这在文章中提到。
这个答案经过编辑,融入了评论中的智慧。感谢。
答案 2 :(得分:2)
Robert Love的“Linux内核开发”一书对进程内核堆栈有一个很好的解释。
是的,每个进程都有自己的内核堆栈,如果我没错,它的指针存储在thread_info结构中。但我不确定它,并且struct task_struct存储在进程内核堆栈的开头或结尾,具体取决于CPU架构。
干杯。 Carlos Maiolino
答案 3 :(得分:1)
我认为每个进程都有自己的内核模式堆栈。驱动程序在内核模式下执行,有时在执行驱动程序时会阻塞该进程。并且操作系统可以安排另一个进程运行。计划的进程可以再次调用驱动程序。如果内核堆栈是共享的,那么2个进程正在使用内核堆栈,事情将会混淆。很长一段时间我对这个问题感到困惑。起初我认为内核堆栈是共享的,有些书说。在我阅读了Linux内核开发,并看到一些驱动程序代码之后,我开始认为内核堆栈不是共享的。