【问题标题】:Where are threads stored in memory relative to other process structures during execution on a windows x86 system在 windows x86 系统上执行期间,线程相对于其他进程结构存储在内存中的位置
【发布时间】:2013-02-01 11:13:45
【问题描述】:

所以一个过程是:

--------DOS头/PE头

------可执行代码和静态链接库

------空闲空间?

------一些动态链接的库

------堆的开始

------闲置空间

------栈顶

------栈底

我不确定内核模式堆栈和用户模式堆栈在为进程堆栈分配的虚拟内存中的相对位置 - 此外,当多线程进程产生新线程时,分配给的虚拟内存在哪里是吗?

谢谢!

【问题讨论】:

  • 该图不正确。用户模式中的所有内容都混合在一起。堆可能是多个块,中间有一个堆栈,等等。(看起来该图的灵感来自 16 位 Windows 中进程的内存布局,但我怀疑这就是你要问的。)跨度>

标签: windows multithreading memory-management process stack


【解决方案1】:

在 x86 Windows 上,内核模式模块位于0x80000000 的(虚拟)内存空间中,用户模式进程无法访问,并且所有用户模式模块都位于之前的内存空间中0x80000000.

当产生一个新的(用户模式)线程时,会在用户模式内存空间(用户模式和内核模式均可访问)和内核模式内存空间中为其堆栈分配一个新的内存页面(只能从内核模式访问)。请注意,有些系统线程没有用户模式上下文(因此在任何用户模式进程中都没有分配堆栈)。这些线程纯粹在内核中运行,不在用户模式下运行。

【讨论】:

  • 是的,我知道最高 2GB 用于内核模式...所以它只是为每个线程(无论是内核还是用户)生成一个新页面,并且该线程作为堆栈数据结构存在于该页面中带有某种线程头(以及用于线程切换的 CPU 状态)?
  • @Andrew 哦,线程的元数据(例如线程上下文、优先级等),除了 TEB(线程环境块),完全位于内核中(KTHREAD 和 @ 987654324@ 结构)。它们以链表的形式链接,供调度程序使用。
  • 谢谢!这确实有助于消除我在运行时内存管理的心理模型中的许多困惑
  • 我不明白,所以用户模式堆栈是在进程的堆栈空间中还是只是某个随机位置?
  • @zinking 只需将堆栈(用户模式和内核模式)视为堆栈指针(ESP 寄存器)指向的一块内存。该块在内核空间中分配给内核模式堆栈,在用户空间中分配给用户模式堆栈。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-28
  • 1970-01-01
  • 1970-01-01
  • 2020-10-23
  • 1970-01-01
  • 2021-12-02
  • 2018-12-09
相关资源
最近更新 更多