内核空间和内核栈之间有什么关系?

3
我知道内核空间是操作系统执行和提供服务的内存部分,用户空间是用户程序运行的地方。此外我知道进程在其地址空间中有自己的堆栈、堆、数据和文本段。但是我对用户堆栈和内核堆栈的概念感到困惑。我的问题是:
  1. 我之前提到的进程堆栈是否由用户堆栈和内核堆栈组成?
  2. 内核堆栈是否是内核空间的一部分?
  3. 这两个堆栈在进程的虚拟内存地址中是否分开?
  4. 在代码段:void main(){user_mode_call(); system_call()}中,这两个调用的堆栈帧是否分别驻留在用户堆栈和内核堆栈中?
谢谢您的时间,任何相关的文献和链接也会很有帮助!
(我的问题可能很幼稚,但我会不断更新它们,以便更加专业)

2
需要整本书来回答。可以免费下载操作系统:三个容易部分来阅读。你的问题太广泛了。你对虚拟地址空间的看法太幼稚了:在终端中尝试cat / proc / $$ / maps,参见[proc(5)](http://man7.org/linux/man-pages/man5/proc.5.html)。 - Basile Starynkevitch
1个回答

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

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

不是。内核堆栈必须受到用户模式访问的保护。

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

可能是,也可能是受保护的用户空间内存。

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

是的。

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

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

那么我们通常所说的堆栈是什么意思呢?它是用户堆栈吗? - Mengfan Ma
在第一段中,“每个进程”可能应该是“每个线程”。 - Felix Dombek
“栈”通常是用户栈。你可以说“每个线程”,从处理器角度来看,它仍然是每个进程,多个进程共享同一地址空间。处理器文档使用进程而非线程的术语。 - user3344003
根据“内核堆栈是否是内核空间的一部分?”的答案,您能否对此进行更详细的解释?在什么情况下内核堆栈不在内核空间中?谢谢。 - codexplorer

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