【发布时间】:2014-09-30 09:42:02
【问题描述】:
Windows Internals, 6th Edition 来自 Microsoft Press 表示,在 Windows NT 中,每个线程都有 2 堆栈:一个在用户模式下运行时使用,一个在内核中使用模式。
为什么会这样?似乎用户模式堆栈也可以在系统调用中使用。这种设计有什么优势吗?
【问题讨论】:
-
因为如果不这样做,线程几乎会立即崩溃。内核模式代码使用非常不同的虚拟内存映射。让内核代码访问进行调用的进程的用户地址空间需要显式映射它。您创建的每个线程都会自动获得一个 24 KB 的内核模式堆栈,以便它可以进行系统调用。
-
@HansPassant,所以基本上,内核不可能使用推送到用户堆栈上的返回地址“返回”到用户代码中,因为它是进程虚拟内存空间中的地址,不是内核的内存空间?这是一个答案,你应该这样发布。
-
@HansPassant,更准确地说,一个线程在 64 位操作系统上获得 24KB 堆栈,在 32 位操作系统上获得 12KB。
标签: multithreading stack kernel windows-nt