【问题标题】:Why do Windows NT threads have separate user mode/kernel mode stacks?为什么 Windows NT 线程有单独的用户模式/内核模式堆栈?
【发布时间】: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


【解决方案1】:

主要原因是内核模式不能信任用户模式。如果内核使用用户模式堆栈,则其他一些用户模式线程可以观察该堆栈上的值并随意修改它们。恶意软件获得对系统的完全控制是微不足道的。

【讨论】:

  • 这很有意义。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-05
  • 2020-07-18
  • 2022-12-10
  • 1970-01-01
  • 2012-03-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多