题 目 程序人生-Hello’s P2P
专 业 计算学部
学 号 120L020925
班 级 2003001
学 生 林泽天
指 导 教 师 史先俊
计算机科学与技术学院
2022年5月
摘 要
本文通过对hello.c文件的逐步分析,包括预处理,编译,汇编,链接等等操作,来追踪从.c文件变为可执行程序文件的过程,并运行此文件,观察在进程中的相关状态,分析其对于异常和信号的处理,最后结束可执行文件,结束程序hello.c的一生。通过研究程序的生命周期,并结合深入计算机系统这本书来深入了解计算机的内部结构。
关键词:hello程序从预处理到可执行的过程,预处理,编译,汇编,链接,进程,异常,信号,IO接口,计算机系统;
(摘要0分,缺失-1分,根据内容精彩称都酌情加分0-1分)
目 录
第1章 概述 - 4 -
1.1 Hello简介 - 4 -
1.2 环境与工具 - 4 -
1.3 中间结果 - 4 -
1.4 本章小结 - 4 -
第2章 预处理 - 5 -
2.1 预处理的概念与作用 - 5 -
2.2在Ubuntu下预处理的命令 - 5 -
2.3 Hello的预处理结果解析 - 5 -
2.4 本章小结 - 5 -
第3章 编译 - 6 -
3.1 编译的概念与作用 - 6 -
3.2 在Ubuntu下编译的命令 - 6 -
3.3 Hello的编译结果解析 - 6 -
3.4 本章小结 - 6 -
第4章 汇编 - 7 -
4.1 汇编的概念与作用 - 7 -
4.2 在Ubuntu下汇编的命令 - 7 -
4.3 可重定位目标elf格式 - 7 -
4.4 Hello.o的结果解析 - 7 -
4.5 本章小结 - 7 -
第5章 链接 - 8 -
5.1 链接的概念与作用 - 8 -
5.2 在Ubuntu下链接的命令 - 8 -
5.3 可执行目标文件hello的格式 - 8 -
5.4 hello的虚拟地址空间 - 8 -
5.5 链接的重定位过程分析 - 8 -
5.6 hello的执行流程 - 8 -
5.7 Hello的动态链接分析 - 8 -
5.8 本章小结 - 9 -
第6章 hello进程管理 - 10 -
6.1 进程的概念与作用 - 10 -
6.2 简述壳Shell-bash的作用与处理流程 - 10 -
6.3 Hello的fork进程创建过程 - 10 -
6.4 Hello的execve过程 - 10 -
6.5 Hello的进程执行 - 10 -
6.6 hello的异常与信号处理 - 10 -
6.7本章小结 - 10 -
第7章 hello的存储管理 - 11 -
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 -
7.9动态存储分配管理 - 11 -
7.10本章小结 - 12 -
第8章 hello的IO管理 - 13 -
8.1 Linux的IO设备管理方法 - 13 -
8.2 简述Unix IO接口及其函数 - 13 -
8.3 printf的实现分析 - 13 -
8.4 getchar的实现分析 - 13 -
8.5本章小结 - 13 -
结论 - 14 -
附件 - 15 -
参考文献 - 16 -
P2P:是指从program到process的过程。大概包括从hello.c通过cpp的预处理变成hello.i,再由gcc编译为hello.s文件,再通过as指令汇编成可重定位目标文件hello.o,最后通过ld指令的链接生成可执行文件。由shell启动,并fork出子进程,再由execve加载出进程,这就是P2P的整个过程。
020:是指从ZERO-0到ZERO-0的过程。在加载这个进程的同时,操作系统会将它映射到虚拟内存,在虚拟地址处生成hello.c的数据结构,然后在开始执行程序时进入物理内存,从main函数开始执行。执行后,shell会结束并回收hello进程,再由内核清除相关数据。至此,hello.c的一生就结束了,整个020的过程也就完成了。
软件环境:Windows11 64位;Vmware 15;Ubuntu 20.04.4 LTS 64位
硬件环境:Inter(R) Core(TM) i7-10875HCPU@2.30GHz,16GRAM。
开发与调试工具:codeblocks,edb,gcc。
hello.i文件 |
预处理之后的文件 |
hello.s文件 |
编译之后的文件 |
hello.o文件 |
汇编后的可重定位目标文件 |
hello文件 |
链接后生成的可执行文件 |
hello.elf文件 |
hello的ELF文件 |
helloboy.elf文件 |
hello.o的ELF文件 |
本章介绍了实验整体的大概流程以及相应的系统配置信息,并给出了所有的中间过程文件。
概念:预处理一般是指在程序源代码被翻译为目标代码的过程中,生成二进制代码之前的过程。
作用:
(1)预处理一般会根据#include开头的命令,修改c程序,并将所有引用的库合并成一个文本文件,就会得到hello.i文件。
(2)若#后面跟有define指令,或是含有if,ifn的指令,预处理器cpp就会分析究竟要怎样执行,然后会将define后的字符串用实际值替换。
(3)预处理指令一般被用来使源代码在不同的执行环境中被方便的修改或者编译。