进程的建立需要三步:
1:开辟对应的虚拟内存空间。
2:加载可执行文件头,并且建立虚拟空间和可执行文件之间的映射。
3:将cpu的指令寄存器设置成可执行文件的入口地址,启动运行。
(一)开辟对应的虚拟内存空间:
逻辑上我们的操作系统会为每一个进程分配默认大小的虚拟内存空间大小,例如32位就4G。64位更大。但是4G中有1G为操作系统内核暂用。那么你会不会认为那么就同时只能运行一个进程了。明显和我们理解的操作系统多任务是不相符的。其实,它并不是把可执行文件全部加载到内存中,它只是暂时先加载一部分,然后当执行到对应地址段,发现没有(就是所谓的缺页),会从硬盘上加载内存中,如果内存现在已经不足,会有对应的淘汰机制。细节在下面的第二部分说。
(二)加载可执行文件头,并且建立虚拟空间和可执行文件的映射。
对于这里来说,其实只是暂时先把可执行文件头加载到虚拟内存空间中,并且做好可执行文件中各段和虚拟内存之间的映射关系。当程序启动运行时,cpu读到虚拟内存地址。通过mmu中的页表转换,没有在真实物理内存中找到对应的地址。所以会命令操作系统从硬盘中需要的程序段拷贝到内存中。并且做好真实的物理内存和虚拟内存地址之间的映射。
(三)将cpu的指令寄存器设置可执行文件的入口地址,启动运行。
目前为止我才知道一个进程在虚拟内存中的几部分,一个分为,代码指令部分,数据部分,堆部分,栈部分,内核调用部分。
程序运行需要对应环境设置和环境变量。这个在程序装置的时候就已经把环境变量和程序需要运行的参数加载到虚拟内存中栈中了。所以在程序的入口函数main()argc 和argv参数中可以重新读到。
网友评论