所有进程的内核栈是否共享,还是每个进程都有一个独立的内核栈?如果对于每个进程是独立的,那么这个栈指针存储在哪里?在task_struct中吗?
只有一个通用的内核内存。每个进程在其中都有自己的task_struct和内核栈(默认为8K)。
在上下文切换中,旧的栈指针被保存在某个地方,实际的栈指针被设置为将要运行的新进程的栈顶(或底部,取决于硬件架构)。
罗伯特·洛夫(Robert Love)的书《Linux内核开发》对进程内核栈有很好的解释。
是的,每个进程都有自己的内核栈,如果我没记错的话,它的指针存储在thread_info结构中。但我不是很确定,而且struct task_struct结构体存储在进程内核栈的开始或结束位置,具体取决于CPU架构。
祝好。 卡洛斯·迈奥利诺
thread_info
结构体被存储在每个进程的内核栈的末尾,而不是 task_struct
结构体。thread_info
结构体包含指向 task_struct
结构体的指针。 - nitin_cherian我认为每个进程都有自己的内核模式堆栈。驱动程序在内核模式下执行,进程有时会在执行驱动程序例程时被阻塞。操作系统可以安排另一个进程运行。被调度的进程可以再次调用驱动程序例程。如果内核堆栈是共享的,两个进程都使用内核堆栈,事情将会混乱。我对这个问题困惑了很长时间。起初我认为内核堆栈是共享的,一些书也是这么说的。但是在我阅读了《Linux内核开发》并查看了一些驱动程序代码之后,我开始认为内核堆栈是不共享的。