您的位置:首页 > 其它

程序的调用机制及目标文件有什么

2017-03-10 15:29 288 查看
1、一个程序的成功执行,需要经过层层的调用才能让计算机相应的硬件执行相应的功能,让cpu执行计算,让内存存储信息等等,软件是依赖与硬件,硬件没有了软件的控制也就没有了灵魂,那么一个应用程序的运行底层到底是怎样调用的呢?它划分了一层层的次序,每层提供相应的接口,通过接口层层调用,从而完成相应的功能,层次如下:



所以当我们的程序运行的时候,我们使用了一些库函数就是api接口的调用,运行库再调用系统留的接口,调用操作系统的想用功能,操作系统中的驱动程序驱动相应的硬件完成我们所需要的任务,而这些层层的调用对用户是透明的,根本感知不到这些细节的调用。

1.1、运行时库:就是程序运行起来之后需要调用的一些函数等信息。

1.2、操作系统及驱动程序:为了使程序的速度越来越快,支持多个任务同时执行,从多道程序到分时系统再到现在的多任务系统,分时系统即使每个进程执行一段时间片,然后就换其他进程执行,每个进程有独立的空间,记录自己进程的执行记录,多任务系统就是有多个进程分别执行一小段时间,然后由操作系统抢占式为每个进程分配cpu,每个进程分为执行、就绪、等待三种状态,就绪进程会根据其优先级的高低为其分配cpu。

1.3、硬件设备:为了满足多任务高速的需求,cpu由单核到多核,达到了真正的进程并行能力,但是其他硬件比如内存就只有一个,于是就有了虚拟地址空间,操作系统为每个进程虚拟了一个同样大小的地址空间,用户就不能直接操作物理空间了,当实际执行的时候,由mmu内存管理单元映射到相应的物理内存,物理内存有限,多个应用程序全部映射时物理内存也会导致不够用的情况,所以有了分段和分页的内存管理模式,虚拟地址空间和物理内存都分成相同大小的段页,一般都是每4k分成一个页,这样当内存不够用的时候,一个程序或者一个进程就不需要全部加载到物理内存中,根据程序的局部性原理,将暂时不需要的部分调出内存到磁盘,就可以更大限度的实现多任务,多核的cpu可是实现真正的并行,即使是一个程序在运行,只有一个进程在运行,但是进程也可以有多个线程用于完成不同的功能提高效率,线程依赖于进程,是主进程的另一个执行顺序,这些线程有自己的线程栈和寄存器,其他的全局变量、数据段、文件描述符、信号、代码段都是共享的,有了线程有了线程安全一说,不同线程对一个共享的数据操作时就有了原子操作,可重入函数等概念。

2、一个源程序到可执行文件的过程:



2.1、预处理阶段:负责将所有除了#program的替换掉,删除注释,添加行号和文件名等信息。

2.2、编译阶段:分为扫描、语法分析、语义分析、源代码优化,目标代码生成、目标代码优化六个过程,扫描负责将代码生成记号表,语法分析负责生成语法树,语义分析负责类型的匹配,为全局的变量分配相对于基地址的偏移量,局部变量相对于活动记录的偏移量,源代码优化负责简单的计算优化,生成目标代码负责根据具体的机器字长,数据类型的长度,寄存器生成目标机器代码,目标代码优化负责高级的优化,例如移位代替乘法等。

2.3、汇编根据对照表生成目标文件。

2.3.1、目标文件中有文件头(包含文件属性,段表所在偏移量,段表字符串表的在段表的下标等)、text段、data段、rodata段、rel.text重定位表、字符串表、段表字符串表、符号表等。

2.4、链接:根据符号将多个文件和静态库链接生成可执行文件。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: