内核空间和内核堆栈之间的关系是什么?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了内核空间和内核堆栈之间的关系是什么?相关的知识,希望对你有一定的参考价值。

我知道内核空间是操作系统核心执行并提供服务的内存部分,用户空间是用户程序运行的空间。另外我知道一个进程在其地址空间中有自己的堆栈,堆,数据和文本部分。但我对用户堆栈和内核堆栈的概念感到困惑。我的问题是:

  1. 我之前提到的进程堆栈是否包含用户堆栈和内核堆栈?
  2. 内核堆栈是内核空间的一部分吗?
  3. 这两个堆栈是否在进程的虚拟内存地址中分开?
  4. 在代码段中:void main(){user_mode_call(); system_call()}两个调用的堆栈帧分别驻留在用户堆栈和内核堆栈中吗?

感谢您的时间,任何相关的文献和链接也会有所帮助! (我的问题可能很幼稚,但一旦我知道如何以更专业的方式将它们更新,我会不断更新它们)

答案

堆栈结构通常由处理器指定。每个进程通常每个进程模式有一个堆栈(用户,内核+处理器使用的任何其他模块)每个进程和每个处理器一个中断堆栈(另一个内核堆栈)。

我之前提到的进程堆栈是否包含用户堆栈和内核堆栈?

不可以。必须保护内核堆栈免受用户模式访问。

内核堆栈是内核空间的一部分吗?

它可能是或者它可以是用户空间中受保护的内存。

这两个堆栈是否在进程的虚拟内存地址中分开?

是。

在代码段中:void main(){user_mode_call(); system_call()}两个调用的堆栈帧分别驻留在用户堆栈和内核堆栈中吗?

“代码段”是教学构造。两者的堆栈帧都在用户堆栈中。系统调用调用包装器函数,该函数设置寄存器值,然后导致将处理器切换到内核模式的异常。此时,大多数处理器将默认堆栈更改为内核模式堆栈。必须将参数传递给系统调用,因为在内核模式下不能通过SP寄存器直接访问用户堆栈。

以上是关于内核空间和内核堆栈之间的关系是什么?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用perf捕获组合的内核和用户空间堆栈

Linux内核——用户堆栈和内核堆栈

Linux 系统中堆栈的使用方法

linux内核,驱动,应用程三者的概念和之间的关系

linux为啥需要内核栈,系统调用时直接使用用户栈不行吗

用户栈和内核栈