来源: 它的代码段就在物理内存中了,因为只有代码段才包含指令,这部分要首先映射到物理内存中来,程序的指令用到的数据------这通常表现为程序中的变量常量存在data中,数据段部分被开辟成堆或栈的方式被映射到EXE的进程空间中来(分段机制),形成EXE的编译器不同开辟模式不同,像Delphi的编译器实现的exe进程空间只有堆没有栈这种内存模式,堆和栈是系统级运用内存管理器进行分配内存的动作后(是系统级的作用)形成的特殊内存块,这些内存块被映射到EXE的进程空间,这有点像EXE的DLL模块的映射模式,dll文件被映射到其宿主EXE的进程空间时,不像EXE一样一开始就把代码段实际加载到物理内存中去了而是在EXE实际调用到它时才到实际的物理内存中去(分页机制,只要你的计算机定义了虚拟内存,那么在执行大程序时,,这个分页机制就会频繁用到),跟EXE的DATA段一样属于一开始就映射到EXE进程空间而不实际形成内存的部分,EXE,DLL被加载到内存后,它所占据的内存块就叫模块是静态的,而进程是一个执行体的实例是活动的,线程是一个进程的某个执行单元,所以我们说程序被映射到到其进程空间而不直接说映射到物理内存中,只是需要执行的代码段(注意此段非实模式彼段,后面会谈到)才被进入到物理内存,但不需执行的那部分不需立即加载到内存(就像DATA和DLL)不得不说的是,进程空间并非物理内存,前面一再强调"程序被映射到到其进程空间而不直接说映射到物理内存中",而且更准确地来说,它们二者是xx没有关系的,4GB虚拟地址空间整个儿压根儿就是虚拟的(这个道理就像你玩一个客户端为2G的游戏时,你启动客户端的时候已经把整个客户端的2G资源都加载到4GB空间去了,但是只要这2GB中需要当前调用的那部分资源才进入内存,分段机制开避四GB任务空间,分页机制把需要用到的数据动态加载到进程空间,任务空间就是进程空间,然后通过这些资源在程序中的自动变量表示离开内存),它只是能表示4GB空间的虚拟地址而已,并不是实际的物理内存,仅仅根据32位寄存器能表示那么多的内存来设置的那样一个机制,这种机制成全了将进程空间隔离的好处(所以四GB的说法是进程的一个概念通常说4GB是进程的空间),而不像整个六四KB都可以,Windows的虚拟内存管理器(保护模式下)会负责适当的时候把需要的,映射到进程空间的内存搬到物理内存中去(分页机制),现在来解释"注意此段非实模式彼段,后面会谈到"这句话,在FLAT下,已经没有段segment了,,在Flat模式下就无所谡code段跟data段的了,因为原本实模式CS,DS意义下所指向的段全都在一个4GB大的虚拟地址空间中,实模式下段的意义不存了,是段选择子,FLAT内存模式下,CS,DS根本就不实际用来指向段,即不实际用来指向一段内存(而是存储一个称为段选择符的数据结构),FLAT下说的代码段是指EXE头定义的段,是RAW FILE(RAW指没有分配实际内容的内存)里定义的段而非实模式下CPU段寄存器指向之"段",模拟原本的段取而代之正是EXE头的节的意义,程序员无须知道这些段的实际的物理内存地址而只须知道虚拟地址,(我们知道在32位寄存器,在RAW FILE里才有节section,有了PE文件的头中的这样段定义,当EXE被加载到内存中来,就相当一个跟内存数据段一样的数据结构,虽然平址模式下无所谓代码段数据段,但PE文件的格式间接实现了它,就像XML文件它本身就像一个数据结构一 |