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:未初始化的全局变量
数据段:已经初始化的全局变量,局部静态变量
代码段:程序执行的代码段

原文地址:https://www.cnblogs.com/xlsss159/p/10368484.html

时间: 2024-10-08 22:49:43

linux学习之操作系统与程序的相关文章

Linux学习笔记:rpm程序包管理

以CentOS为例,rpm程序包管理器的相关内容如下: CentOS的程序包管理器:    程序包的命名规则:        源代码包:            software_name-VERSION.tar.gz            VERSION:major.minor.release                major:主版本号,通常代表重大功能改进的版本分支:                minor:次版本号,通常代表在某个版本的分支中的某个功能发生变化:          

Linux学习之:yum程序包管理命令

1.yum简述:   yum(全称 Yellow dog Updater, Modified)是一个前端软件包管理器.基于RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载.安装.              文件服务器:            ftp://. htpp:// .nfs://. file://                yum客户端:        配置文件:            /etc/yu

Linux第二周学习总结——操作系统是如何工作的

LINUX内核分析第一周学习总结——操作系统是如何工作的 黄韧(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 [知识点总结] (一)计算机是如何工作的?(总结)——三个法宝 存储程序计算机工作模型,计算机系统最最基础性的逻辑结构: 函数调用堆栈,高级语言得以运行的基础,只有机器语言和汇编语言的时候堆栈机制对于计算机来说并不那么重要,但有了高级语言及函数,堆栈成为了计算机的基础功能:函

linux学习之进程,线程和程序

                                                                                  程序.进程和线程的概念 1:程序和进程的差别 进程的出现最初是在UNIX下,用于表示多用户,多任务的操作系统环境下,应用程序在内存环境中基本执行单元的概念.进程是UNIX操作系统环境最基本的概念.是系统资源分配的最小单位.UNIX操作系统下的用户管理和资源分配等工作几乎都是操作系统通过对应用程序进程的控制实现的! 当使用c c++ j

linux学习笔记--vim程序编辑器

1,在linux系统中使用文本编辑器来编辑自己的linux参数配置文件是一件很重要的事情,因此系统管理员至少应该要熟悉一种文本编辑器. 2,不同的linux distribution各有不同的附加软件,linux命令行界面下的文本编辑器有Emacs,pico,nano,joe与vim 3,学习vim的重要性 (1)所有的UNIX Like系统都内置vi文本编辑器,其他的文本编辑器不一定存在 (2)很多软件的编辑接口都会主动调用vi (3)vim具有程序编辑的能力,可以主动以字体颜色辨别语法的正确

Linux内核学习--写一个c程序,并在内核中编译,运行

20140506 今天开始学习伟大的开源代表作:Linux内核.之前的工作流于几个简单命令的应用,因着对Android操作系统的情愫,"忍不住"跟随陈利君老师的步伐,开启OS内核之旅.学习路径之一是直接从代码入手,下面来写一个hello.c内核模块. 说明: 这个路径/usr/src/linux-headers-2.6.32-22/include/linux是引用的头文件. 内核模块固定格式:module_init()/ module_exit(),module函数是从头文件中来的.

linux学习之路之使用脚本来复制二进制程序和所需的库文件

首先介绍bash的特殊语法 ${parameter#*word} 其中parameter为变量,word为分隔符,表示从变量最边左字符开始到第一匹配到分隔符(word)之间的字符串都去掉 ${parameter##*word}:表示从变量最左边字符开始到最后一次匹配到该分隔符之间的字符串都去掉 注意:其中变量不要加$符号 当*在分隔符(word)前面时,表示从左开始匹配 当*在分隔符(word)后面时,表示从右开始匹配 ${parameter%word*}:表示从最右边字符开始到第一次匹配到的分

Linux学习汇总——Linux程序管理,终端类型及命令获取帮助方式

本章Blog相关Linux知识点 计算机=硬件+软件 . 冯诺依曼理论,五大部件:CPU -- 运算器.控制器, 存储器,输入设备,输出设备. Shell 环境配置通过环境变量进行配置的 ,环境变量保存对应用程序的配置,在当前进程有效 .若长期有效,需保存到配置文件中. 语言分类: 解释型语言--写的程序在被执行之前,需要一个专门的编译过程,把程序编译成为机器语言的文件:编译型语言:解释性语言在运行程序的时候才翻译,效率比较低.两种方式只是翻译的时间不同 程序与进程的关系: 程序运行--进程启动

Linux学习汇总——Linux程序管理,终端类型及获取命令帮助方式

本章Blog相关Linux知识点 计算机=硬件+软件 . 冯诺依曼理论,五大部件:CPU -- 运算器.控制器, 存储器,输入设备,输出设备. Shell 环境配置通过环境变量进行配置的 ,环境变量保存对应用程序的配置,在当前进程有效 .若长期有效,需保存到配置文件中. 语言分类: 解释型语言--写的程序在被执行之前,需要一个专门的编译过程,把程序编译成为机器语言的文件:编译型语言:解释性语言在运行程序的时候才翻译,效率比较低.两种方式只是翻译的时间不同 程序与进程的关系: 程序运行--进程启动