Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在windows x86系统上执行期间,相对于其他进程结构,线程存储在内存中的位置在哪里_Windows_Multithreading_Memory Management_Process_Stack - Fatal编程技术网

在windows x86系统上执行期间,相对于其他进程结构,线程存储在内存中的位置在哪里

在windows x86系统上执行期间,相对于其他进程结构,线程存储在内存中的位置在哪里,windows,multithreading,memory-management,process,stack,Windows,Multithreading,Memory Management,Process,Stack,因此,一个过程是: ------DOS头/PE头 ------可执行代码和静态链接库 ------空闲空间 ------一些动态链接的库 ------堆的开始 ------空闲空间 ------栈顶 ------栈底 我不确定内核模式堆栈和用户模式堆栈在为进程堆栈分配的虚拟内存中的相对位置——同样,当多线程进程生成新线程时,为其分配的虚拟内存在哪里 谢谢 在x86 Windows上,内核模式模块位于0x8000000的(虚拟)内存空间中,用户模式进程无法访问该内存空间,并且所有用户模式模块位于0

因此,一个过程是:

------DOS头/PE头

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

------空闲空间

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

------堆的开始

------空闲空间

------栈顶

------栈底

我不确定内核模式堆栈和用户模式堆栈在为进程堆栈分配的虚拟内存中的相对位置——同样,当多线程进程生成新线程时,为其分配的虚拟内存在哪里


谢谢

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


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

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


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

是的,我知道最高2GB是在内核模式下运行的……因此它只是为每个线程生成一个新页面,无论是内核还是用户,并且线程作为堆栈数据结构存在于该页面中,带有某种线程头(以及用于线程切换的CPU状态)?@Andrew Oh,除TEB(线程环境块)外,线程的元数据(例如线程上下文、优先级等)完全位于内核中(
KTHREAD
ETHREAD
结构)。它们被链接为一个链接列表,并由调度程序使用。谢谢!这确实帮助我在运行时内存管理的心智模型中消除了很多困惑。我不明白,所以用户模式堆栈在进程的堆栈空间中,或者只是某个随机位置?@zinking简单地将堆栈(用户模式和内核模式)视为堆栈指针(ESP寄存器)指向的内存块。该块在内核空间中分配给内核模式堆栈,在用户空间中分配给用户模式堆栈。是的,我知道最高2GB用于内核模式…因此它只是为每个线程生成一个新页面,无论是内核还是用户,线程作为堆栈数据结构存在于该页面中,并带有某种线程头(以及线程切换的CPU状态)?@Andrew Oh,线程的元数据(例如线程上下文、优先级等)除TEB(线程环境块)外,完全位于内核中(
KTHREAD
ETHREAD
结构)。它们作为链表链接,并由调度程序使用。谢谢!这确实帮助我消除了在运行时内存管理心智模型中的许多困惑。我不明白,所以用户模式堆栈位于进程的堆栈空间中,或者只是某个随机位置?@zinking简单想想堆栈(用户模式和内核模式)作为堆栈指针(ESP寄存器)指向的内存块。该内存块在内核空间中分配给内核模式堆栈,在用户空间中分配给用户模式堆栈。该图不正确。用户模式中的所有内容都混合在一起。堆可能位于多个内存块中,堆栈夹在中间,等等。(看起来该图的灵感来自16位窗口中进程的内存布局,但我怀疑这正是您要问的。)该图不正确。用户模式下的所有内容都混合在一起。堆可能位于多个块中,堆栈卡在中间,等等。(该图的灵感似乎来自16位窗口中进程的内存布局,但我怀疑这正是您要问的。)