计算机系统
大作业
题 目 程序人生-Hello’s P2P
专 业 计算机科学与技术
学 号 2021113044
班 级 2103101
学 生 方健
指 导 教 师 刘宏伟
计算机科学与技术学院
2022年5月
本文深入的研究了hello的一生,深入研究它是如何从一个源程序hello.c转化为一个可执行文件的,并在shell里面的运行步骤,详细的分析了每一个过程的具体内容,如编译、汇编、链接、重定位等等。
关键词:汇编、重定位、ELF、链接
(摘要0分,缺失-1分,根据内容精彩称都酌情加分0-1分)
目 录
1.1 Hello简介...................................................................................................... - 4 -
2.2在Ubuntu下预处理的命令.......................................................................... - 5 -
3.2 在Ubuntu下编译的命令............................................................................. - 6 -
4.2 在Ubuntu下汇编的命令............................................................................. - 7 -
5.2 在Ubuntu下链接的命令............................................................................. - 8 -
5.3 可执行目标文件hello的格式.................................................................... - 8 -
6.2 简述壳Shell-bash的作用与处理流程..................................................... - 10 -
6.3 Hello的fork进程创建过程..................................................................... - 10 -
6.6 hello的异常与信号处理............................................................................ - 10 -
7.1 hello的存储器地址空间............................................................................ - 11 -
7.2 Intel逻辑地址到线性地址的变换-段式管理............................................ - 11 -
7.3 Hello的线性地址到物理地址的变换-页式管理....................................... - 11 -
7.4 TLB与四级页表支持下的VA到PA的变换............................................. - 11 -
7.5 三级Cache支持下的物理内存访问.......................................................... - 11 -
7.6 hello进程fork时的内存映射.................................................................. - 11 -
7.7 hello进程execve时的内存映射.............................................................. - 11 -
7.8 缺页故障与缺页中断处理........................................................................... - 11 -
8.1 Linux的IO设备管理方法.......................................................................... - 13 -
8.2 简述Unix IO接口及其函数....................................................................... - 13 -
第1章 概述
1.1 Hello简介
P2P: From Program to Process
最开始我们将代码一个个写入hello.c中,它是hello程序的生命的起点,然后调用预处理器cpp将hello.c预处理为hello.i,接下来编译器ccl会将hello.i翻译为hello.s,然后通过汇编器将hello.s翻译为机器指令保存在hello.o中,最后调用链接器形成可执行文件hello,在shell中输入命令./hello,操作系统就会通过fork为其生成子进程,然后通过execve将其加载,不断进行访存、内存申请等操作。最后,在程序结束返回后,由父进程或祖先进程进行回收,程序结束。这样就实现了完整的P2P过程。
020: From Zero-0 to Zero-0
指一个程序从无到拥有自己的内存,地址和时间周期等,然后直到该程序执行结束后,父进程负责将其回收的全部过程。shell在子进程中使用execve执行这个程序时,系统将会把这个程序加载到内存,等待进程结束时,它的父进程将会回收hello,而系统内核将会对内存进行清理,这个过程就叫做020。
1.2 环境与工具
1.2.1 硬件环境:
X64 CPU;2GHz;2G RAM;256GHD Disk
1.2.2 软件环境:
Windows11 64位以上; Vmware 16;Ubuntu 20.04 ;LTS 64位/优麒麟 64位
1.2.3 开发工具:
Visual Studio 2021 64位;CodeBlocks 64位;vi/vim/gedit/gcc;edb
1.3 中间结果
图1-3:中间过程文件
hello.c:源程序
hello.i:经过预处理过后的文件;
hello.s:经过编译生成的汇编文件;
hello.o:汇编生成的可重定位的文件;
hello:通过链接产生的可执行目标文件二进制文件;
elf.txt: 可重定位目标文件hello.o导出的ELF文件;
hello_elf.txt:可执行文件hello导出的ELF文件;
objdump_hello.s:可重定位目标文件hello.o反汇编生成的文件
hello_objdump.s:可执行文件hello反汇编生成的文件
1.4 本章小结
本章简单介绍hello程序的一生,介绍了P2P和020过程,然后又介绍我所使用的硬件环境、软件环境和开发调试工具,最后则简述了过程中间生成的中间文件的名字和作用。
(第1章0.5分)
第2章 预处理
2.1 预处理的概念与作用
预处理概念:
预处理指的是预处理器cpp根据以字符#开头的命令,来修改原始的C程序,最后生成.i文本文件的过程。
预处理作用:
1.将源文件中用#include 形式声明的文件复制到新的程序中;
2..用实际值替换用#define 定义的字符串;
3.根据#if后面的条件决定需要编译的代码;
4.预编译程序可以识别一些特殊符号,预编译程序对于在源程序中出现的这些特殊符号串会用合适值进行替换。
5.预处理还可以帮助程序员节省工作量,提高程序可读性,便于维护。
2.2在Ubuntu下预处理的命令
命令:cpp hello > hello.i
图2-2:Ubuntu下预处理命令展示
2.3 Hello的预处理结果解析
图2-3:hello.i内容展示
解析:可以看见程序被拓展成了3060行,原始hello.c程序出现在3046行之后。在这之前是头文件stdio.h、unistd.h以及stdlib.h依次展开。预处理器将它们全部都展开直接插入程序文本中,所以最后的.i文件特别的长
2.4 本章小结
本章介绍了预处理的概念和作用,以及预处理的方法,然后展示了.i文件的部分内容,分析了里面内容的由来。
(第2章0.5分)
第3章 编译
3.1 编译的概念与作用
编译的概念:
编译程序是通过词法分析和语法分析,在确认所有的指令都符合语法规则后,将其翻译成等价的中间代码或汇编代码来表示。编译器cc1将预处理过的文本文件hello.i 翻译转换成汇编文本文件hello.s。
编译的作用:
1.语法分析:编译程序的语法分析器以单词符号作为输入,分析单词符号串是否形成了符合语法规则的语法单位,方法有自上而下分析法和自下而上分析法两种;
2.中间代码:源程序的一种内部表示,或称之为中间语言。中间代码的作用是使编译程序的结构在逻辑上更为简单明确,特别是使目标代码的优化比较容易实现;
3.代码优化:指对程序进行多种等价变换,使得从变换后的程序出发时能生成更有效的目标代码;
4.目标代码:生成目标代码是编译的最后阶段。目标代码生成器把语法分析或优化后生成的中间代码转换成目标代码。此处目标代码指汇编语言代码,即不同种类的语言提供相同的形式,其指令与处理器的指令集类似,更贴近底层,便于汇编器将其转换为可执行机器语言代码供机器执行。
3.2 在Ubuntu下编译的命令
命令:gcc -S hello.i -o hello.s