可执行文件的装载过程

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

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

       

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

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

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

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

 

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

 

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

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

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

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

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

 

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

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值