linux学习之操作系统与程序

预编译:预编译过程主要处理那些源代码中以“#”开始的预编译指令。比如“#include","#define"等
1.将所有的“#define” 删除并且展开所有的宏定义
2.处理所有条件预编译指令。比如:#if #ifdef #endif #else
3.处理#include 预编译指令 将被包涵的文件插入到该预编译指令位置。这个过程是递归的。
4.删除所有的注释“//” 和“/××/”
5.添加行号和文件名
6.保留所有的#pragrma编译器指令

编译:编译就是把预处理完的文件进行一系列词法分析、语法分析、语义分析及优化后生产相应的汇编代码文件
1.代码扫描、
2.语法分析、
3.语义分析、
4.源代码优化、
5.代码生成
6.目标代码优化

汇编:汇编器是将汇编代码转变成机器可执行的指令,每一个汇编语句几乎都对应一条机器指令
此汇编过程比较简单,只需根据汇编指令和机器指令的对照表一一翻译就可以了
链接:
1、重新计算各个目标的地址的过程叫做重定位。
2、汇编语言使用符号来标记位置。符号用来表示一个地址,这个地址可能是一段子程序的起始地址,也可以是一个变量的起始地址。
3、人们将代码按照功能或性质划分,分别形成不同的功能模块,不同的模块之间按层次结构或其他结构来组织。
在c语言中,最小的单位是变量和函数,若干个变量和函数组成一个模块,存放在一个.c的源代码文件里。
然后这些源代码文件按照目录结构来组织。在Java中,每个类是一个基本模块,若干个类模块组成一个包,若干个包组合成一个程序。
4、最常见的C/C++模块之间通信有两种方式,一种是模块间的函数调用,另一种是模块间的变量访问。
函数访问和变量访问都需要知道函数和变量的地址,因此两种方式可归为一种方式,那就是模块间符号的引用。
5、模块间依靠符号来通信类似于拼图,定义符号的模块多出一块区域,引用该符号的模块刚好少了那一块区域,
两者一拼接刚好完美组合。模块间的拼接过程就是链接

链接就是把各个模块之间相互引用的部分都处理好,使得各个模块之间能够正确地衔接。
链接过程主要包括地址和空间分配、符号决议和重定位。


整个程序在操作系统中的个部分情况:

栈:默认栈大小是128K 超过可能导致栈溢出程序崩溃
堆:程序运行时手动申请的内存 理论上是整个系统的虚拟内存大小
BSS:未初始化的全局变量
数据段:已经初始化的全局变量,局部静态变量
代码段:程序执行的代码段

猜你喜欢

转载自www.cnblogs.com/xlsss159/p/10368484.html
今日推荐