程序人生 Hello’s P2P
计算机系统
大作业
题 目 程序人生-Hello’s P2P
专 业 计算机科学与技术
学 号 2021113637
班 级 2103103
学 生 杨智文
指 导 教 师 刘宏伟
计算机科学与技术学院
2022年5月
从hello的一生可以映射出庞大的计算机系统中的各种知识,跟着传奇的hello,通过各种实验于分析来深入理解计算机系统。
关键词:计算机系统、P2P、020、预处理、编译、汇编、链接、进程
第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的整个过程。
当我们运行时,在shell中利用fork()函数创建子进程,再用execve加载hello程序,这时,hello就由程序(program)变成了一个进程(process),完成了P2P的过程。
1.2 环境与工具
X64 CPU;2GHz;16G RAM;256GHD Disk
Windows 10、VirtualBox6.1、Ubuntu 20.04.4
1.3 中间结果
1.3.4.2 asm.txt hello.o反汇编生成的文本文件
1.3.5.2 asm_2.txt hello返回百年生成的文本文件
1.4 本章小结
第2章 预处理
2.1 预处理的概念与作用
1.可以进行宏替换,用实际的常量或字符串常量来替换它的符号;(#define)
2.处理文件包含,将包含的文件插入到程序文本中;(#include)
3.条件编译,选择符合条件的代码送至编译器编译,实现有选择地执行相关操作(#if,#elif,#else)
2.2在Ubuntu下预处理的命令
2.3 Hello的预处理结果解析
2.4 本章小结
第3章 编译
3.1 编译的概念与作用
编译是指将便于人编写、阅读、维护的高级计算机语言所写作的源代码程序,翻译为计算机能解读、运行的低阶机器语言的程序。即编译器(ccl)将文本文件hello.i翻译成汇编语言程序hello.s的过程。
编译的作用是将高级计算机语言所写作的源代码程序翻译为汇编语言程序,在这个过程中,会进行以词法分析、语法分析、语义分析来生成汇编语言程序,且编译器可能在这个过程中根据编译选项对程序进行一些适当的优化。
编译可以将高级程序设计语言翻译成较为底层的汇编语言,在这个过程中产生的汇编程序里的指令更加贴近于机器指令也更为贴近机器真正执行程序的过程,可以让程序员更好明白程序在机器层面上的底层实现。
3.2 在Ubuntu下编译的命令
3.3 Hello的编译结果解析
如图,根据所学知识文件hello.s中将字符串常量存储在只读段.rodata段
从图中可以看出,打印字符串常量时,编译器将语句翻译为先将字符串存放的地址存入寄存器%rdi,再进行打印
上两图体现出比较操作在汇编代码中的体现,通过CMP和条件跳转指令联合进行实现
上图的也是条件跳转,当循环次数未到时,不断通过跳转重复执行循环体中的内容。
3.4 本章小结
1. 本章主要介绍了编译的的概念以及编译的作用与功能,包括将高级语言指令翻译为汇编语言指令,同时对与编译器的优化解释做了一些解释。
2. 在Ubuntu下将hello.i文件编译生成了hello.s文件。
第4章 汇编
4.1 汇编的概念与作用
由于生成的是二进制文件,且于机器指令相关,所以在不同机器上的表现会有所不同,即可移植性差。
汇编的作用是把汇编语言翻译成机器语言,用二进制码0、1代替汇编语言中的符号,即让它成为机器可以直接识别的程序。最后把这些指令打包成可重定位目标程序的格式,并保存在目标文件.o中。
4.2 在Ubuntu下汇编的命令
4.3 可重定位目标elf格式
ELF文件格式中的节头部表描述了目标文件中不同节的类型、地址、大小、偏移等信息,以及可以对各部分进行的操作权限。
ELF文件格式中的重定位节包含两个部分:.rela.text节与.rela.eh_frame节。
.rela.text节包含.text节中的位置的列表,含有该.text中所需要进行重定位操作的信息,当链接器(ld)将目标文件与其他文件由进行结合时,需要修改这些位置
.rela.eh_frame节包含了对en_frame节的重定位信息。
- 偏移量:需要重定位的信息的字节偏移位置(代码节/数据节)
- 信息:重定位目标在.symtab中的偏移量和重定位类型
- 类型:表示不同的重定位类型
- 符号值:符号的数值
- 符号名称:被重定位时指向的符号
- 加数:偏移
ELF文件格式中的符号表中存放了程序中所定义和引用的的全局变量以及函数的信息。(不包含局部变量)
4.4 Hello.o的结果解析
通过用命令行objdump -d -r hello.o > asm.txt将hello.o的反汇编保存于文件asm.txt中:
图4.4.2文件hello.o生成的反汇编文件asm.txt
通过对比asm.txt即hello.o的反汇编与hello.s可以发现有些许不同:
通过分析可知,hello.s中是用的全局变量所在的那一段的名称加上%rip的值,而重定位目标文件hello.o中用的是0加%rip的值。
可以看到hello.s通过段名进行分支转移,跳转指令后用对应的段的名称表示跳转位置,而在hello.o的反汇编代码中每个段都有明确的地址,跳转指令后用相应的绝对或者相对地址表示跳转位置
可以看到,hello.s调用函数在call指令之后直接引用函数名称,而在hello.o的反汇编代码中,在call指令后加上下一条指令的地址来表示。
4.5 本章小结
2. 通过readelf分析了hello.o的ELF格式,用readelf等列出了其各节的基本信息,包括ELF头、节头部表、重定位节以及符号表的功能与包含的信息。
第5章 链接
5.1 链接的概念与作用
链接(linking)就是将不同部分的代码和数据收集和组合成为一个单一文件的过程,这个文件可被加载或拷贝到内存并执行。
5.2 在Ubuntu下链接的命令
5.3 可执行目标文件hello的格式
通过指令headelf -a hello查看可执行目标文件hello的ELF格式
其中,第一列为节的名称,第二列为节的类型,第三列为节开头地址,第四列为节的偏移量。
5.4 hello的虚拟地址空间
通过readelf查看hello的程序头,可以发现其中的虚拟地址在EDB的Data Dump中都能找到相应的位置,且大小也相对应。
在EDB的symbol窗口,可以查看各段对应的名称以及各段的起始位置与结束的位置,与5.3中所展示出来的elf格式展示出来的相对应。
通过Data Dump通过地址进行查找的结果(给出一个示例)
在命令行中用readelf -a hello查看可执行文件hello的elf中的程序头:
可以通过EDB的Data Dump查看,如下图(给出一个示例):
5.5 链接的重定位过程分析
通过指令objdump -d -r hello > asm_2.txt将可执行文件hello反汇编到文本文件asm_2.txt中
将asm_2.txt与asm.txt进行对比,即将可执行目标文件的反汇编结果与可重定位目标文件的反汇编结果进行比较,可以发现有如下几个方面的区别
从图中可以看出,可执行文件反汇编生成的代码量远大于可重定位目标文件反汇编生成的代码量。
原因:在hello.o的反汇编程序中,只有main函数,没有调用的函数段;经过链接过程后,原来调用的C标准库中的代码都被插入了代码中,并且每个函数都被分配了各自的虚拟地址
从图中可以看出在hello.o的反汇编程序中, main函数中的所有语句前面的地址都是从main函数开始从0开始依次递增的,而不是虚拟地址;经过链接后,每一条语句都被分配了虚拟地址。
1. 符号解析:符号解析解析目标文件定义和引用符号,并将每个符号引用和一个符号定义相关联。
从上述对比图可以看出hello中每条指令都对应了一个虚拟地址,而且对每个函数,全局变量也都它关联到了一个虚拟地址,在函数调用,全局变量的引用,以及跳转等操作时都通过虚拟地址来进行,从而执行这些指令。
5.6 hello的执行流程
使用edb执行hello,说明从加载hello到_start,到call main,以及程序终止的所有过程。请列出其调用与跳转的各个子程序名或程序地址。
5.7 Hello的动态链接分析
分析hello程序的动态链接项目,通过edb调试,分析在dl_init前后,这些项目的内容变化。要截图标识说明。
首先,通过readelf找到.got.plt节在地址为0x404000的地方开始,大小为0x48。因此,结束地址为0x40400047,这两个地址之间部分便是.got.plt的内容。
在EDB中的Data Dump中找到这个地址,观察.got.plt节的,发现在dl_init前后,.got.plt的第8到15个字节发生了变化。
5.8 本章小结
1. 本章主要介绍了本章主要介绍了链接的的概念以及链接的作用
2. 将可重定位目标文件hello.o和若干目标文件外加链接库合并成为一个可执行目标文件hello,即在Ubuntu下将hello.o文件经过链接器(ld)生成了可执行目标文件hello。
3. 分析了hello的ELF格式,并用readelf等列出了其各节的基本信息,包括起始位置、大小等信息。
4. 用edb查看了hello的虚拟地址空间,发现各节的名称都与相应的一段虚拟地址相对应,同时查看了各节的起始位置与大小。
7. 使用edb执行hello,说明了从加载hello到_start,到call main,以及程序终止的所有过程,并列出了其调用与跳转的各个子程序名以及程序地址。
8. 分析了hello程序的动态链接项目,通过edb调试,分析了在dl_init前后,这些.got.plt节的的内容变化,是由动态链接的延迟绑定造成的。
第6章 hello进程管理
6.1 进程的概念与作用
6.2 简述壳Shell-bash的作用与处理流程
shell应用程序提供了一个界面,用户通过访问这个界面访问操作系统内核的服务。
每次用户通过向shell输人一个可执行目标文件的名字,运行程序时, shell就会创建个新的进程,然后在这个新进程的上下文中运行这个可执行目标文件。
5. shell 应该接受键盘输入信号,并对这些信号进行相应处理。
6.3 Hello的fork进程创建过程
6.4 Hello的execve过程
6.5 Hello的进程执行
结合进程上下文信息、进程时间片,阐述进程调度的过程,用户态与核心态转换等等。
控制流:计算从加电开始,到断点位置,程序计数器的一系列PC的值的序列叫做控制流。
时间片:一个进程执行它的控制流的一部分的每一时间段叫做时间片。
上下文:上下文就是内核重新启动一个被抢占的进程所需要的状态,它由通用寄存器、浮点寄存器、程序计数器、用户栈、状态寄存器、内核栈和各种内核数据结构等对象的值构成。
6.6 hello的异常与信号处理
程序正常运行时,会循环9次输出hello 2021113637 杨智文,循环结束后会调用函数getchar(),键入回车后程序结束
在程序运行的过程中不断乱按,在程序结束后仍会通过getchar()函数让程序停止,键入回车后程序结束,之前乱按的信息都在输入缓冲区中和程序一起消失了。
如图所示,在程序运行过程中键入了四个回车,程序循环结束后,getchar()函数只会读取走第一个回车,所以后面的三个回车会在终端被当作时输入
可以看到,在程序运行过程中,先输入一个回车后再输入ls+回车,再程序结束后,ls就作为终端中的输入。
可以看到,再程序运行过程中键入Ctrl+Z会让程序产生中断异常,发送信号SIGSTP,这时hello的父进程shell会接收到信号SIGSTP并运行信号处理程序让hello进程被挂起,并打印相关信息。
Ctrl-z之后,在shell命令行中输入ps,打印出各进程的pid,再其中可以找到被挂起的hello。
Ctrl-z之后,在shell命令行中输入jobs,打印出被挂起的hello的相关信息。
Ctrl-z之后,在shell命令行中输入fg,被挂起在后台的hello进程被重新调到前台执行,打印出剩余部分,按回车后终止程序,由于之前在程序输出1个信息时停止,所以继续后会输出8个信息。
6.7本章小结
1. 本章主要介绍了进程的概念与作用。进程就是一个执行中程序的实例,CPU为每个进程提供独立的逻辑控制流,和一个私有的地址空间,从而将CPU科学有效地划分成多个部分并行地运行多个进程。
5.在处理中通过结合两种方式得到了新奇的结果并分析了其中原因
结论
6.在进程中,hello进程可以被各种信号影响,并且hello程序在运行过程中涉及到并行与进程的上下文切换。
在hello的异常与信号处理中,通过结合在运行过程中不断乱按和按回车产生了新奇的结果,可以在程序运行过程中,直接输入终端的下一个命令甚至几个命令。
参考文献
[2] 理解链接之链接的基本概念 - 简书 (jianshu.com)
程序人生 Hello’s P2P相关推荐
- 哈工大计算机系统2022大作业:程序人生-Hello‘s P2P
计算机系统 大作业 题 目 程序人生-Hello's P2P 专 业 计算机类 学 号 120L022115 班 级 2003007 学 生 王炳轩 指 导 ...
- 哈工大计算机系统大作业:程序人生-Hello’s P2P
题 目 程序人生-Hello's P2P 专 业 计算学部 学 号 120L022028 班 级 2003007 学 生 杨建中 指 导 教 师 吴锐 计算机科 ...
- 2022计算机系统大作业——程序人生-Hello’s P2P
计算机系统 大作业 题 目 程序人生-Hello's P2P 专 业 计算机 学 号 120L021716 班 级 2003005 学 生 蔡泽栋 指 导 ...
- 哈工大计算机系统大作业——程序人生-Hello’s P2P
计算机系统 大作业 题 目程序人生-Hello's P2P 专 业 计算机科学与技术 学 号120L022401 班 级 200300 ...
- 哈工大CSAPP大作业:程序人生-Hello’s P2P
计算机系统 大作业 题 目 程序人生-Hello's P2P 专 业 计算学部 学 号 120L021818 班 级 2003006 学 生 秦 ...
- HIT CS:APP 计算机系统大作业 《程序人生-Hello’s P2P》
HIT CS:APP 计算机系统大作业 程序人生-Hello's P2P Hello的自白 我是Hello,我是每一个程序猿¤的初恋(羞羞--) l却在短短几分钟后惨遭每个菜鸟的无情抛弃(呜呜--), ...
- 【计算机系统】ICS大作业论文-程序人生-Hello’s P2P
计算机系统 大作业 题 目 程序人生-Hello's P2P 专 业 计算机科学与技术专业 学 号 200111026 班 级 20级计算机9班 学 生 陈弘毅 指 导 教 师 郑贵滨 计算机科学与技 ...
- 程序人生-hello`s P2P
计算机系统 大作业 题 目 程序人生-Hello's P2P 专 业 计算机系 学 号 1170300921 班 级 1703009 学 生 *** 指 导 教 师 史先俊 计算机科学与技术学院 20 ...
- HIT-ICS大作业-程序人生Hello‘s P2P
计算机系统 大作业 题 目 程序人生-Hello's P2P 专 业 计算机类 学 号 120L021311 班 级 2003011 学 生 郭俊诚 指 导 ...
- HIT-ICS2022大作业(程序人生-Hello’s P2P)
计算机系统 大作业 题 目 程序人生-Hello's P2P 专 业 计算机科学与技术 学 号 班 级 学 生 指 导 教 师 计算机科学与技术学院 202 ...
最新文章
- 如何理解“跳出率”,它对SEO有什么影响?
- ubuntu 18.04 配置notebook远程连接的坑
- Android Studio:依赖异常问题解决
- GIS空间数据结构 - 矢量和栅格
- Ubuntu下在线安装mysql
- oracle用户登录的认证方式
- H3C 常用接口和线缆
- leetcode 257. 二叉树的所有路径(Java版)
- unity2D技术学习与整理
- C++——容器小整理
- Maven的-pl -am -amd参数学习 -am 踩过的坑
- 关于HRESULT判断的宏(SUCCEEDED/FAILED)
- 三星固态硬盘linux驱动,三星固态硬盘驱动NVMe Driver
- 【JZOJ A组】时空幻境
- 山东大学计算机组成课设,山东大学计算机组成原理课程设计实验报告.pdf
- 前端记住密码功能实现
- 360视频:二十面体投影ISP
- 关于LM2596S-5.0电流声问题——输出电容选择
- cla作用matlab,健身搞肌运动补剂小讲堂:共轭亚油酸CLA功效解析
- AI配对真能解决“单身公害”?
热门文章
- 童星养成系统的文推荐_几部养成系列的现言宠文推荐啦,都是不错的大叔文,十分治愈哦~...
- 对标yaahp的python工具包
- 【附源码】计算机毕业设计java校园志愿者服务系统设计与实现
- ethtool用法 linux_Linux命令--ethtool
- 计算机在智能交通系统中应用,计算机技术在智能交通系统中的应用.doc
- 避免2.4GHz ISM频段各种类型无线设备干扰的技术 1
- 批量替换excel中的换行
- mysql 多租户_数据层的多租户浅谈
- X-VLM: Multi-Grained Vision Language Pre-Training
- 网页设计之栅格系统及应用