计算机系统大作业:Hello的一生-LMLPHP

计算机系统大作业

题 目 程序人生-Hello’s P2P

专 业 计算机科学与技术

学 号   

班 级 

学 生 江水为竭   

指导教师 刘宏伟   

计算机科学与技术学院

2022年5月

摘 要

HelloWorld是几乎全世界程序员编写的第一个程序,我们缓慢地输入HelloWorld 的几行代码,点击运行,惊喜地看到输出栏中的“Hello,World!”。但是很快我们就不再理会这个程序,去学习其他的语法。然而,在这个简单的hello中,囊括一个程序运行的所有过程,蕴含着无数计算机科学家的思想精华。

本文通过跟踪hello的一生,介绍了hello从代码编辑器到运行最后结束的过程,对计算机底层进行了较深的分析。

关键词:计算机系统;Linux;C语言;

目 录

第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 -

结论 - 14 -

附件 - 15 -

参考文献 - 16 -

第1章 概述

1.1 Hello简介

根据Hello的自白,利用计算机系统的术语,简述Hello的P2P,020的整个过程。

P2P:在文本编辑器中将hello的代码输入,并保存为.c格式的文件,形成hello.c文件。这就是程序(Program),这是hello程序的生命周期的开始。在OS(例如Linux)中,通过交互式应用程序Shell,输入命令实现对hello.c从源文件到目标文件的转化。源程序通过cpp(预处理器)预处理,ccl(编译器)编译,as(汇编器)汇编,最后通过ld(链接器)链接生成hello可执行目标程序并将其保存到磁盘中。

020:在Shell运行该hello程序时,Shell调用fork函数创建子进程,并通过execve函数将hello程序载入并创建运行环境,比如分配虚拟内存,运行完成后,Shell回收该进程,释放内存空间。

1.2 环境与工具

硬件环境:X86-64 Intel i7 10 16 GB RAM 512 GHD Disk

软件环境:Windows 10 VMware 16 Ubuntu 20.04 LTS

开发调试工具:GDB,EDB,Visual Studio Code,Vim,gcc

1.3 中间结果

  1. hello.c:源代码文件。
  2. hello.i:预处理后的文本文件。
  3. hello.s:编译后的汇编文件。
  4. hello.o:汇编后的可重定位文件。
  5. hello:链接后的可执行文件。
  6. disa_hello.s:反汇编hello.o的汇编代码。
  7. disa_hello_2.s:反汇编hello的汇编代码。

1.4 本章小结

本章对hello程序运行的P2P和020过程进行了简单的介绍,列出了此次大作业所使用的相关工具和软硬件环境,最后介绍了文中所用到的文件和作用。

第2章 预处理

2.1 预处理的概念与作用

概念:在预处理时,预处理器需要根据以字符#开头的命令,修改原始的C程序。其实,就是在对源程序做文本替换的操作。比如hello.c第一行的“#include<stdio.h>” 预处理时预处理器会读取stdio.h并把它插入到Hello程序中。

作用:在代码编写的过程是为了方便程序员而设计这些#开头的命令,而为了后续编译器的方便,需要对代码进行替换。

2.2在Ubuntu下预处理的命令

预处理命令:gcc -E hello.c -o hello.i

计算机系统大作业:Hello的一生-LMLPHP
11-15 09:14