Linux进程的内核栈

22

所有进程的内核栈是否共享,还是每个进程都有一个独立的内核栈?如果对于每个进程是独立的,那么这个栈指针存储在哪里?在task_struct中吗?

4个回答

21

只有一个通用的内核内存。每个进程在其中都有自己的task_struct和内核栈(默认为8K)。

在上下文切换中,旧的栈指针被保存在某个地方,实际的栈指针被设置为将要运行的新进程的栈顶(或底部,取决于硬件架构)。


3
在上下文切换时,旧的堆栈指针值被存储在被替换为新进程的task_struct中,而新进程的堆栈指针从该新进程的task_struct中读取。 - robert.berger

12

这篇旧文章称每个进程都有自己的内核栈,评论中解释了为什么这是一种非常好的设计。

我尝试阅读当前源代码以确认,但由于内核栈是“隐式”的,在task_struct中不可见。这在文章中有提到。

此答案已经被编辑以包含评论中的智慧。谢谢。


3
我严重怀疑这能否被改变。内核栈是一个非共享的空间,系统调用可以将它们的数据放置在其中。如果在进程之间共享,那么多个内核例程可能会同时使用同一个栈 -> 数据损坏。 - Aaron Digulla
1
我认为每个进程都需要拥有自己的内核栈,因为多个不同的进程可能会同时执行系统调用,而你不希望它们混淆。 - David Z
每个进程都有自己的内核栈,每个内核栈都有其关联的进程。这从未改变过。这就是为什么在“ps”中会有一些类似伪进程的东西。 - J-16 SDiZ
1
我认为每个任务都需要自己的内核栈,但控制它的代码可能隐藏在特定于架构的arch/目录中。 - MarkR

2

罗伯特·洛夫(Robert Love)的书《Linux内核开发》对进程内核栈有很好的解释。

是的,每个进程都有自己的内核栈,如果我没记错的话,它的指针存储在thread_info结构中。但我不是很确定,而且struct task_struct结构体存储在进程内核栈的开始或结束位置,具体取决于CPU架构。

祝好。 卡洛斯·迈奥利诺


2
从 Linux 2.6 内核开始,thread_info 结构体被存储在每个进程的内核栈的末尾,而不是 task_struct 结构体。thread_info 结构体包含指向 task_struct 结构体的指针。 - nitin_cherian

1

我认为每个进程都有自己的内核模式堆栈。驱动程序在内核模式下执行,进程有时会在执行驱动程序例程时被阻塞。操作系统可以安排另一个进程运行。被调度的进程可以再次调用驱动程序例程。如果内核堆栈是共享的,两个进程都使用内核堆栈,事情将会混乱。我对这个问题困惑了很长时间。起初我认为内核堆栈是共享的,一些书也是这么说的。但是在我阅读了《Linux内核开发》并查看了一些驱动程序代码之后,我开始认为内核堆栈是不共享的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接