内核堆栈和用户堆栈有什么区别?

时间:2011-02-09 06:36:41

标签: operating-system stack kernel

在同一个程序中使用两个不同堆栈的需求是什么?陷阱如何将当前的程序堆栈从用户堆栈更改为内核堆栈?完成系统调用后如何回到用户堆栈?

每个进程都有内核和用户堆栈吗?

7 个答案:

答案 0 :(得分:11)

每个CPU有一个“内核堆栈”。每个进程都有一个“用户堆栈”,尽管每个线程都有自己的堆栈,包括用户和内核线程。

“陷阱如何更改堆栈”实际上非常简单。

由于中断,CPU会更改进程或“模式”。中断可能由于许多不同原因发生 - 发生故障(如错误或页面错误),或物理硬件中断(如来自设备) - 或定时器中断(例如在使用进程时发生)所有这些都分配了CPU时间“)。

无论哪种方式 - 当调用此中断时,CPU寄存器都保存在堆栈中 - 所有寄存器 - 包括堆栈指针本身。

通常会调用“调度程序”。然后,调度程序选择另一个进程运行 - 恢复所有已保存的寄存器,包括堆栈指针,并从停止的位置继续执行(存储在返回地址指针中)。

这称为“上下文切换”。

我正在简化一些事情 - 比如如何保存和恢复内存管理上下文,但这就是主意。它只是保存和恢复寄存器以响应中断 - 包括“堆栈指针”寄存器。

答案 1 :(得分:8)

有2个堆栈,因为有2个CPU执行上下文。用户模式堆栈将满足您的程序关于为函数,局部变量,返回地址等创建堆栈帧。当CPU将上下文切换到内核模式时,例如在系统调用执行期间,它需要访问内核内存和数据结构然后切换到使用它的内核堆栈。 是的,我认为Unix使用每进程内核堆栈。

答案 2 :(得分:4)

  

在同一程序中使用两个不同堆栈的需求是什么

我从来没有听说过单个进程的内核和用户堆栈,尽管它可能非常常见。讨论了here

必须将内核堆栈与用户模式堆栈隔离开来。否则,用户模式代码可能会破坏内核堆栈,从而导致内核崩溃。

  

trap如何将当前的程序堆栈从用户堆栈更改为内核堆栈

您可能希望查找Intel Software Developer's Manuals

之类的内容
  

每个进程都有内核和用户堆栈

我认为这随操作系统设计而变化,但可能相当普遍。我上面提供的链接表明Linux每个进程使用两个(或更多)堆栈。我没有听说过使用每进程内核模式堆栈的Windows。

答案 3 :(得分:3)

拥有单独内核堆栈的原因之一是内核需要一个位置来存储用户模式代码无法触及的信息。这可以防止在不同线程/进程中运行的用户模式代码意外或恶意地影响内核的执行。

答案 4 :(得分:3)

我正在大学学习操作系统,我们的项目基于哈佛大学建造的OS/161。所以我的答案都是基于这个操作系统。

在OS / 161中,每个线程都有 2个堆栈 - 一个用于用户/应用程序,一个用于内核程序。

1.在同一程序中使用两个不同堆栈的需求是什么?

假设我们只在应用程序模式下使用堆栈。由于多个线程的内存空间是共享,如果某个其他线程意外覆盖了内核使用的地址,那么内核可能会崩溃,从而导致操作系统非常容易受到攻击。

2.陷阱如何将当前的程序堆栈从用户堆栈更改为内核堆栈?

在OS / 161中,trap用于从应用程序转移到内核。有三种机制可以调用陷阱:系统调用,异常和中断。内核堆栈中的陷阱帧用于保存当前线程上下文。

以下是详细流程(来自lecture note of UWaterloo CS350):

  • 当出现上述机制之一时,硬件会切换CPU 进入特权模式并将控制转移到预定义的位置, 应该找到内核处理程序。

  • 内核处理程序创建一个陷阱框架并使用它来保存 应用程序线程上下文,以便可以执行处理程序代码 在CPU上。

  • 在内核处理程序完成执行之前,它会恢复 在返回之前,来自陷阱帧的应用程序线程上下文 控制应用程序。

3.完成系统调用后,它如何回到用户堆栈?

上述过程也清楚地解释了这个问题。

答案 5 :(得分:0)

它取决于操作系统。拥有它的原因是操作系统的基本安全性。这是通过精心设计操作系统本身。例如,某些处理器具有内核,执行,管理程序和用户堆栈。

雷内

答案 6 :(得分:0)

进程的上下文(psw,寄存器状态,pc ...)保存在进程的PCB中,在内存的内核空间中,而不是在堆栈中。是的,每个用户进程都有一个堆栈,更多,一个堆栈用于用户空间内存中的每个线程。 在内核中,数据结构由内核中函数的多个代码共享。堆栈用于调用过程和局部变量,而不是用于保存上下文。