计算机系统
大作业
题 目 程序人生-Hello’s P2P
专 业 计算机
学 号 120L022309
班 级 2003009
学 生 孙浩翔
指 导 教 师 吴锐
计算机科学与技术学院
2021年5月
本论文旨在研究 hello 在 linux 系统下的整个生命周期。结合 CSAPP 课本, 通过 gcc 等工具进行实验,从而将课本知识落实、融会贯通,通过一个程序深入 挖掘知识点,对于学生对于课程的理解以及知识的升华有很大帮助
关键词:CSAPP;HIT;大作业;Hello 程序;生命周期;
(摘要0分,缺失-1分,根据内容精彩称都酌情加分0-1分)
目 录
6.2 简述壳Shell-bash的作用与处理流程 - 10 -
7.2 Intel逻辑地址到线性地址的变换-段式管理 - 11 -
7.3 Hello的线性地址到物理地址的变换-页式管理 - 11 -
7.4 TLB与四级页表支持下的VA到PA的变换 - 11 -
7.7 hello进程execve时的内存映射 - 11 -
第1章 概述
1.1 Hello简介
- Program:在editor中输入代码之后得到hello.c程序
- Process:hello.c(在Linux中),经过过cpp的预处理、ccl的编译、as的汇编、ld的链接最终成为可执目标程序hello。在 shell 中键入启动命令后,shell 为其 fork,产生子进程。
图1 编译过程
020:
-
- shell为hello进程execve,映射虚拟内存,进入程序入口后程序开始载入物理内存。
- 进入 main 函数执行目标代码,CPU为运行的hello分配时间片执行逻辑 控制流。
- 当程序运行结束后,shell父进程负责回收hello进程,内核删除相关数据 结构。
1.2 环境与工具
硬件环境:AMD Ryzen 5 5600H with Radeon Graphics 3.30 GHz,16G RAM,256G SSD.
软件环境:Ubuntu20.04.4
开发与调试工具:vim,gcc,as,ld,edb,readelf,HexEdit,VSCODE
1.3 中间结果
列出你为编写本论文,生成的中间结果文件的名字,文件的作用等。
文件名 |
功能 |
hello.i |
预处理之后的文本文件 |
hello.s |
编译之后的汇编文件 |
hello.o |
汇编之后可重定位目标执行文件 |
hello.elf |
链接之后的可执行目标文件 |
hello.asm |
测试程序代码 |
hello2.elf |
测试程序 |
hello2.asm |
hello.o的反汇编文件 |
1.4 本章小结
本章主要简单介绍了 hello 的 p2p,020 过程,列出了本次实验信息:环境、中间结果
第2章 预处理
2.1 预处理的概念与作用
预处理步骤是指程序开始运行时,预处理器(cpp,C Pre-Processor,C预处理器)根据以字符#开头的命令,修改原始的C程序的过程。例如,hello.c文件6到8行中的#include 命令会告诉预处理器读取系统头文件stdio.h,unistd.h,stdlib.h 的内容,并把这些内容直接插入到程序文本中。用实际值替换用#define定义的字符串。除此之外,预处理过程还会删除程序中的注释和多余的空白字符。预处理通常得到另一个以.i作为拓展名的C程序
2.2在Ubuntu下预处理的命令
在VSCODE中进行预处理:
图2 预处理结果
2.3 Hello的预处理结果解析
在VScode中打开hello.i,发现hello.i已经拓展到3060行,main方法出现在3047行
图3 main代码
在这之前出现的分别是三个库文件,CPP先删除指令#include <stdio.h>,并到Ubuntu系统的默认的环境变量中寻找 stdio.h,最终打开路径中的stdio.h文件。若stdio.h文件中使用了#define语句,则按照上述流程继续递归地展开,直至所有#define语句都被解释替换掉为止。除此之外,CPP还会进行删除程序中的注释和多余的空白字符等操作,并对一些值进行替换
2.4 本章小结
本章主要介绍了预处理的定义与作用、并结合预处理之后的程序对预处理结果进行了解析。
第3章 编译
3.1 编译的概念与作用
编译程序所要作得工作就是通过词法分析和语法分析,在确认所有的指令都符合语法规则之后,将其翻译成等价的中间代码表示或汇编代码。通过编译过程,编译器将文本文件 hello.i 翻译成汇编语言文件 hello.s,在hello.s中,以文本的形式描述了一条条低级机器语言指令。
编译分为7个部分:
- 词法分析:词法分析的任务是对由字符组成的单词进行处理,从左至右逐个字符地对源程序进行扫描,产生一个个的单词符号,