可执行文件的装载过程

        应用程序,其实就是一系列的指令,以及指令所操作的数据。为了执行这些指令,并通过指令操作数据,需要将应用程序文件加载到内存中。然后从程序的入口开始逐条执行程序文件中的指令。

        在介绍应用程序的装载过程之前,需要先了解可执行文件映射到内存后的布局情况。应用程序的内存通常是按如下方式分布:

       

        每个应用程序的逻辑内存在32位机器上共有4GB,上图只标出了进程的用户态内存布局,在Linux系统下为0x000000000~0xBFFFFFFF(3GB)Windows0x00000000~0x7FFFFFFFF(2GB)

        在上图中,“exec从程序文件中读到”的部分即操作系统从可执行文件加载到内存的内容。

               正文部分:代码段(.code.text)、只读数据段.rodata(代码中通过const修饰的全局变量)

                初始化的数据:数据段(.data)。

 

        代码段也就是编译时生成的机器指令,应用程序运行时通过执行代码段的指令,操作数据(包括.data.rodata.bss即未初始化的数据、以及堆和栈中的数据)。

 

        操作系统在装载应用程序时,主要分为三步:

        1.      为进程分配虚拟内存(逻辑内存)

        2.      建立虚拟内存与可执行文件的映射

                4K大小为单位,将虚拟内存地址与可执行文件的偏移建立映射关系。

        3.      CPU的指令寄存器设置为应用程序的入口地址,启动运行

 

        在完成3步后,程序开始执行。启动运行时将访问虚拟内存的地址。但由于虚拟内存还没有映射到物理内存,因此会触发“页中断”。在发生页中断时,操作系统为虚拟内存分配物理内存,映射到此虚拟内存,然后根据此地址以及虚拟内存与可执行文件的映射关系,查找到可执行文件的偏移,然后将文件的内容加载到物理内存中。

 

你可能感兴趣的:(操作系统,windows,linux)