ToB企服应用市场:ToB评测及商务社交产业平台

标题: CSAPP大作业程序人生 [打印本页]

作者: 何小豆儿在此    时间: 2024-6-22 13:07
标题: CSAPP大作业程序人生




计算机系统


大作业



题     目  程序人生-Hello’s P2P
专       业  计算机科学与技能      
学     号  2021113451            
班     级  2103102               
学       生  魏嘉浩                
指 导 教 师  刘雄伟                 






计算机科学与技能学院

2022年5月

摘  要

   本文从计算机系统角度上,具体分析了一个程序从被编写到预处置惩罚、编译、汇编、链接、实行,最后被内核删除的过程。研究了各过程的概念作用与本质,给出了各处置惩罚过程的指令,分析了各过程得到文件的不同之处,研究了运行程序时,系统创建与回收进程的过程,从而更深入明白了计算机系统的运作,对进一步研究怎样优化程序性能有指导意义。
关键词:计算机系统,程序处置惩罚过程,进程  









目  录


第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 -
第7章 hello的存储管理................................................................................... - 11 -
7.1 hello的存储器地址空间............................................................................... - 11 -
7.2 Intel逻辑地址到线性地址的变换-段式管理............................................... - 11 -
7.3 Hello的线性地址到物理地址的变换-页式管理.......................................... - 11 -
7.4 TLB与四级页表支持下的VA到PA的变换................................................ - 11 -
7.5 三级Cache支持下的物理内存访问............................................................. - 11 -
7.6 hello进程fork时的内存映射..................................................................... - 11 -
7.7 hello进程execve时的内存映射................................................................. - 11 -
7.8 缺页故障与缺页停止处置惩罚.............................................................................. - 11 -
7.9动态存储分配管理.......................................................................................... - 11 -
7.10本章小结........................................................................................................ - 12 -
第8章 hello的IO管理.................................................................................... - 13 -
8.1 Linux的IO装备管理方法............................................................................. - 13 -
8.2 简述Unix IO接口及其函数.......................................................................... - 13 -
8.3 printf的实现分析........................................................................................... - 13 -
8.4 getchar的实现分析....................................................................................... - 13 -
8.5本章小结.......................................................................................................... - 13 -
结论............................................................................................................................ - 14 -
附件............................................................................................................................ - 15 -
参考文献.................................................................................................................... - 16 -



第1章 概述

1.1 Hello简介

根据Hello的自白,使用计算机系统的术语,简述Hello的P2P,020的整个过程。
P2P(from program to process)是指hello.c文件程序文件酿成运行进程的过程,020(from zero to zero)是指初始时内存中没有程序进程,经过程序的完整加载实行过程最后被内核删除。这两个过程的实现步骤如下:

1.2 环境与工具

列出你为编写本论文,折腾Hello的整个过程中,使用的软硬件环境,以及开发与调试工具。.
硬件:i7-11800H 16GB内存
软件:Windows10专业版 Vmware16pro Ubuntu20.04 gcc gdb objdump

1.3 中间结果

列出你为编写本论文,生成的中间结果文件的名字,文件的作用等。
1.hello.i 预处置惩罚hello.c后得到的c语言文本文件
2.hello.s 编译hello.i后得到的汇编语言文本文件
3.hello.o 汇编hello.s后得到的可重定位目标文件(二进制)
4.hello.elf 用readelf读取hello.o得到ELF格式信息
5.hello.asm 将hello.o反汇编得到的反汇编文件
6.hello 将hello.o链接得到的可实行目标文件
7.hello1.elf 用readelf读取hello可实行文件得到ELF文件
8.hello1.asm 将hello可实行目标文件反汇编得到的反汇编文件
1.4 本章小结

本章对hello程序的一生各阶段的处置惩罚过程举行了概括,介绍了P2P,020,具体实现步骤,介绍了实现所用的软件硬件环境,介绍了过程中生成的中间结果文件及其作用。



第2章 预处置惩罚

2.1 预处置惩罚的概念与作用

概念:预处置惩罚器cpp根据文件开头字符#开头的指令修改原始c程序。
作用:根据预处置惩罚指令修改源代码,从系统头文件包中将头文件源码插入到源程序文件中,替换文件中常量与宏的数据代码,终极生成.i文件


2.2在Ubuntu下预处置惩罚的命令

linux:gcc -E -o hello.i hello.c


2.3 Hello的预处置惩罚结果分析



打开hello.i文件,可以看到在原先的代码中插入了几千行头文件源码,但仍然是c语言文本文件,原来的main函数部分在文件的最后可以看见,预处置惩罚将#后的指令找到系统中的头文件并添加入文件中,删除了不得作用的注释与空行,替换了一些常量值。
2.4 本章小结

本章介绍了源程序处置惩罚成.i文件的概念过程与作用,得到了预处置惩罚是将源程序内容举行补充与修改,本质仍然是c语言程序的结论,了解了预处置惩罚的内涵。

第3章 编译

3.1 编译的概念与作用

概念:在hello.i的基础上,编译器ccl将文件进一步处置惩罚成hello.s文本文件,它的本质是一个汇编语言的文本文件,以可以阅读的文本的形式描述呆板指令。
作用:把c语言源程序翻译成汇编语言程序,并且举行语法分析找到语法错误并报错。为后续转化为呆板语言二进制程序做准备。

3.2 在Ubuntu下编译的命令

gcc -S hello.i -o hello.s

3.3 Hello的编译结果分析

此部分是重点,说明编译器是怎么处置惩罚C语言的各个数据范例以及各类利用的。应分3.3.1~ 3.3.x等按照范例和利用举行分析,只要hello.s中出现的属于大作业PPT中P4给出的参考C数据与利用,都应分析


3.3.1 hello.s 文件总体结构:
.file 源文件
.text 代码段
.section .rodata 只读变量
.align 对齐方式
.string 字符串范例
.global 全局变量
.type 函数范例对象范例
.data 已初始化全局变量静态变量
.size 文件巨细

3.3.2常量:
If语句中,判定输入个数是否等于4。

常数4被保存在代码段.text中,作为指令一部分。

Printf()打印出的字符串

被存储在.rodata中


3.3.3变量:
全局变量:已初始化的全局变量存储在.data节中,未初始化的全局变量存储在.bss节中。
局部变量:局部变量存储在寄存器或栈中,例如 int i变量:

在汇编代码中,其用%rsp -4栈位置存储。


3.3.4 赋值:
对局部变量用mov指令赋值,后缀代表数据巨细
b 1字节 w 2字节 l 4字节 q 8字节

3.3.5 算术利用:
汇编语言有如下算术指令:

如for循环中,运算竣过后,对i加一利用

在汇编语言中,使用addl指令


3.3.6 数组、指针、结构利用:
主函数main中的有指针数组 char *argv[]

数组中,argv[0]为程序名称,argv[1]开始为字符串

可以看到,字符串存储在栈中,必要是读入寄存器中。

3.3.7 控制转移:
汇编语言中的无条件跳转利用用jmp指令加跳转位置,有条件跳转符号为j加对应的后缀,如if语句中的跳转:


是用je指令判定是否跳转,上一步比较利用判定相等时跳转。

3.3.8 函数利用:
汇编语言中函数的通过call指令调用,传入参数使用六个寄存器,按顺序为%rdi,%rsi,%rdx,%rcx,%r8,%r9,更多的寄存器使用栈传入。
如printf函数,先将要打印的参数放入%rdi,%rsi中,再跳转到printf函数处:


如sleep函数,先传入参数atoi(argv[3]),再用call指令调用



3.3.9 关系利用:
关系利用使用cmp指令,后缀表示字节巨细,如比较循环退出条件i>9时使用cmpl指令



3.4 本章小结

本章介绍了编译的概念和过程,编译是将c语言程序翻译成汇编语言程序的过程,汇编语言每一条都对应着一条呆板指令,以hello.c hello.s的具体代码为例,表明了各个数据范例以及各类利用是怎样翻译的以及是怎样运作的,验证了大部分数据与利用在汇编语言中的实现,对c语言翻译成汇编语言有了更加深入的了解。

第4章 汇编

4.1 汇编的概念与作用

概念:汇编是指用汇编器as将编译器翻译得到的汇编语言文本文件.s文件翻译成呆板语言二进制目标文件.o文件。
作用:汇编将汇编语言转化为呆板语言,转化为可重定位目标程序,使程序可以直接让呆板识别,并且可以联合其他文件生成可实行目标文件。
4.2 在Ubuntu下汇编的命令

生成.o文件:gcc -c -o hello.o hello.s

4.3 可重定位目标elf格式

分析hello.o的ELF格式,用readelf等列出其各节的根本信息,特别是重定位项目分析。
生成.elf文件:readelf -a hello.o > hello.elf

ELF结构分析:






命令行输入objdump -d r hello.o > hello.asm 指令输出hello.o的反汇编文件,分析hello.o的反汇编,并与第3章的 hello.s举行对照分析。


       对照分析:

       利用数:汇编语言.s文件中为十进制表示,呆板语言反汇编后可以看出是十六进制表示。
      
      
       分支转移:汇编语言.s文件中跳转指令地址记为.L1,.L2如许的段名称,反汇编得到的.asm文件中跳转地址是明确的具体地址,体现为目标指令地址与当前指令下一条指令地址之差。
      
      
       全局变量访问:汇编语言.s文件中对全局变量的访问使用的是段名称加上(%rip)形式,反汇编得到的.asm文件则使用0x0(%rip)访问,并加上了重定位信息。
      

函数调用:汇编语言.s文件中call后面直接加函数名称,反汇编生成的.asm文件call后面加目标指令地址与当前指令下一条指令地址之差,以及重定位信息。

4.5 4.5本章小结
本章介绍了汇编的概念与作用,将hello.s 文件汇编成hello.o文件,生成ELF格式文件hello.elf文件为例,研究ELF格式文件的具体结构。通过比较反汇编文件hello.asm与汇编文件hello.s的区别,认识了汇编过程对文件做的改变,认识的这些改变为后续程序的链接做的准备。
第5章 链接

5.1 链接的概念与作用

概念:链接是指链接器ld将可重定位目标文件.o文件归并整理成单一的可实行目标文件的过程。
作用:将为并入的常用函数文件与程序文件归并,使分离编译成为可能,方便程序员修改单一函数模块。
5.2 在Ubuntu下链接的命令

ld -o hello -dynamic -linker /lib64/ld-linux-x86-64.so.2 /usr/lib/x86_64-linux-gnu/crt1.o /usr/lib/x86_64-linux-gnu/crti.o hello.o /usr/lib/x86_64-linux-gnu/libc.so /usr/lib/x86_64-linux-gnu/crtn.o

5.3 可实行目标文件hello的格式

分析hello的ELF格式,用readelf等列出其各段的根本信息,包罗各段的起始地址,巨细等信息。
在命令行输入命令 readelf -a hello >hello1.elf 生成可实行目标程序hello的ELF格式文件,保存为hello1.elf。

对hello.elf举行分析,对比hello.elf,得到结果如下:

与hello.elf相比,hello1.elf中的主要信息未改变,范例发生了改变,有了明确的入口点地址,程序头巨细与节头部数量增加了。

      与hello.elf 相比,hello1.elf节头数量增加了,并且重新设置了每个符号的地址。

hello1.elf 比hello.elf多了程序头,它被用来描述系统准备实行程序时必要的段等信息。
4.符号表:

       Hello1.elf符号表中保存了所有重定位时必要引用符号的说明信息。
5.4 hello的虚拟地址空间

使用edb加载hello,检察本进程的虚拟地址空间各段信息,并与5.3对照分析说明。 

通过edb data dump检察加载到虚拟地址的程序代码。
5.5 链接的重定位过程分析

在命令行输入objdump -d -r hello > hello1.asm生成反汇编文件hello1.asm

与hello.asm比较,分析不同之处:




5.6 hello的实行流程

Shell调用利用系统代码运行,加载器通过头部表信息将hello可实行文件的片复制到代码段和数据段,随后跳转到程序入口点_start函数的位置,随后加载库函数,最后运行main函数,处置惩罚main函数的返回值,并且在必要的时候把控制返回给内核。
_init                401000
.plt                 401020
puts@plt            401090
printf@plt           4010a0
getchar@plt         4010b0
atoi@plt            4010c0
exit@plt            4010d0
sleep@plt           4010e0
_start               4010f0
_dl_relocate_static_pie 401120
main               401125
__libc_csu_init       4011c0
__libc_csu_fini       401230
_fini                401238
5.7 Hello的动态链接分析

找到.section节中有.got节

打开edb检察:

GOT是一个数组,每个条目八个字节,GOT[0]指向_libc_start_main,GOT[1]指向重定位表,GOT[2]指向动态链接器ld-linux.so运行地址。对于动态共享链接库中PIC函数,编译器没有办法预测函数的运行地址,以是必要添加重定位记录,等待动态链接器的处置惩罚,为制止运行时修改调用的代码段,链接器采用耽误绑定的计谋。动态链接器使用过程链接表PLT + 全局变量偏移表GOT实现函数的动态链接,GOT中存放目标函数的地址,PLT使用该地址跳转到目标位置。
5.8 本章小结

本章介绍了链接的概念和作用,具体分析了hello.o链接成为可实行目标文件的全过程,介绍了可实行文件hello的ELF格式和各个节的意义,分析了hello的虚拟地址空间、重定位过程、实行流程、动态链接过程,从中清楚明白了可实行文件可供实行的要素。

第6章 hello进程管理

6.1 进程的概念与作用

       概念:进程就是一个正在运行中的程序,每启动一个进程,利用系统就会分配给其肯定的运行资源保证其运行。
       作用:进程使得程序好像可以独占cpu,好像是系统中唯一的程序,这使得计算机同时运行多个独立的程序成为可能。
6.2 简述壳Shell-bash的作用与处置惩罚流程

shell是一个交互型应用级程序,代表用户运行其他程序。是系统的用户界面,提供了用户与内核举行交互利用的一种接口。它接收用户输入的命令并把它送入内核去实行。处置惩罚过程如下:
6.3 Hello的fork进程创建过程

       Shell通过调用fork函数创建一个新的运行的子进程,子进程与父进程pid不同,但得到了父进程代码、数据段、堆、共享库、用户栈相同的一份副本。
6.4 Hello的execve过程

       Execve函数的功能是在当前进程的上下文加载运行一个程序。加载并运行可实行目标文件filename,带有参数列表argv环境变量envp。出现错误时,execve返回到调用程序,execve调用一次不返回。必要删除已存在的用户区域,删除之前进程在用户部分已存在的结构,创建新的代码段、数据、堆和栈段。
6.5 Hello的进程实行

       Hello程序的实行依靠于进程提供给程序一个独立逻辑控制流与一个私有地址空间这两个抽象。
       一个独立的逻辑控制流,使得进程好像独占使用cpu。
       上下文切换使得系统在某个进程发生阻塞时切换到其他进程,使当前进程休眠,使一种特殊的异常控制流。
       时间片是指进程实行它的控制流的及部分的每一个时间段。
       Hello实行过程:进程调用execve函数,进程为hello程序分配新的虚拟地址空间,hello循环输出hello 2021113451 魏嘉浩,调用sleep函数,运行信号处置惩罚程序。运行过程中,cpu不停切换上下文,使运行过程被分成若干时间片,不同进程交替占用cpu,实现进程的调理。


6.6 hello的异常与信号处置惩罚

       异常信号处置惩罚种类:
       停止:来自外部I/O装备 异步返回下一条指令
       陷阱:有意的实行指令的结果 同步返回下一条指令
       终止:不可规复错误 同步不返回
       故障:潜在可规复错误 同步 可能返回到当前指令或终止

       运行:


       2.按 ctrl-c

调用ps命令发现前台没有hello进程

       3.按 ctrl-z

输入ctrl-z挂起进程,进程运行在背景,用ps命令可以看到进程,背景job号为1,调用fg 1将其调出至前台,shell打印命令行命令并继续实行程序,实行竣事回收进程。

输入jobs:

输入pstree

输入kill:



按回车会导致回车被记入,并程序竣过后作为命令输入。
       乱按键盘:

同样,假如乱按一个ps,将在程序竣过后实行ps命令。
6.7本章小结

本章介绍了进程的概念和作用,shell程序的作用于处置惩罚过程,分析了fork创建新进程过程与execve实行hello程序过程,以及不同环境下hello运行时的异常信号处置惩罚。

第7章 hello的存储管理

7.1 hello的存储器地址空间

以下格式自行编排,编辑时删除
联合hello说明逻辑地址、线性地址、虚拟地址、物理地址的概念。
7.2 Intel逻辑地址到线性地址的变换-段式管理

以下格式自行编排,编辑时删除
7.3 Hello的线性地址到物理地址的变换-页式管理

以下格式自行编排,编辑时删除
7.4 TLB与四级页表支持下的VA到PA的变换

以下格式自行编排,编辑时删除
7.5 三级Cache支持下的物理内存访问

以下格式自行编排,编辑时删除
7.6 hello进程fork时的内存映射

以下格式自行编排,编辑时删除
7.7 hello进程execve时的内存映射

以下格式自行编排,编辑时删除
7.8 缺页故障与缺页停止处置惩罚

以下格式自行编排,编辑时删除
7.9动态存储分配管理

以下格式自行编排,编辑时删除
Printf会调用malloc,请简述动态内存管理的根本方法与计谋。
7.10本章小结

以下格式自行编排,编辑时删除
(第7 2分)


第8章 hello的IO管理

8.1 Linux的IO装备管理方法

以下格式自行编排,编辑时删除
装备的模型化:文件
装备管理:unix io接口
8.2 简述Unix IO接口及其函数

以下格式自行编排,编辑时删除
8.3 printf的实现分析

以下格式自行编排,编辑时删除
[转]printf 函数实现的深入分析 - Pianistx - 博客园
从vsprintf生成显示信息,到write系统函数,到陷阱-系统调用 int 0x80或syscall等.
字符显示驱动子程序:从ASCII到字模库到显示vram(存储每一个点的RGB颜色信息)。
显示芯片按照革新频率逐行读取vram,并通过信号线向液晶显示器传输每一个点(RGB分量)。
8.4 getchar的实现分析

以下格式自行编排,编辑时删除
异步异常-键盘停止的处置惩罚:键盘停止处置惩罚子程序。担当按键扫描码转成ascii码,保存到系统的键盘缓冲区。
getchar等调用read系统函数,通过系统调用读取按键ascii码,直到担当到回车键才返回。
8.5本章小结

以下格式自行编排,编辑时删除
(第81分)

结论

用计算机系统的语言,逐条总结hello所履历的过程:
hello.c:文本编写c语言源程序,每个字符都是用ascall编码表示。
hello.i:hello.c经过预处置惩罚阶段,将引用的库睁开归并成为预处置惩罚文本文件hello.i,仍然是C语言形式。
hello.s:hello.i经过编译阶段变为汇编语言文本文件hello.s。
hello.o:hello.s经过汇编阶段变为呆板语言二进制文件可重定位目标文件hello.o。
hello:hello.o可重定位目标文件和动态链接库链接成为呆板语言二进制文件可实行文件hello。
运行:在终端输入./hello 2021113451 魏嘉浩 1。
创建子进程: shell-bash调用fork函数创建一个子进程。
加载:shell 调用 execve,execve 调用启动加载器loader,添加映射虚拟内存,进入程序入口后程序开始载入物理内存,然后进入 main 函数。
上下文切换:hello可与多个进程并行运行。hello调用sleep函数之后进程陷入内核模式,处置惩罚休眠哀求自动释放当前进程,内核举行上下文切换将当前进程的控制权交给其他进程,当sleep函数调用完成时,内核实行上下文切换将控制通报给当前进程。
信号管理:当程序在运行的时候我们输入Ctrl+c,内核会发送SIGINT信号给进程并终止前台作业。当输入Ctrl+z时,内核会发送SIGTSTP信号给进程,并将前台作业停止挂起,输入其他符号时,系统会保存符号,在程序竣事时视为输入这些符号。
终止:当子进程实行完成时,内核安排父进程回收子进程,将子进程的退出状态通报给父进程。内核删除为这个进程创建的所有数据结构。

你对计算机系统的计划与实现的深切感悟,你的创新理念,如新的计划与实现方法:
通过本课程的学习与本次大作业的实践,我深刻感受到计算机系统计划的精妙与合理,一个程序运行涉及到一系列复杂利用,使得人编写的高级语言的程序可以让计算机运行,并且思量到不同程序的并发运行而使用利用系统内查对程序举行上下文切换,为了实现存储器的快速访问计划出多级缓存的存储器结构,使得程序能快速运行。这些计划都是几十年内很多计算机科学家与工程师不停探索总结出来的合理的计算机系统计划。我们以后要在前人的努力下继续努力,将计算机科学这门学科发展得更美满。

附件

1.hello.i 预处置惩罚hello.c后得到的c语言文本文件
2.hello.s 编译hello.i后得到的汇编语言文本文件
3.hello.o 汇编hello.s后得到的可重定位目标文件(二进制)
4.hello.elf 用readelf读取hello.o得到ELF格式信息
5.hello.asm 将hello.o反汇编得到的反汇编文件
6.hello 将hello.o链接得到的可实行目标文件
7.hello1.elf 用readelf读取hello可实行文件得到ELF文件
8.hello1.asm 将hello可实行目标文件反汇编得到的反汇编文件。

参考文献

[1] https://www.cnblogs.com/diaohaiwei/p/5094959.html
[2] 深入明白计算机系统原书第3版-文字版.pdf

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4