内核堆栈是否与我们(程序员)编写的应用程序使用的用户模式堆栈不同?
你能解释一下这些差异吗?
答案 0 :(得分:6)
从概念上讲,两者都是相同的数据结构:堆栈。
每个线程有两个不同堆栈的原因是因为在用户模式下,不能允许代码搞乱内核内存。切换到内核模式时,只能在内核模式下访问的内存中的不同堆栈用于返回地址等等。
如果用户模式可以访问内核堆栈,它可以修改跳转地址(例如),然后进行系统调用;当内核跳转到先前修改的地址时,您的代码将以内核模式执行!
此外,有关其他进程(用于同步)的安全相关信息/信息可能位于内核堆栈上,因此用户模式也不应具有读取权限。
答案 1 :(得分:0)
典型的现代操作系统的堆栈只是用于存储返回地址和本地数据的内存区域。它在内核和用户模式下都具有相同的结构,但每个线程都有自己的内存区域来存储其堆栈。上下文切换恢复堆栈指针,因此没有线程看到另一个线程的堆栈,即使它们可能能够共享其他内存(如果线程在同一个进程中)。
顺便说一下,线程不必使用堆栈。操作系统会假设它将如何使用,但线程不必遵循它们。