报告以一个简单的hello.c文件为基础与示例,跟踪了在计算机系统中一个程序从程序员敲完的.c文件一步步被执行的过程,展现了一个代码项目文件Program如何经过计算机的预处理,编译,汇编,链接最终形成计算机的可执行文件的过程,这一部分体现在第二至第五章,至这一部分我们的hello文件已经做好了被计算机系统执行的准备工作。第六,七,八章进一步展现了操作系统是如何执行这一“准备好的”可执行文件的。具体体现在第六章介绍的操作系统对这一进程的创建,执行,信号处理等进程管理,第七章介绍的进程存储空间管理,第八章介绍的IO管理上。至此,正如大作业题目一样,hello.c程序走完了他的一生,而我们的报告也跟踪记录完毕了hello程序这一生的完整过程。
关键词:hello;计算机系统;预处理;编译;汇编;链接;进程;进程管理;存储空间;IO;
目 录
第1章 概述
1.1 Hello简介
P2P:P2P,即From Program to Process,由项目程序到进程的过程。当我们程序员敲完了一个hello代码并将其保存为.c文件时,Hello作为一个C程序就诞生了。如果我们要执行这个C程序,让Hello实现她的人生价值,就要对其经过一系列的处理使其由项目文件转变为一个进程来等待计算机的执行,这一过程就是P2P 。在P2P过程中,hello.c文件先进行预处理,这一环节处理了文件中的宏,以#include开头为代表的头文件等等,这一环节结束后hello.c就摇身一变变成了hello.i。接下来编译器对hello.i进行编译,将其由方便我们程序员阅读的高级语言编译成更接近计算机逻辑的汇编语言,这一环节结束后hello.i就变成了hello.s,然而汇编语言依然不是计算机语言,难以被计算机理解,所以接下来hello.s需要进行一步汇编过程,这一环节中hello.s将由汇编语言转换为二进制代码的机器语言,这一语言是可以被计算机解读的,生成的文件为hello.o,即可重定位文件。虽然转变为了机器语言,但离可以直接被计算机执行还缺少一步,hello内的一些函数,数据等可能不存在与hello本身的文件当中,最后还需要进行一步链接,将符号进行解析和重定位,生成可执行文件hello。
020:020,即From Zero-0 to Zero-0。从零开始以令结束,即程序从无开始戴胜至完全被系统回收结束不会产生“残留”。这一环节依靠于计算机系统的进程管理设计。在上一步我们最后生成的可执行文件hello等待被系统执行,在我们冲控制台shell输入./hello命令后,系统开始执行这一可执行文件。系统首先会调用Fork函数生成一个只有pid与父进程不同的子进程(父进程此时应为shell),然后调用evecve函数,这一函数会启动加载器loader,将子进程原内容丢弃并新建task_struct及其目录下包括mm_struct等的数据结构,映射私有区域和共享区域,然后设置程序计数器到代码区域的入口点,系统下一步开始执行hello程序。hello程序运行结束后会成为一个zombie进程等待父进程shell回收,父进程将其回收后hello的生命周期彻底结束。
1.2 环境与工具
硬件环境:Intel(R) Core(TM) i7-8750H CPU @ 2.20GHz 2.21 GHz 64位操作系统
系统环境:Ubuntu 18.04 LTS64位,Vmware 11
开发与调试工具:codeblocks,gedit,gdb,objdump,gcc,readelf,HEXEdit
1.3 中间结果
Hello.c:敲完的源程序
Hello.i:经过预处理得到的文本文件
Hello.s:经过编译得到的汇编语言文件
Hello.o:经过汇编得到的二进制可重定向文件
Hello:经过链接得到的最终可执行文件
1.4 本章小结
本章主要从P2P以及020的角度概括了hello从被程序员编写完成正式诞生到转换为可执行文件,作为进程被系统执行到最终执行完毕被系统回收的一生,对接下来的报告整体内容做了简要介绍与概括并列出了所使用的环境与工具,列出了操作过程中得到的中间结果。
(第1章0.5分)