大作业
题 目 程序人生-Hello’s P2P
专 业 计算机科学与技术
学 号
班 级
学 生 zjy
指 导 教 师 lhw
计算机科学与技术学院
2022年5月
本文深入的研究了hello.c这一程序从编译成c语言代码开始直到成为可执行程序期间所经历的预处理,编译,汇编,链接,运行以及终止的全过程。通过运用在课堂上学习的计算机系统的相关知识,在ubuntu系统下具体显现出各个过程中所生成的中间文件并进行深入分析来对程序的一生有一个更清晰的认识。
关键词:计算机系统;程序生命周期
目 录
第1章 概述................................................... - 4 -
1.1 Hello简介............................................ - 4 -
1.2 环境与工具........................................... - 4 -
1.3 中间结果............................................... - 5 -
1.4 本章小结............................................... - 5 -
第2章 预处理............................................... - 6 -
2.1 预处理的概念与作用........................... - 6 -
2.2在Ubuntu下预处理的命令................ - 6 -
2.3 Hello的预处理结果解析.................... - 6 -
2.4 本章小结............................................... - 7 -
第3章 编译................................................... - 9 -
3.1 编译的概念与作用............................... - 9 -
3.2 在Ubuntu下编译的命令.................... - 9 -
3.3 Hello的编译结果解析...................... - 10 -
3.4 本章小结............................................. - 12 -
第4章 汇编................................................. - 15 -
4.1 汇编的概念与作用............................. - 15 -
4.2 在Ubuntu下汇编的命令.................. - 15 -
4.3 可重定位目标elf格式...................... - 15 -
4.4 Hello.o的结果解析........................... - 18 -
4.5 本章小结............................................. - 19 -
第5章 链接................................................. - 20 -
5.1 链接的概念与作用............................. - 20 -
5.2 在Ubuntu下链接的命令.................. - 20 -
5.3 可执行目标文件hello的格式......... - 20 -
5.4 hello的虚拟地址空间....................... - 21 -
5.5 链接的重定位过程分析..................... - 25 -
5.6 hello的执行流程............................... - 26 -
5.7 Hello的动态链接分析...................... - 27 -
5.8 本章小结............................................. - 28 -
第6章 hello进程管理.......................... - 29 -
6.1 进程的概念与作用............................. - 29 -
6.2 简述壳Shell-bash的作用与处理流程.. - 29 -
6.3 Hello的fork进程创建过程............ - 29 -
6.4 Hello的execve过程........................ - 30 -
6.5 Hello的进程执行.............................. - 30 -
6.6 hello的异常与信号处理................... - 31 -
6.7本章小结.............................................. - 35 -
结论............................................................... - 39 -
附件............................................................... - 40 -
参考文献....................................................... - 41 -
第1章 概述
1.1 Hello简介
根据Hello的自白,利用计算机系统的术语,简述Hello的P2P,020的整个过程。
1.1.1 P2P
P2P,即“from program to process”。hello程序的生命周期是从一个高级C语言程序开始的,即hello.c的文本文件。为了在系统上运行hello.c程序,每条C语句都必须被其他程序转化为一系列的低级机器语言指令。源程序hello.c经过预处理器(cpp)变为修改了的源程序(文本)hello.i,后通过编译器(cc1)变为汇编程序(文本)hello.s,再通过编译器(as)生成可重定位目标程序(二进制)hello.o,并和共享链接库如printf.o经过链接器(ld)最后生成可执行目标程序(二进制)hello程序。
在shell中输入“./hello”后,shell为hello程序fork出一个新的进程,再调用execve函数从磁盘中加载程序,映射虚拟内存,即mmap。此时,程序从程序program变为进程process,完成了P2P过程。
1.1.2 020
020即“From Zero-0 to Zero-0”。hello产生子进程后,通过execve进行加载,先删除当前虚拟地址已存在的数据结构,为hello的代码、数据、bss等创建区域,然后映射共享区域,设置程序计数器,进入main函数,CPU分配时间片执行逻辑控制流。执行过程中,虚拟内存为进程提供独立的空间;存储结构层层递进,让数据从磁盘传输到CPU中;TLB、分级页表等也为数据的高效访问提供保障;I/O设备通过描述符与接口实现了hello的输入输出。多方面合作配合之下,hello完成执行。然后,shell回收hello进程,删除hello的所有痕迹,释放运行中占用的内存空间。这就完成了020过程。
1.2 环境与工具
硬件环境:X64 CPU;2GHz;2G RAM;256GHD Disk以上;
软件环境:Windows10 64位;Vmware 15;Ubuntu 20.04 LTS 64位;
开发与调试工具:gcc,edb,readelf,objdump,ld,gedit
1.3 中间结果
hello.c:hello的C语言源程序
hello.i:hello.c经过预处理后的文件
hello.s:hello.i的编译文件
hello.o:hello.s的汇编文件
hello_o.elf:hello.o文件的ELF格式
hello.1.s:hello.o文件的反汇编文件
hello.out.s:hello文件的反汇编文件
hello:可执行文件
1.4 本章小结
本章简述了hello从程序到执行,再到结束的整个过程,看似简单,实则繁琐,执行起来需要遵循所有程序运行的统一流程。通过分析hello的一生,我们也大致了解了程序从编译到运行的每一个阶段。
第2章 预处理
2.1 预处理的概念与作用
预处理是C语言程序编译的第一步。预处理会针对C语言代码中的预处理指令(主要是以“#”开头的代码)进行解释、替换等。
C语言的预处理主要包括三方面:宏定义、文件包含、条件编译。
宏定义是以“#define”开头的C语言指令,常用于定义常量、复杂表达式简单化等。例如:“#define a 10”,在预处理时将所有的a变为10。
文件包含是以“#include”开头的C语言代码,预处理器会将对应的文件内容加入到C语言代码中来替换这一行预处理语句,常用于头文件引入。例如:“#include <stdio.h>”则将stdio.h的代码插入到hello中。
条件编译是利用“#ifdef”、“#ifndef”、“#else”和“#endif”等语句实现的,编译器会对预处理语句中的条件进行判断,选择不同的C语言代码进行编译,常用于针对不同机器环境编写代码的编译。
2.2在Ubuntu下预处理的命令
Ubuntu利用gcc对C语言程序进行预处理,使用gcc -E参数,如“gcc -E hello.c -o hello.i”,如图2-1。