![](https://i-blog.csdnimg.cn/blog_migrate/8f375f4cedb36c42f6e1d001564c85de.jpeg)
计算机系统
大作业
题 目 程序人生-Hello’s P2P
专 业 计算机科学与技术
学 号 1190201103
班 级 1903006
学 生 王志贤
指 导 教 师 史先俊
计算机科学与技术学院
2021年5月
摘 要
本文主要阐述hello程序在Linux系统的生命周期,探讨hello程序从hello.c经过预处理、编译、汇编、链接生成可执行文件并运行以及如何对hello进行进程管理、存储管理和I/O管理,深入理解虚拟内存、异常信号等相关内容,通过对hello一生周期的探索,更全面的了解计算机系统。
关键词:预处理;编译;汇编;链接;进程管理;虚拟内存;异常信号;shell;I/O
(摘要0分,缺失-1分,根据内容精彩称都酌情加分0-1分)
目 录
第1章 概述............................................................................................................. - 4 -
1.1 Hello简介...................................................................................................... - 4 -
1.2 环境与工具..................................................................................................... - 4 -
1.3 中间结果......................................................................................................... - 4 -
1.4 本章小结......................................................................................................... - 5 -
第2章 预处理......................................................................................................... - 6 -
2.1 预处理的概念与作用..................................................................................... - 6 -
2.2在Ubuntu下预处理的命令.......................................................................... - 6 -
2.3 Hello的预处理结果解析.............................................................................. - 8 -
2.4 本章小结......................................................................................................... - 8 -
第3章 编译............................................................................................................. - 9 -
3.1 编译的概念与作用......................................................................................... - 9 -
3.2 在Ubuntu下编译的命令............................................................................. - 9 -
3.3 Hello的编译结果解析................................................................................ - 10 -
3.4 本章小结....................................................................................................... - 20 -
第4章 汇编........................................................................................................... - 21 -
4.1 汇编的概念与作用....................................................................................... - 21 -
4.2 在Ubuntu下汇编的命令........................................................................... - 21 -
4.3 可重定位目标elf格式............................................................................... - 21 -
4.4 Hello.o的结果解析.................................................................................... - 25 -
4.5 本章小结....................................................................................................... - 26 -
第5章 链接........................................................................................................... - 28 -
5.1 链接的概念与作用....................................................................................... - 28 -
5.2 在Ubuntu下链接的命令........................................................................... - 28 -
5.3 可执行目标文件hello的格式.................................................................. - 28 -
5.4 hello的虚拟地址空间................................................................................ - 33 -
5.5 链接的重定位过程分析............................................................................... - 33 -
5.6 hello的执行流程........................................................................................ - 37 -
5.7 Hello的动态链接分析................................................................................ - 38 -
5.8 本章小结....................................................................................................... - 40 -
第6章 hello进程管理................................................................................... - 41 -
6.1 进程的概念与作用....................................................................................... - 41 -
6.2 简述壳Shell-bash的作用与处理流程..................................................... - 41 -
6.3 Hello的fork进程创建过程..................................................................... - 41 -
6.4 Hello的execve过程................................................................................. - 41 -
6.5 Hello的进程执行........................................................................................ - 42 -
6.6 hello的异常与信号处理............................................................................ - 43 -
6.7本章小结....................................................................................................... - 46 -
第7章 hello的存储管理............................................................................... - 47 -
7.1 hello的存储器地址空间............................................................................ - 47 -
7.2 Intel逻辑地址到线性地址的变换-段式管理............................................ - 47 -
7.3 Hello的线性地址到物理地址的变换-页式管理...................................... - 47 -
7.4 TLB与四级页表支持下的VA到PA的变换............................................. - 48 -
7.5 三级Cache支持下的物理内存访问.......................................................... - 49 -
7.6 hello进程fork时的内存映射.................................................................. - 50 -
7.7 hello进程execve时的内存映射.............................................................. - 50 -
7.8 缺页故障与缺页中断处理........................................................................... - 51 -
7.9动态存储分配管理....................................................................................... - 52 -
7.10本章小结..................................................................................................... - 55 -
第8章 hello的IO管理................................................................................. - 56 -
8.1 Linux的IO设备管理方法.......................................................................... - 56 -
8.2 简述Unix IO接口及其函数....................................................................... - 56 -
8.3 printf的实现分析........................................................................................ - 57 -
8.4 getchar的实现分析.................................................................................... - 58 -
8.5本章小结....................................................................................................... - 59 -
结论......................................................................................................................... - 59 -
附件......................................................................................................................... - 61 -
参考文献................................................................................................................. - 62 -
1.1 Hello简介
P2P:From Program to Process
即从程序到进程.
用高级语言编写得到hello.c经过预处理, 编译, 汇编, 链接得到可执行文件hello, 如下所示.
![](https://i-blog.csdnimg.cn/blog_migrate/8b7f8389c0ac3c7342abdc9688f2b1a4.png)
图1.1.1
在shell中键入./hello\n后, shell程序就知道我们已经结束了命令的输入, 然后shell fork一个与它具有相同上下文的子进程, 在子进程中通过调用execve函数从主存中加载可执行的hello文件, 将hello目标文件中的代码和数据从磁盘复制到主存. 一旦目标文件hello中的代码和数据被加载到主存, 处理器就开始执行hello程序.
020:From Zero-0 to Zero-0
即从0到0.
一开始主存中并没有hello的的代码和数据, 即0. 在调用execve函数后在主存中寻找对应的页表, 因为是第一次调用所以调用缺页程序, 将hello装入主存, 开始执行hello.
在执行完hello的所有代码后, 父进程回收hello进程, 内核删除相关数据结构, hello从主存中消失, 即0.
(1)硬件环境:Intel(R) Core(TM) i5-9300H CPU; 2.40GHz; 16G RAM; 512G SSD
(2)软件环境:Windows10 64位; VMware Workstation 16; Ubuntu 20.04 LTS 64位
(3)使用工具:Visual Studio Code; gcc; objdump; gdb; hexedit
hello.c:源代码
hell