程序编译整个的过程

程序编译的过程

应用程序从用户编写的源文件到内存中执行的进程,大致分为了一下几个阶段:首先编译程序将源代码编译成了多个目标模块,其次通过链接程序将编译好的目标模块,以及所需要的一些库函数链接在一起,形成了完整的装入模块,再通过装入程序将这些装入模块装入内存并执行。

 

整个程序编译的过程大致如下:

 

编译:编译的过程就是把用户的源代码编译成若干个目标模块。

链接:

一个完整的程序是由多个装入模块组成的,这些模块都是从地址为0 的单元开始编址,最终链接程序将多个模块链接为装入模块时,链接程序会按照模块的相对地址构成统一的从0号单元开始编址的相对地址。实际上就是按照一定的策略将分散的各个模块链接在一起形成从0号单元开始的整体,也是就将各个离散的逻辑地址链接成完整的逻辑地址。

链接有三种策略:

静态链接:在程序运行之前就把各个模块和一些所需要的库函数链接成一个完整的可执行程序,之后就不在拆开。

装入是动态链接:将应用程序编译后得到的一组目标模块装入内存是采用装入边链接的动态形式。

运行时动态链接:对于某些目标块的链接,是在程序执行的过程需要哪个目标模块,再把对应的目标模块装入内存,也就链接到调用者模块上。这种装入策略便于修改和更新,有利于实现我对模块的共享。

 

装入:当装入程序将可执行的代码装入内存是,程序的逻辑地址与程序所在的内存地址往往是不同的,这是就要地址转换将逻辑地址转换成物理地址。实际上装入的过程就是讲逻辑地址转换成逻辑地址的过程。

装入也分为三种:

1:绝对装入:在编程的时候就知道程序将要驻留在内存的物理地址,编译时程序产生含有物理地址的目标代码,这种方式只适合单道程序设计。

2:可重定位装入(静态重定位)

根据内存当前的情况,将装入模块装入到内存的适当位置,地址变换要一次性完成,UI后就不能再改变。

作业装入内存时必须分配其所需要的全部内存空间,如果没有足够的空间就不能装入该作业,并且它一装入内存之后就不能再移动。

3:动态运行时装入:

允许程序运行时在内存中移动位置,把装入模块装到内存后的地址都是相对地址,在程序执行的时候每当要访问相应的指令或者数据的时候,才将要访问的指令或者数据的相对地址转化成物理地址。这个转化的过程要借助重定位寄存器,重定位寄存器存放的是装入模块在内存中的起始地址,  最终物理地址=重定位寄存器中的地址(装入模块在内存的起始)+逻辑地址。

以上就是用户程序在系统中的执行过程。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值