锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

HIT-ICS2022大作业报告

时间:2024-01-02 11:07:03 q24j6a连接器

[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-tQQWzmrI-1652875163981)(media/image1.jpeg)]

计算机系统

大作业

题 目 [程序人生-Hello’s P2P]{.underline}

专 业

学 号

班 级

学 生 [ 田阔 ]{.underline}

指 导 教 师 [ 刘宏伟 ]{.underline}

计算机科学与技术学院

2021年5月

摘 要

摘要是论文内容的高度总结,应具有独立性和自含性,即不阅读论文全文即可获得必要的信息。摘要应包括本论文的目的、主要内容、方法、结果及其理论和实际意义。摘要不得使用公式、结构、图表和未知公共符号和术语,不得标记引用文献编号,避免将摘要写入目录内容介绍。

摘要:本文将介绍一个hello.c源文件从执行开始到执行完成的过程,分析编译器在预处理、编译、汇编、链接的每一步,分析系统在相应时间进行的一系列响应和操作。通过这个过程,我们可以看到整个计算机系统的运行机制。

关键字:预处理、汇编、链接、系统、过程、存储;

(摘要0分,缺失-1分,根据精彩内容加分0-1分)

**
**

目 录

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

[]{#_Toc225579643
.anchor}P2P:首先,用gcc将hello.c预处理源文件hello.i,编译后得到hello.s,汇编得到hello.o,再与其他.o通过这一系列步骤,我们可以获得可执行的目标文件。

020:执行时,可执行文件可以加载到内存中。我们需要执行这个可执行程序shell输入可执行文件的名称,shell将fork通过一个新的过程标文件execve内存装载。接下来,Cpu会从.text一个接一个地执行指令。执行完成后,shell或者父亲的过程会回收这个过程,回收这个过程后shell这个过程中不会有任何信息。

1.2 环境与工具

列出你写这篇论文的想法Hello在整个过程中,软硬件环境,以及开发和调试工具。

CPU:Intel? Core? i7-10750H CPU @ 2.60GHz 2.59 GHz

内存:20G

磁盘:1T

软件环境:Ubuntu20.04 Ubuntu

工具:gcc,edb,gdb,objdump,Visual Studio

1.3 中间结果

Hello.c 源文件

Hello.i 对hello.i预处理后的文件

Hello.s 对hello.i 编译后获得的汇编文件

Hello.o 对hello.s汇编后的可重定位文件

Hello 链接所有文件后获得的可执行文件

Asm.txt 反汇编hello内容的txt文件

Elf.txt Readelf读取hello.o得到的文件

1.4 本章小结

本章介绍了P2P,020介绍了本次大作业的软硬件环境和中间结果。

(第1章0.5分)

第2章 预处理

2.1 预处理的概念与作用

预处理器cpp根据字符#开头的命令(宏定义、条件编译),修改原始C程序,将引用的所有库合并成完整的文本文件。

作用:

1.将源程序开头声明的头文件插入hello.c中,得到hello.i

2.处理宏定义的内容。

[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-jSo9h3hQ-1652875163983)(media/image2.png)]

图 1

2.2在Ubuntu下一个预处理命令

Gcc -E -o hello.i hello.c

[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-BOgqd5Ct-1652875163984)(media/image3.png)]

图 2

-o然后输出文件名

2.3 Hello的预处理结果解析

[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-TYjz8ecU-1652875163984)(media/image4.png)]

[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-STfUAiT4-1652875163985)(media/image5.png)]

图 3

打开hello.i可以看出,程序变成了3060行,最初出现在三个头的开头件和注释都已经消失。已经被其他文本替代。所有头文件的代码都被写入了hello.i当中,这样hello.i才是可以独立运行的源代码。此外,编译器还将所有的注释删除了。

2.4 本章小结

本章对预处理得到的文件进行初步分析。通过预处理,将C文件变成了可以独立执行的文件,并删除注释。

(第2章0.5分)

第3章 编译

3.1 编译的概念与作用

概念:

利用编译程序从源语言编写的源程序产生目标程序的过程

用编译程序生成目标程序的动作。
作用:将整理好的源代码转化为汇编语言。

以下格式自行编排,编辑时删除

注意:这儿的编译是指从 .i 到 .s 即预处理后的文件到生成汇编语言程序

3.2 在Ubuntu下编译的命令

Gcc -S -o hello.s hello.i

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DZYu8CYl-1652875163985)(media/image6.png)]

图 4

汇编语言如下图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mvAsLNTL-1652875163985)(media/image7.png)]

图 5

3.3 Hello的编译结果解析

3.3.1对变量的处理:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DYD9pAtQ-1652875163986)(media/image8.png)]

图 6

我们看到文件从hello.i的3060行变成了80行。

.c文件中定义了两句printf,其中对应了两个字符串。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8PZ2RnUh-1652875163986)(media/image9.png)]

图 7

我们可以看到在.s文件的开头定义了LC0和LC1字段,LC0字段如下图所示对应的应为第一句printf中的"用法:
Hello 学号 姓名
秒数!\n",因为中文字段不能直接显示,故我们仅能看到中文字段对应的数字组合。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-veIovmiq-1652875163986)(media/image10.png)]

图 8

LC1字段如下图所示,对应的应为main函数的定义信息:

  1. 有string “Hello %s %s\n”

  2. 这是一个全局变量

  3. 它的类型是@function

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4Le1Spkn-1652875163987)(media/image11.png)]

图 9

之后进入主函数。主函数中有局部变量i和argc,和argv[],编译器会将局部变量存储在寄存器或栈中。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ww6RJUfy-1652875163987)(media/image12.png)]

图 10

hello.s如下:

Argc:对应寄存器为 %edi 位于-20(%rbp)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P6CxNMtu-1652875163987)(media/image13.png)]

图 11

i:位于-4(%rbp)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FNxRes9X-1652875163988)(media/image14.png)]

图 12

Argv[]:对应的寄存器为%rsi,里面储存了Argv的地址,将其压入栈内的
-32(%rbp)处。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IYvyMI0K-1652875163988)(media/image15.png)]

图 13

对于程序中的立即数,会直接写道汇编程序中。

3.3.2 赋值

对于变量的赋值:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6qtLrnR7-1652875163988)(media/image14.png)]

图 14

这里对i进行了初始化,将其赋值为0.

3.3.3 算数操作

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AmCno1qb-1652875163989)(media/image16.png)]

图 15

这里addl对i的值进行了加1操作。

3.3.4 关系运算的处理

对关系的判断出现在if语句和循环中,

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MiiSDOgO-1652875163989)(media/image17.png)]

图 16

这里判断了argc参数是否为4,如果是就跳转,对应了.c文件中的if语句:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1jyUJ2H4-1652875163990)(media/image18.png)]

图 17

这里比较了7和i的值,属于for循环的判断,判断for循环是否结束。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QrwjFio3-1652875163990)(media/image19.png)]

图 18

3.3.5对数组(指针)的操作

程序中数组是main参数的argv,存放char指针。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hUtC8STq-1652875163991)(media/image20.png)]

图 19

图中所示两个rdx,rax分别取出数组的两个参数。

3.3.6 对控制转移的处理

Hello.c中有两处控制转移:

第一处是对if条件的判断,如果等于4就跳转到.L2

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HrhlNNne-1652875163991)(media/image17.png)]

图 20

第二处判断循环是否结束,如果循环变量i小于等于7,就跳转到.L4处。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nYcuEoV6-1652875163992)(media/image19.png)]

图 21

3.3.7 对函数的处理

参数储存顺序:

%rdi, %rsi, %rdx, %rcx, %r8, %r9,其余参数倒序压入栈中。

1.Main函数:

1)外部向main传递argc和argv,分别用%rdi和%rsi存储,main结束时return
0,会将%eax设置为0。

2)对内存进行操作,%rbp,%rsp记录栈信息。Main结束时,调用leave,恢复占空间,ret返回。

2. printf函数:

1)第一次printf只打印一个字符串,故将字符串首地址设置为%rdi,作为唯一参数传入。

2)第二次printf有三个参数,设置rsi为argv【1】,设置rdx为argv【2】

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SPO40aKh-1652875163992)(media/image21.png)]

图 22

  1. 第一次直接调用的为puts,第二次调用的为printf

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Dw3bYtdA-1652875163993)(media/image22.png)]

    图 23

3. exit函数:
1)退出函数,将返回值edi设置为1.
2)调用时需要 call exit@PLT

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LqG7yFkq-1652875163993)(media/image23.png)]

图 24

4.getchar函数:
1)调用:call getchar@PLT

5.atoi函数:

1)调用:call atoi@PLT

2)参数:%rdi为argv[3]

6. sleep函数:
1)调用:call sleep@PLT.

2)参数:atoi的返回值(argv[3])

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KKZemH6Q-1652875163993)(media/image24.png)]

图 25

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

3.4 本章小结

本章介绍了在编译过程中,编译器对各种对象的操作。经过编译后,C语言变为更加通用且机器易理解的汇编代码。

(第3章2分)

第4章 汇编

4.1 汇编的概念与作用

概念与作用:汇编器(as)将.s汇编程序翻译成机器语言指令,把这些指令打包成可重定位目标程序的格式,并将结果保存在.o目标文件中,.o文件是一个二进制文件,它包含程序的指令编码。

注意:这儿的汇编是指从 .s 到 .o
即编译后的文件到生成机器语言二进制程序的过程。

4.2 在Ubuntu下汇编的命令

命令: as hello.s -o hello.o

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V9OtFn9D-1652875163993)(media/image25.png)]

图 26

应截图,展示汇编过程!

4.3 可重定位目标elf格式

分析hello.o的ELF格式,用readelf等列出其各节的基本信息,特别是重定位项目分析。

4.3.1 ELF Header:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xvtdOtqX-1652875163994)(media/image26.png)]

图 27

[]{#_Toc532238415
.anchor}Magic部分描述了hello.o的系统的字的大小和字节顺序,剩下的部分帮助链接器分析并解释目标文件的信息。

4.3.2节头部表:

Section Headers:节头部表,包含了文件中出现的各个节的语义,包括节
的类型、位置和大小等信息。
由于是可重定位目标文件,所以每个节都从0开始,用于重定位。在文件头中得到节头表的信息,然后再使用节头表中的字节偏移信息得到各节在文件中的起始位置,以及各节所占空间的大小,同时可以观察到,代码是可执行的,但是不能写;数据段和只读数据段都不可执行,而且只读数据段也不可写。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yR2ZiE0a-1652875163994)(media/image27.png)]

图 28

  1. 重定位节:
    记录.text节中需要进行重定位的信息。链接时,这些信息将被修改。下图为对一些对象的重定位声明。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WUbze3GQ-1652875163994)(media/image28.png)]

    图 29

  2. 符号表:

    查看符号表.symtab :命令readelf -s hello.o如图4.3.3.symtab:
    存放程序中定义和引用的函数和全局变量的信息。name是符号名称,对于可冲定位目标模块,value是符号相对于目标节的起始位置偏移,对于可执行目标文件,该值是一个绝对运行的地址。size是目标的大小,type要么是数据要么是函数。Bind字段表明符号是本地的还是全局的。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YxaQGvaU-1652875163995)(media/image29.png)]

    图 30

4.4 Hello.o的结果解析

机器语言包含以下几个部分:
操作码、操作数的地址、结果的地址、下一条指令的地址(有可能有)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iIFRkudU-1652875163995)(media/image30.jpeg)]

图 31

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i4Cz7u2o-1652875163995)(media/image31.jpeg)]

图 32

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KJn41hSL-1652875163995)(media/image32.jpeg)]

图 33

Hello.o反汇编结果如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LwYW0uij-1652875163996)(media/image33.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s7tZxTRV-1652875163996)(media/image34.png)]

观察可知,反汇编代码与汇编代码并无太大修改,知识在每条汇编指令之前加入了机器码。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FNZM1FL6-1652875163996)(media/image35.png)]

除此之外,原来的跳转语句中的标记(.L1,.L2等)全部被替换为实际地址,对函数的调用也变为地址。

objdump -d -r hello.o 分析hello.o的反汇编,并请与第3章的
hello.s进行对照分析。

说明机器语言的构成,与汇编语言的映射关系。特别是机器语言中的操作数与汇编语言不一致,特别是分支转移函数调用等。

4.5 本章小结

本章分析了hello.s被汇编得到hello.o的过程。之后查看了hello.o的ELF,又对hello.o进行了反汇编,并将反汇编的内容与汇编文件进行了对比,分析得出了汇编指令到机器语言的对应关系。

(第4章1分)

第5章 链接

5.1 链接的概念与作用

链接:链接是将多个文件拼接合并成一个可执行文件的过程。通过链接,分离编译可以得到实现。

注意:这儿的链接是指从 hello.o 到hello生成过程。

5.2 在Ubuntu下链接的命令

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oEadXvmo-1652875163997)(media/image36.png)]

使用ld的链接命令,应截图,展示汇编过程! 注意不只连接hello.o文件

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P34J8TeR-1652875163997)(media/image37.png)]

打开文件:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vtUlokEK-1652875163997)(media/image38.png)]

可以看到节头数量增加。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Pw08ZXt5-1652875163998)(media/image39.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MqYxXNV1-1652875163998)(media/image40.png)]

此处记录了在hello文件中各节的大小,偏移量,地址。

分析hello的ELF格式,用readelf等列出其各段的基本信息,包括各段的起始地址,大小等信息。

5.4 hello的虚拟地址空间

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PkYJBHCO-1652875163998)(media/image41.png)] 从下图可以看出:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hFm2HXc5-1652875163998)(media/image42.png)]

0x00400000开始,程序被载入,其中节的排布与Address中的声明相同。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-npK0xXOc-1652875163999)(media/image43.png)]

上图为elf中的程序头表,其中记录了运行时加载的内容,同时提供动态链接的信息。每一行都提供了各个段的虚拟空间和物理内存的大小,标志位,是否对齐,读写权限的信息。

PHDR:程序头表

INTERP:需要调用的解释器(如动态链接器)

LOAD:表示需要从二进制文件映射到虚拟空间的段,其中保存了常量数据和目标代码等内容。

DYNAMIC:动态链接器使用的信息。

NOTE:辅助信息

GUN_STACK:栈是否可执行的标志。

GUN_RELRO:指定重定位之后的只读的内存区域。

5.5 链接的重定位过程分析

objdump -d -r hello 分析hello与hello.o的不同,说明链接的过程。

结合hello.o的重定位项目,分析hello中对其怎么重定位的。

Hello的反汇编文件与hello.o的相比多了以下内容,
经查找有关资料,补充了其功能:

.interp:ld.so的路径

.note.ABI-tag:Linux特有的段

.hash:符号的哈希表

.gnu.hash:GNU中拓展符号的哈希表

.dynsym: 运行时/动态符号表

.dynstr:存放.hynsym节中的符号名称

.gnu.version:符号版本

.gun.version_r:符号引用版本。

.rela.dyn: 运行时/动态重定位表

.rela.plt:.plt节的重定位条目

.init:程序初始化需要执行的代码

.plt:动态链接-过程链接表

.fini: 当程序正常终止时需要执行的代码

.eh_frame:异常展开和源语言的信息

.dynamic:存放被ld.so使用的动态链接信息

.got:存放程序中跟变量全局偏移量

.got.plt:存放程序中函数的偏移量

.data:初始化过的全局变量或生命过的函数。

5.6 hello的执行流程

使用edb执行hello,说明从加载hello到_start,到call
main,以及程序终止的所有过程。请列出其调用与跳转的各个子程序名或程序地址。

ld-2.27.so!_dl_start

ld-2.27.so!_dl_init

hello!_start

libc-2.27.so!__libc_start_main

-libc-2.27.so!__cxa_atexit

-libc-2.27.so!__libc_csu_init

hello!_init

libc-2.27.so!_setjmp

-libc-2.27.so!_sigsetjmp

–libc-2.27.so!__sigjmp_save

hello!main

hello!puts@plt

hello!exit@plt

ld-2.27.so!_dl_runtime_resolve_xsave

-ld-2.27.so!_dl_fixup

–ld-2.27.so!_dl_lookup_symbol_x

libc-2.27.so!exit

5.7 Hello的动态链接分析

在对hello的readelf分析中得知,.got表的地址为0x0000000000403ff0,通过edb中对Data
Dump窗口跳转,定位到GOT表处。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K2hEMzyy-1652875163999)(media/image44.png)]

Got表的相关信息:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cDUBnKqo-1652875164000)(media/image45.png)]

调用__init后的got表。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-heOLwOzx-1652875164000)(media/image46.png)]

在开始edb的调试后,初始的地址0x00403ff0全为0。对于动态共享链接库中PIC函数,编译器没有办法预测函数的运行地址,所以需要添加重定位记录,等待动态链接器的处理,为避免运行时修改调用的代码段,链接器采用延迟绑定的策略。动态链接器使用过程链接表PLT +
全局变量偏移表GOT实现函数的动态链接,GOT中存放目标函数的地址,PLT使用该地址跳转到目标位置,其中GOT[1]指向重定位表,GOT[2]指向动态链接器ld-linux.so运行地址。

分析hello程序的动态链接项目,通过edb调试,分析在dl_init前后,这些项目的内容变化。要截图标识说明。

5.8 本章小结

在本章中主要介绍了链接的概念与作用,并且详细阐述了hello.o是怎么链接成为一个可执行目标文件的过程,详细介绍了hello.o的ELF格式和各个节的含义,并且分析了hello的虚拟地址空间、重定位过程、执行流程、动态链接过程。历经艰辛我们的hello可算是诞生了。

(第5章1分)

第6章 hello进程管理

6.1 进程的概念与作用

[]{#_Toc532238428
.anchor}进程是一个执行中的程序的实例,每一个进程都有它自己的地址空间,一般情况下,包括文本区域、数据区域、和堆栈。文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储区着活动
过程调用的指令和本地变量。

作用:进程为用户提供了以下假象:

1.我们的程序好像是系统中当前运行的唯一程序一样,我们的程序好像是独占的使用处理器和内存。

  1. 处理器好像是无间断的执行我们程序中的指令,我们程序中的代码和数据好像是系统内存中唯一的对象。

6.2 简述壳Shell-bash的作用与处理流程

Linux系统中,Shell是一个交互型应用级程序,代表用户运行其他程序(是命令行解释器,以用户态方式运行的终端进程)。

其基本功能是解释并运行用户的指令,重复如下处理过程:

1.终端进程读取用户由键盘输入的命令行

2.分析命令行字符串,获取命令行参数,并构造传递给execve的argv向量

3.检查第一个(首个、第0个)命令行参数是否是一个内置的shell命令

4.如果不是内部命令,调用fork( )创建新进程/子进程

5.在子进程中,用步骤2获取的参数,调用execve( )执行指定程序

6.如果用户没要求后台运行(命令末尾没有&号)否则shell使用waitpid(或wait…等待作业终止后返回

7.如果用户要求后台运行(如果命令末尾有&号),则shell返回

6.3 Hello的fork进程创建过程

[]{#_Toc532238430
.anchor}终端程序通过调用fork()函数创建一个子进程,子进程得到与父进程完全相同但是独立的一个副本,包括代码段、段、数据段、共享库以及用户栈。子进程还获得与父进程任何打开文件描述符相同的副本,父进程和子进程最大的不同时他们的PID是不同的。父进程与子进程是并发运行的独立进程,内核能够以任意方式交替执行它们的逻辑控制流的指令。在子进程执行期间,父进程默认选项是显示等待子进程的完成。

以我们的hello为例,当我们输入 ./hello 120L020828 田阔 1
的时候,首先shell对我们输入的命令进行解析,由于我们输入的命令不是一个内置的shell命令,因此shell会调用fork()创建一个子进程。

6.4 Hello的execve过程

当创建了一个子进程之后,子进程调用exceve函数在当前子进程的上下文加载并运行一个新的程序即hello程序,加载并运行需要以下几个步骤:

1.删除已存在的用户区域。删除当前进程虚拟地址的用户部分中已存在的区域结构。

2.映射私有区域。为新程序的代码、数据、bss和栈区域创建新的区域结构。所有这些区域结构都是私有的,写时复制的。虚拟地址空间的代码和数据区域被映射为hello文件的.txt和.data区。bss区域是请求二进制零的,映射匿名文件,其大小包含在hello文件中。栈和堆区域也是请求二进制零的,初始长度为零。如图6.4

3.映射共享区域。如果hello程序与共享对象链接,比如标准C库libc.so,那么这些对象都是动态链接到这个程序的,然后再映射到用户虚拟地址空间中的共享区域。

4.设置程序计数器(PC)。exceve做的最后一件事就是设置当前进程的上下文中的程序计数器,使之指向代码区域的入口点。下一次调用这个进程时,它将从这个入口点开始执行。Linux将根据需要换入代码和数据页面。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LcYGStfp-1652875164001)(media/image47.jpeg)]

除了一些头部信息,在加载过程中没有任何从磁盘到内存的数据 复制。直到 CPU
引用一个被映射的虚拟页时才会进行复制,这时,操作系统利用
它的页面调度机制自动将页面从磁盘传送到内存。

6.5 Hello的进程执行

进程提供给应用程序的抽象:

1.一个独立的逻辑控制流,它提供一个假象,好像我们的进程独占的使用处理器

2.一个私有的地址空间,它提供一个假象,好像我们的程序独占的使用CPU内存。

hello进程的执行是依赖于进程所提供的抽象的基础上,下面阐述操作系统所提供的的进程抽象:

①逻辑控制流::一系列程序计数器 PC的值的序列叫做逻辑控制流,进程是轮流
使用处理器的,在同一个处理器核心中,每个进程执行它的流的一部分后被抢占(暂时挂起),然后轮到其他进程。

②并发流:一个逻辑流的执行时间与另一个流重叠,成为并发流,这两个流成为并发的运行。多个流并发的执行的一般现象成为并发。

③时间片:一个进程执行它的控制流的一部分的每一时间段叫做时间片。

④私有地址空间:进程为每个流都提供一种假象,好像它是独占的使用系统地址空间。一般而言,和这个空间中某个地址相关联的那个内存字节是不能被其他进程读或者写的,在这个意义上,这个地址空间是私有的。

⑤用户模式和内核模式:处理器通常使用一个寄存器提供两种模式的区分,该寄
存器描述了进程当前享有的特权,当没有设置模式位时,进程就处于用户模式中,
用户模式的进程不允许执行特权指令,也不允许直接引用地址空间中内核区内的
代码和数据;设置模式位时,进程处于内核模式,该进程可以执行指令集中的任
何命令,并且可以访问系统中的任何内存位置。

⑥上下文信息:上下文就是内核重新启动一个被抢占的进程所需要的状态,它由
通用寄存器、浮点寄存器、程序计数器、用户栈、状态寄存器、内核栈和各种内
核数据结构等对象的值构成。

⑦上下文切换:当内核选择一个新的进程运行时,则内核调度了这个进程。在内核调度了一个新的进程运行后,它就抢占当前进程,并使用一种称为上下文切换的机制来将控制转移到新的进程:

1)保存以前进程的上下文

2)恢复新恢复进程被保存的上下文

3)将控制传递给这个新恢复的进程,来完成上下文切换

现在我们再来看一下hello进程执行,再进程调用execve函数之后,由上面分析可知,进程已经为hello程序分配了新的虚拟的地址空间,并且已经将hello的.txt和.data节分配虚拟地址空间的代码区和数据区。最初hello运行在用户模式下,输出./hello
120L020828 田阔
1,然后hello调用sleep函数之后进程陷入内核模式,内核不会选择什么都不做等待sleep函数调用结束,而是处理休眠请求主动释放当前进程,并将hello进程从运行队列中移出加入等待队列,定时器开始计时,内核进行上下文切换将当前进程的控制权交给其他进程,当定时器到时发送一个中断信号,此时进入内核状态执行中断处理,将hello进程从等待队列中移出重新加入到运行队列,成为就绪状态,hello进程就可以继续进行自己的控制逻辑流了。如下图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fiwScJum-1652875164001)(media/image48.jpeg)]

结合进程上下文信息、进程时间片,阐述进程调度的过程,用户态与核心态转换等等。

6.6 hello的异常与信号处理

异常和信号异常可以分为四类:中断、陷阱、故障、终止,各自的属性如下图所示。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GzP4q0ut-1652875164001)(media/image49.jpeg)]

  1. 正常停止:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Bv1qhndc-1652875164002)(media/image50.png)]

    Hello进程将会被回收,ps中无hello进程。

  2. SIGSTP信号(ctrl-z):

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J6kkKK8R-1652875164002)(media/image51.png)]

    Shell接受到ctrl-z后,向父进程发送SIGSTP信号,显示信息,进程挂起,但并未停止。查看ps,hello进程仍在列表中,通过"fg"可将其调至前台继续执行,结束时,进程仍正常回收。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-alHfXKuC-1652875164003)(media/image52.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OCWQo5po-1652875164003)(media/image53.png)]

  3. SIGINT信号(ctrl-c):

    Shell收到ctrl-c后,将向父进程发送SIGINT信号,父进程将会将子进程结束并回收,如图:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Qdk0VWCm-1652875164003)(media/image54.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fP1YMQou-1652875164004)(media/image55.png)]

  4. 其他信号:
    中途乱按,屏幕将显示乱按的内容。如果这个内容是内置命令,shell将会解析,并在进程结束后执行;如果不是则显示错误信息。

    中途乱按,屏幕将显示乱按的内容。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-krsH1pfJ-1652875164004)(media/image56.png)]

    如果这个内容是内置命令,shell将会解析,并在进程结束后执行;如果不是则显示错误信息。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PQON12Z7-1652875164004)(media/image57.png)]

hello执行过程中会出现哪几类异常,会产生哪些信号,又怎么处理的。

程序运行过程中可以按键盘,如不停乱按,包括回车,Ctrl-Z,Ctrl-C等,Ctrl-z后可以运行ps
jobs pstree fg kill
等命令,请分别给出各命令及运行结截屏,说明异常与信号的处理。

6.7本章小结

本章介绍了进程的概念和作用,介绍了shell的功能和工作机制,同时,通过hello的运行分析了进程的控制,信号的传递等内容。

(第6章1分)

第7章 hello的存储管理

7.1 hello的存储器地址空间

逻辑地址:访存指令给出的地址,也叫相对地址。是程序运行由CPU产生的与段相关的偏移地址的部分。
线性地址/虚拟地址:逻辑地址经过段机制后转化为线性地址,为描述符:偏移量的组合形式。分页机制中线性地址作为输入。
物理地址:程序运行时,其在内存单元中的真正地址。

结合hello说明逻辑地址、线性地址、虚拟地址、物理地址的概念。

7.2 Intel逻辑地址到线性地址的变换-段式管理

[]{#_Toc532238437
.anchor}一个逻辑地址由两部分组成:段标识符和段内偏移量。段内偏移量是一个16位长的字段组成,称为段选择符,前13位是序列号。根据一个段描述符可以找到一个段的首地址,若干段描述符就可以组成段描述符表。再通过段标识符的前13位,直接在段描述符表中找到一个具体的段描述符,进而确定一个段。

7.3 Hello的线性地址到物理地址的变换-页式管理

[]{#_Toc532238438 .anchor}虚拟内存的结构如图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wgjRQhK8-1652875164005)(media/image58.jpeg)]

虚拟内存的空间由分页机制进行管理,这个过程中,线性地址将被转化为物理地址。内核将维护hello的段的结构,即task_struct,其中mm指向某一个mm_struct,mm_struct中的pgd为本级页表的首地址,mmap在指向vm_area_struct链表,一个链表对应程序的一个段,若干链表相连hello的所有段。

系统将虚拟内存的每个段分为若干个小单位,并以此为单位将数据装入内存,这个最小的单位被称为页,一般每个页的大小为4KB。同时,物理内存中也会分为同样大小的若干个页。CPU中的MMU单元负责翻译地址,将虚拟地址根据页表中的记录翻译为物理地址。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sMQFyQCa-1652875164005)(media/image59.jpeg)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g5nmUece-1652875164005)(media/image60.jpeg)]

如图。虚拟地址分为VPN和VPO两部分,VPN中又分为TLBT和TLBI两部分。TLBI表示在页表中的组序号,TLBT表示标记值,如果改组中有有效位为1且标记值相同的,则命中,取出其PPN作为其物理页号。

7.4 TLB与四级页表支持下的VA到PA的变换

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XNcYEAYe-1652875164005)(media/image61.jpeg)]

[]{#_Toc532238439
.anchor}如图,CPU首先给出虚拟地址VA,VA的后12位将被MMU直接作为物理地址结果的后12位。

对于VA的前36位,也就是VPN,MMU会将其拆分为两部分:32位的TLBT和4位的TLBI,并由此去TLB中寻找相应PPN。

如果TLB中标号为TLBI的组中有标记值为TLBT的,且有效值为1的项,则查找命中(hit),直接将TLB中存储的该项的PPN输出作为PA的前40位。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-se6BFAGi-1652875164006)(media/image62.jpeg)]

如果TLB中没有满足条件的项,则查找未命中(miss),MMU将会去TLB的下一级存储------页表中继续查找。这时,VPN将不再被分为TLBT和TLBI,而是会被分为4个9位的VPNn(n=1,2,3,4),MMU会先根据VPN1在第一级页表中查找,得到的结果将告诉MMU内存中是否存在,及第二级页表的起始地址,之后MMU会再根据VPN2去第二级页表中查找,以此类推,直到再第四级页表中查找到PPN,MMU将其输出,与PPO组合,作为物理地址输出。

如果页表中也没有对应的PPN,则发生缺页(Page fault)。

7.5 三级Cache支持下的物理内存访问

如图,物理地址在被用来去L1级缓存中寻找内容时,将被分为三个部分:40位CT、6位CI、6位CO。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BNW9zXrC-1652875164006)(media/image63.jpeg)]

对于我电脑上的CPU,L1缓存为8路64组组相连,故组索引需要6位二进制。又因为块大小为64字节,故块偏移量也为6位2进制。其余40位位标记位。

得到物理地址后,我们先使用CI找到对应的组,对组中的每一个有效值为1的块的标记值与物理地址中的CT进行匹配,如果有相同的,则查找命中(hit),按照块偏移CO取出数据。

如果没有找到符合要求的项,则发生不命中,需要向小一级存储L2继续查找。如果查询到数据,再将其写回L1。对于写回,如果L2中的数据映射在L1中的位置没有有效数据,则发生冷不命中,直接将L2的数据写入并修改有效位即可;如果对应位置有有效的数据,则发生冲突不命中,需要用L2中的数据替换L1中的数据。如果L1中的数据的脏位为1,则表示此数据已经被修改,还需要先将L1中的数据写回L2。

L2->L3同理。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EkgqT5Or-1652875164006)(media/image64.jpeg)]

7.6 hello进程fork时的内存映射

Shell会fork一个子进程,系统将给这个子进程分配一个唯一的PID,同时将会为这个进程分配相应的系统资源。
查找资料知,系统会将父进程和fork出的子进程的页面都标记为已读,并将两个进程的每个区域结构都标记为私有的写时复制。

7.7 hello进程execve时的内存映射

首先,系统会删除已经存在的用户区域,然后会开辟一块新的私有区域,存放.malloc,.data.,.bss,.text段。之后,在创建新的共享区域libc.so.data,libc.so.text段。最后设置PC,指向代码的入口点。

如下图所示,前边的机器码就是进程在地址段中的表示。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oUDONVO1-1652875164006)(media/image65.png)]

7.8 缺页故障与缺页中断处理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8JGjaeuv-1652875164007)(media/image66.jpeg)]

缺页故障:MMU无法在TLB和页表中找到虚拟地址对应的物理地址。
缺页中断处理:选择一个牺牲页面,如果这个牺牲页面被修改过,就把它交换出去,用新的页更新原来的页表。缺页处理程序返回时,CPU重新执行这条指令,得到新的VA,MMU也重新寻找物理地址。

7.9动态存储分配管理

动态内存分配起维护着堆,堆是一个进程的虚拟内存空间,一般从低地址向高地址生长。分配器会将堆中的内存视为大小不同的块,如果块中已经被进程占用,则是已分配的;没有则是空闲的。当有新的进程出现或其他进程需要新的内存空间时,分配器将会从空闲块中找到大小合适的块。

分配器分为显示分配器和隐式分配器。显式分配器要求应用显示的释放已分配的块;隐式分配器也被称为垃圾收集机制,只要检测到未使用过的块就释放这个块。

隐式空闲链表:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vwxqht1w-1652875164007)(media/image67.jpeg)]

对于带边界标签的隐式空闲链表分配器,一个块有一个字的头部、有效载荷、可能的一些额外的填充,结尾的一个字的脚部组成。头部负责记录这个块的大小和是否被分配的信息。如果有双字的对齐约束条件,块的大小就一定是8的倍数。这是,块大小的最低三位一定为0,我们只需要存储前29位,剩余的三位用来编码其余信息,此块是否被分配就存在最后一位。

头部后面是有效载荷,大小可以是任意的,作用是填充,大多为了满足对其要求或解决外部碎片。

一个已经组织好的,连续的已分配块和空闲块的排列成为一个隐式空闲链表。空闲块是通过其头部的大小字段隐含的连接着的。分配器在分配内存时,将遍历所有的块,找到一个大小合适的空闲块。

合并:如果只是释放,将会产生大量的内存碎片,所以合并机制是必不可少的。根据内存之间的关系,我们可以分为四种情况:前空后空、前不空后不空、前空后不空、前不空后空。通过改变头部和脚部中的值就可以完成这些操作。

Printf会调用malloc,请简述动态内存管理的基本方法与策略。

7.10本章小结

本章主要介绍了hello的存储器的地址空间,介绍了四种地址空间的差别和地址的相互转换。同时介绍了hello的四级页表的虚拟地址空间到物理地址的转换。阐述了三级cashe的物理内存访问、进程
fork 时的内存映射、execve
时的内存映射、缺页故障与缺页中断处理、动态存储分配管理。

(第7章 2分)

第8章 hello的IO管理

8.1 Linux的IO设备管理方法

设备的模型化:文件

一个Linux文件就是一个m字节的序列:B0,B1,B2…Bm

Linux将所有的IO设备都视为文件,所有的输入和输出,都变成对对应文件的读或写。

设备管理:unix io接口

这种控制I/O设备的方式使得所有的输入以一种统一的方式执行,内核为设备引出的一个简单低级的应用接口,称为Unix
I/O.

8.2 简述Unix IO接口及其函数

打开文件:进程向系统要求打开一个文件,系统会返回一个非负整数,此数为描述符,他在后续的鱼这个文件有关的任何操作中代表这个文件,内核记录有关于这个文件的所有信息。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-enmMHw6J-1652875164007)(media/image68.jpeg)]

Open函数将文件名转换为文件描述符,并且返回描述符数字。Flags表示进程访问文件方式。
2.
改变位置:对于每个打开的文件,内核都会记录一个位置,此位置为从所有文件的开头开始计算的情况下,此文件的偏移量。
3. 读写文件:
1)读操作:从文件中复制需要读取的字节到内存中。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O2H7Tt5t-1652875164007)(media/image69.jpeg)]

2)写操作:从内存总复制文件大小个字节到对应文件。读写操作都用到之前记录的文件位置。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uWfhjYRT-1652875164007)(media/image69.jpeg)]

4.int close(fd),fd是需要关闭的文件的描述符,close返回操作结果。

8.3 printf的实现分析

分析首先查看printf函数的函数体:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eNur4VPE-1652875164008)(media/image70.jpeg)]

printf程序按照格式fmt结合参数args生成格式化之后的字符串,并返回字串的长度。

接下来是write函数:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OF9ImkPZ-1652875164008)(media/image71.jpeg)]

在printf中调用系统函数write(buf,i)将长度为i的buf输出,在write函数中,将栈中参数放入寄存器,ecx是字符个数,ebx存放第一个字符地址,

int INT_VECTOR_SYS_CALLA代表通过系统调用syscall。

查看syscall函数体:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oXlZZDWL-1652875164008)(media/image72.jpeg)]

syscall将字符串中的字节从寄存器中通过总线复制到显卡的显存中,显存中存储的是字符的ASCII码。

字符显示驱动子程序将通过ASCII码在字模库中找到点阵信息将点阵信息存储到vram中。

显示芯片会按照一定的刷新频率逐行读取vram,并通过信号线向液晶显示器传输每一个点(RGB分量)。

于是我们的打印字符串就显示在了屏幕上。

从vsprintf生成显示信息,到write系统函数,到陷阱-系统调用 int
0x80或syscall.

字符显示驱动子程序:从ASCII到字模库到显示vram(存储每一个点的RGB颜色信息)。

显示芯片按照刷新频率逐行读取vram,并通过信号线向液晶显示器传输每一个点(RGB分量)。

https://www.cnblogs.com/pianist/p/3315801.html

8.4 getchar的实现分析

getchar 的源代码为:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BEaFbscy-1652875164009)(media/image73.jpeg)]

异步异常-键盘中断的处理:当用户按键时,键盘接口会得到一个代表该按键的键盘扫描码,同时产生一个中断请求,中断请求抢占当前进程运行键盘中断子程序,键盘中断子程序先从键盘接口取得该按键的扫描码,然后将该按键扫描码转换成
ASCII 码,保存到系统的键盘缓冲区之中。

getchar 函数落实到底层调用了系统函数 read,通过系统调用read读取存储在
键盘缓冲区中的ASCII码直到读到回车符然后返回整个字串,getchar进行封装,
大体逻辑是读取字符串的第一个字符然后返回。

8.5本章小结

本章介绍了Linux的IO设备管理办法,Unix
IO接口及其函数,分析了printf函数和getchar函数,了解了字符串从被键盘输入到在屏幕上显示的整个过程。

(第8章1分)

结论

用计算机系统的语言,逐条总结hello所经历的过程。

你对计算机系统的设计与实现的深切感悟,你的创新理念,如新的设计与实现方法。

1.hello.c:编写c程序,hello.c诞生,它是一个二进制文本文件,hello.c中的每个字符都是用ascall编码表示。

2.hello.i:hello.c经过预处理阶段变为hello.i。

3.hello.s:hello.i经过编译阶段变为hello.s。

4.hello.o:hello.s经过汇编阶段变为hello.o。

5.hello链接:hello.o与可重定位目标文件和动态链接库链接成为可执行文件hello。至此可执行hello程序正式诞生。

6.运行:在终端输入./hello 120L020828 田阔 1。

7.创建子进程:由于终端输入的不是一个内置的shell命令,因此shell调用fork函数创建一个子进程。

8.加载::shell 调用 execve,execve 调用启动加载器,加映射虚拟内
存,进入程序入口后程序开始载入物理内存,然后进入 main 函数。

9.上下文切换:hello调用sleep函数之后进程陷入内核模式,处理休眠请求主动释放当前进程,内核进行上下文切换将当前进程的控制权交给其他进程,当sleep函数调用完成时,内核执行上下文切换将控制传递给当前进程。

10.动态申请内存:当hello程序执行printf函数是, 会调用 malloc
向动态内存分配器申请堆中的内存。

11.信号管理:当程序在运行的时候我们输入Ctrl+c,内核会发送SIGINT信号给进程并终止前台作业。当输入Ctrl+z时,内核会发送SIGTSTP信号给进程,并将前台作业停止挂起。

12.终止:当子进程执行完成时,内核安排父进程回收子进程,将子进程的退出状态传递给父进程。内核删除为这个进程创建的所有
数据结构。

[对计算机系统的设计与实现的深切感悟]{.underline}:计算机系统的设计思想和实现都是基于抽象实现的。从最底层的信息的表示用二进制表示抽象开始,到实现操作系统管理硬件的抽象:进程是对处理器、主存和I/O设备的抽象。虚拟内存是对主存和磁盘设备的抽象。文件是对I/O设备的抽象。

[计算机系统的设计精巧]{.underline}:为了解决快的设备存储小、存储大的设备慢的不平衡,设计了高速缓存来作为更底层的存储设备的缓存,大大提高了CPU访问主存的速度。

[计算机系统的设计考虑全面]{.underline}:计算机系统设计考虑一切可能的实际情况,设计出一系列的满足不同情况的策略。比如写回和直写,写分配和非写分配,直接映射高速缓存和组相连高速缓存等等。

(结论0分,缺失 -1分,根据内容酌情加分)

附件

Hello.c 源文件

Hello.i 对hello.i进行预处理后的文件

Hello.s 对hello.i 编译后得到的汇编文件

Hello.o 对hello.s进行汇编之后的可重定位文件

Hello 链接所有文件后得到的可执行文件

Asm.txt 反汇编hello内容的txt文件

Elf.txt Readelf读取hello.o得到的文件

列出所有的中间产物的文件名,并予以说明起作用。

(附件0分,缺失 -1分)

参考文献

为完成本次大作业你翻阅的书籍与网站等

[1] https://www.cnblogs.com/diaohaiwei/p/5094959.html

[2] 深入理解计算机系统原书第3版-文字版.pdf

(参考文献0分,缺失 -1分)
cve 调用启动加载器,加映射虚拟内
存,进入程序入口后程序开始载入物理内存,然后进入 main 函数。

9.上下文切换:hello调用sleep函数之后进程陷入内核模式,处理休眠请求主动释放当前进程,内核进行上下文切换将当前进程的控制权交给其他进程,当sleep函数调用完成时,内核执行上下文切换将控制传递给当前进程。

10.动态申请内存:当hello程序执行printf函数是, 会调用 malloc
向动态内存分配器申请堆中的内存。

11.信号管理:当程序在运行的时候我们输入Ctrl+c,内核会发送SIGINT信号给进程并终止前台作业。当输入Ctrl+z时,内核会发送SIGTSTP信号给进程,并将前台作业停止挂起。

12.终止:当子进程执行完成时,内核安排父进程回收子进程,将子进程的退出状态传递给父进程。内核删除为这个进程创建的所有
数据结构。

[对计算机系统的设计与实现的深切感悟]{.underline}:计算机系统的设计思想和实现都是基于抽象实现的。从最底层的信息的表示用二进制表示抽象开始,到实现操作系统管理硬件的抽象:进程是对处理器、主存和I/O设备的抽象。虚拟内存是对主存和磁盘设备的抽象。文件是对I/O设备的抽象。

[计算机系统的设计精巧]{.underline}:为了解决快的设备存储小、存储大的设备慢的不平衡,设计了高速缓存来作为更底层的存储设备的缓存,大大提高了CPU访问主存的速度。

[计算机系统的设计考虑全面]{.underline}:计算机系统设计考虑一切可能的实际情况,设计出一系列的满足不同情况的策略。比如写回和直写,写分配和非写分配,直接映射高速缓存和组相连高速缓存等等。

(结论0分,缺失 -1分,根据内容酌情加分)

附件

Hello.c 源文件

Hello.i 对hello.i进行预处理后的文件

Hello.s 对hello.i 编译后得到的汇编文件

Hello.o 对hello.s进行汇编之后的可重定位文件

Hello 链接所有文件后得到的可执行文件

Asm.txt 反汇编hello内容的txt文件

Elf.txt Readelf读取hello.o得到的文件

列出所有的中间产物的文件名,并予以说明起作用。

(附件0分,缺失 -1分)

参考文献

为完成本次大作业你翻阅的书籍与网站等

[1] https://www.cnblogs.com/diaohaiwei/p/5094959.html

[2] 深入理解计算机系统原书第3版-文字版.pdf

(参考文献0分,缺失 -1分)

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章