雁过留声 发表于 2024-8-26 12:40:14

哈尔滨工业大学步伐人生-Hello’s P2P





计算机系统

大作业


题     目  步伐人生-Hello’s P2P 
专       业     计算机科学与技术   
学     号       2021111050       
班   级         2103101        
学       生         吕泽楷     
指 导 教 师         刘雄伟        






计算机科学与技术学院
2022年11月
摘  要
HelloWorld是每个步伐员接触的第一个步伐,本文观察hello.c 文件在Linux系统中的生命周期,从预处置惩罚编译开始,观察其怎样一步步天生hello可执行文件,从计算机底层解释了存储、分配、I/O过程、子步伐的创建和回收等过程,使我们对计算机和步伐有直观深刻的熟悉。

关键词:Liunx;P2P;计算机系统;hello       








目  录

第1章 概述
1.1 Hello简介
1.2 环境与工具
1.3 中心结果
1.4 本章小结
第2章 预处置惩罚
2.1 预处置惩罚的概念与作用
2.2在Ubuntu下预处置惩罚的命令
2.3 Hello的预处置惩罚结果解析
2.4 本章小结
第3章 编译
3.1 编译的概念与作用
3.2 在Ubuntu下编译的命令
3.3 Hello的编译结果解析
3.4 本章小结
第4章 汇编
4.1 汇编的概念与作用
4.2 在Ubuntu下汇编的命令
4.3 可重定位目的elf格式
4.4 Hello.o的结果解析
4.5 本章小结
第5章 链接
5.1 链接的概念与作用
5.2 在Ubuntu下链接的命令
5.3 可执行目的文件hello的格式
5.4 hello的虚拟地址空间
5.5 链接的重定位过程分析
5.6 hello的执行流程
5.7 Hello的动态链接分析
5.8 本章小结
第6章 hello历程管理
6.1 历程的概念与作用
6.2 简述壳Shell-bash的作用与处置惩罚流程
6.3 Hello的fork历程创建过程
6.4 Hello的execve过程
6.5 Hello的历程执行
6.6 hello的异常与信号处置惩罚
6.7本章小结
第7章 hello的存储管理
7.1 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动态存储分配管理
7.10本章小结
第8章 hello的IO管理
8.1 Linux的IO装备管理方法
8.2 简述Unix IO接口及其函数
8.3 printf的实现分析
8.4 getchar的实现分析
8.5本章小结
结论
附件
参考文献


第1章 概述

1.1 Hello简介

1.1.1 P2P:
P2P即From Program to Process。
Program指hello.c源文件,是颠末我们键盘输入后读入内存的文件;
Process指历程,hello.c文件颠末预处置惩罚(cpp)、编译(ccl)、汇编(as)、链接(ld)最终天生可执行文件hello。当我们在shell中输入./hello 学号 姓名 秒数,shell为其创建子历程,接着把用execve把hello的内容加载到子历程中运行,实现了由Process向Process的转变,这就是P2P。
1.1.2 020:
020即From Zero-0 to Zero-0。步伐运行前,execve将hello步伐加载到相应的上下文中,从main函数开始执行代码;在步伐竣过后shell回收历程,开释hello的内存删除上下文,清除痕迹。整个hello步伐就是从无到有再到无的过程,即From Zero-0 to Zero-0。
1.2 环境与工具

硬件:X64CPU
软件:Windows10 64位 Vmware Ubuntu 20.03
开发工具:GCC GDB objdump VisualStudio2019 Codeblocks
1.3 中心结果

文件名
文件作用
hello.c
源文件
hello.i
hello.c颠末预处置惩罚(cpp)后的文本文件
hello.s
hello.i颠末编译(ccl)得到的汇编文件
hello.o
hello.s颠末汇编(as)得到的可重定位目的文件
hello
hello.o与其他目的文件链接后得到的可执行目的文件
elf.txt
hello.o的elf文件
hello_elf.txt
hello的elf文件

1.4 本章小结

本章介绍了hello的P2P过程和020过程,开端介绍了hello的步伐人生,介绍了环境和工具,阐明了处置惩罚过程的各项中心结果为本论文奠定底子。



第2章 预处置惩罚

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

2.1.1概念:预处置惩罚是源文件编译前必要做的预备工作,预处置惩罚器(cpp)会修改原始的C步伐,会将以#开始的代码解释为预处置惩罚指令,好比宏定义(#define)、文件包罗(include)、条件编译(#if)等,将这些内容直接插入到步伐文本,删除注释和多余空缺字符。
2.1.2作用:源文件颠末预处置惩罚可以得到便于编译器工作的.i文件
2.2在Ubuntu下预处置惩罚的命令

在步伐所在终端输入gcc -E hello.c -o hello.i得到预处置惩罚文件后如下
https://i-blog.csdnimg.cn/blog_migrate/637642097b18b4fd60199025d66fa17a.png
 
图1预处置惩罚后文件
2.3 Hello的预处置惩罚结果解析

https://i-blog.csdnimg.cn/blog_migrate/b278fe00bc5708fc5e9eeb101474247b.png
 
图2源文件
观察源文件可以看到由三个#include可以在预处置惩罚时进行操纵
打开hello.i文件:
https://i-blog.csdnimg.cn/blog_migrate/5a416542207cbe3a830eb2634e0a6ca1.png
 
图3 hello.i文件
可以看到源文件已经扩展为3091行,其中注释已经被删除
https://i-blog.csdnimg.cn/blog_migrate/606cf1235e9baf4fd20ba20676720005.png
 
图4 文件包罗预处置惩罚
搜索三个.h文件可以看到其调用路径已经被预处置惩罚器写入.i文件,阐明
#include<stdio.h>、#include<stdlib.h>、#include<unistd.h>文件已经被预处置惩罚
2.4 本章小结

本章介绍了预处置惩罚的概念和作用,指出预处置惩罚指令,对hello.c源文件进行了预处置惩罚,并对预处置惩罚结果进行了分析。
第3章 编译

3.1 编译的概念与作用

3.1.1概念:编译是指编译器将源步伐转换为计算机可以识别的机器语言——汇编语言,编译可以分为分析和整合两部门,分析过程将源步伐分成多个结构,校验其格式,网络源步伐信息,并将其放在符号表中;整合过程根据分析过程通报的信息构造目的步伐。最后天生hello.s文件
3.1.2 作用:编译共六个步调:

[*]词法分析:词法分析器读取源步伐的字符流并对其进行扫描,将其组成故意义的词素序列,通报给语法分析。
[*]语法分析:语法分析其用词法单元的第一个分量来创建语法树,树中的每个非叶结点都表现一个运算,左右结点表现运算分量。
[*]语义分析:语义分析器语法树和符号表中的信息来查抄源步伐是否和语言定义的语义一致。语义分析器也网络范例信息,以便后续的中心代码天生器使用。
[*]中心代码天生:天生一个明白的低级类机器语言的中心表现。
[*]代码优化:天生效率更高,更好的目的代码
[*]将天生的中心代码映射为机器代码,为每个变量分配寄存器或内存位置,并且将中心指令翻译成机器指令序列。
3.2 在Ubuntu下编译的命令

输入编译指令获得编译文件:
https://i-blog.csdnimg.cn/blog_migrate/d2b4cffa0ef2ab0c792668ee7d8aed20.png
 
图5天生编译文件
3.3 Hello的编译结果解析

3.3.1数据生存:
在函数中,常量包罗printf函数的字符串,if(argc!=4)中的常数4和for(i=0;i<9;i++)中常数9,其中字符串生存在.rodata节中,数字常量在.text节中,以立即数形式存入栈中,如图:
https://i-blog.csdnimg.cn/blog_migrate/bff3cfbb52202d047f3959c33fe9fa6c.png
 
图6 字符串常量
https://i-blog.csdnimg.cn/blog_migrate/1cc02ecba5006d09bcfda1086031b714.png
 
图7 常量4存入栈
https://i-blog.csdnimg.cn/blog_migrate/dbfb173cffab625ea402fda6c265f8d0.png
 
图8 常量9操纵,存入8作为比对小于9的数
3.3.2变量存储:
hello.c文件不存在全局变量,存在局部变量i,指针数组argv[]和局部变量argc
钧生存在栈中:
https://i-blog.csdnimg.cn/blog_migrate/543061c18f1c0bb3540aaf3b7405e7e6.png
 
图9 局部变量argv、argc生存
在图8中可以看到栈指针%rsp减32创造栈空间,第一个参数argc生存在%rbp-20地址处,第二个参数argv生存在地址%rbp-32处
https://i-blog.csdnimg.cn/blog_migrate/f6ea5d68580a0813b8ffb42732843169.png
 
图10 局部变量i生存:
局部变量i生存在%rbp-4地址处,并赋初值0;
3.3.3算数操纵
https://i-blog.csdnimg.cn/blog_migrate/591cb583adae4e6a8ac06932dfa82144.png
 
图11 i++算数操纵
在for循环中i每次循环加1,addl指令将%rbp-4地址对应内存处的值加一,等价于i++;
3.3.4 条件判断和exit函数调用
https://i-blog.csdnimg.cn/blog_migrate/a8e84c44a1050db9b0e9e447338fb19b.png
 
图12 if条件语句
If判断argc值,若argc不即是4,打印字符串并竣事历程
https://i-blog.csdnimg.cn/blog_migrate/16bfa113c7219d569795acb080b93704.png
 
图13 对应汇编语言
cmpl指令将%rbp-20地址处生存的argc与立即数4比较,若相等,跳转到L2(如图14);若不相等将.LC0生存的字符串打印,并调用exit函数。
3.3.5 控制转移和getchar函数调用
https://i-blog.csdnimg.cn/blog_migrate/f406e466c2deeff631bb322d5e24abee.png
 
图14 在if判断argc为4后进行for循环
https://i-blog.csdnimg.cn/blog_migrate/60e342733d51f4e79f91664be348a80a.png
 
图15 for循环判断
在L2中将i设为1后跳转到L3。
在L3中jle指令判断i与8的关系,若i小于即是8,跳转到L4(如图15),否则调用getchar函数。
最后用ret指令返回0;
3.3.6 函数调用和数组操纵
在for循环内部调用了printf函数,sleep函数,atoi函数
https://i-blog.csdnimg.cn/blog_migrate/64f2f876af42a717ec1badacebd8e650.png
 
图16 for循环内部
调用printf函数时%edi生存第一个参数:字符串.LC1;%rsi生存第二个参数argv,%rdx生存第三个参数argv他们由栈指针%rax从栈中赋值。
调用sleep函数时%rax+24从栈中获取参数argv并赋给%rdi,调用函数atoi将字符串转换为int范例,最后调用sleep函数
3.4 本章小结

本章聚焦hello.s文件,对照源文件一步一步解析汇编指令,分析数据储存,变量生存,函数调用,控制转移,数组操纵等怎样用汇编语言一步步实现,并分析了汇编操纵中寄存器和栈的厘革

第4章 汇编

4.1 汇编的概念与作用

4.1.1概念:汇编器将.s文件翻译成机器语言指令,并将这些指令打包成可重定位目的文件的格式,可重定位目的文件包罗二进制的代码和数据。
4.1.2作用:将汇编语句翻译成二进制机器指令,便于后续链接
4.2 在Ubuntu下汇编的命令



https://i-blog.csdnimg.cn/blog_migrate/d4ba226d1da25c0adfacd7433a8f9e95.png
 
图17 汇编命令
4.3 可重定位目的elf格式

 https://i-blog.csdnimg.cn/blog_migrate/289bb6f45ac776d0a4342003ee1d84f3.png
 
图18 检察elf文件
用readelf命令检察hello.o的elf文件:
https://i-blog.csdnimg.cn/blog_migrate/8b27b5fd98499931ce71c44d483c1970.png
 
图19 ELF头
ELF头由以16字节序列Magic开始,描述了天生该文件的系统的字的大小和字节次序,剩下部门包罗 ELF 头的大小、目的文件的范例、机器范例、 字节头部表(section header table)的文件偏移,及节头部表中条目的大小和数目
https://i-blog.csdnimg.cn/blog_migrate/78a171ca653527acca4d649bf74d98d6.png
https://i-blog.csdnimg.cn/blog_migrate/eeac998829898724e1f687e28898d737.png
图20 节头表
解析来的节头表描述了不同节的位置和大小:
1、.text:已编译步伐的机器代码。
2、.rodata:只读数据。
3、.data:已初始化的全局变量和静态C变量。
4、.bss:未初始化的全局变量和静态C变量,仅是占位符,不占据任何实际磁盘空间。
5、.symtab:符号表,存放步伐中定义和引用的函数和全局变量信息,不包罗局部变量的条目。
6、.rel.text:.text节的重定位信息,用于重新修改代码段的指令中的地址信息。
7、.rel.data:.data节的重定位信息,用于对被模块使用或定义的全局变量重定位的信息。
8、.debug:调试符号表,只有以-g方式调用编译器驱动步伐时,才会得到这张表。
9、.line:原始C源步伐中的行号和.text节中机器指令之间的映射。
10、.strtab节:字符串表,包罗.symtab和.debug节中的符号表。
https://i-blog.csdnimg.cn/blog_migrate/b1b6014c0df8b8b1e67b755537dcd062.png
图21 重定位节
重定位节是一个text节中位置的列表,包罗text节中必要进行重定位的信息,用于在链接是修改指令中的地址
4.4 Hello.o的结果解析

使用objdump -d -r hello.o指令获得hello.o的反汇编如下:
 https://i-blog.csdnimg.cn/blog_migrate/42d9f48456681a3181c798fe4d7fbceb.png
https://i-blog.csdnimg.cn/blog_migrate/3683d78b3cd301a4afd9e3a786d3e8b6.png
图22反汇编文件
对比hello.s中:
https://i-blog.csdnimg.cn/blog_migrate/db287449392bffd3cafdf8bd1ed89948.png
https://i-blog.csdnimg.cn/blog_migrate/7337765e8380fae7486cdfe034f67bee.png
图23 hello.s与反汇编文件中数字的对比

[*]进制改变:在汇编文件中栈指针减32,在反汇编文件中栈指针减0x20表现为十六进制。
[*]分支转移:
https://i-blog.csdnimg.cn/blog_migrate/3e7c40634230976773f5a87419a79aed.png
https://i-blog.csdnimg.cn/blog_migrate/495f92fa80b045e853765181191797f2.png
 
图24 hello.s与反汇编文件中分支转移的对比
在汇编文件中跳转必要L2,在反汇编文件中用十六进制相对地址来让jmp指令找到必要跳转的地方

[*]函数调用:
https://i-blog.csdnimg.cn/blog_migrate/68f641103be14cafafb8945129e75dd0.png
https://i-blog.csdnimg.cn/blog_migrate/e6e61f264dc73cecf7e3721814f414f1.png
图25 hello.s与反汇编文件中函数调用的对比
hallo.s中,call指令使用的是函数名称,在反汇编文件中使用相对偏移地址
4.5 本章小结

本章中首先介绍了汇编的概念和作用,接着对hello.s文件进行汇编,天生可重定位目的文件hello.o,之后使用readelf工具,检察了hello.o的ELF头、节头表,可重定位信息和符号表等,接着对hello.o文件和反汇编文件进行了对比,分析了机器语言与汇编语言的一一对应关系

第5章 链接

5.1 链接的概念与作用

5.1.1 概念:
链接是将各种代码和数据片段网络并组合成为一个单一文件的过程,这个文件可被加载(复制)到内存并执行。
5.1.2 作用:
链接器使得分离编译成为大概。不用将一个大型的应用步伐构造为巨大的源文件,而是可以把它分解为更小、更好管理的模块,可以独立地修改和编译这些模块。当我们改变这些模块中的一个时,只需简单地重新编译它,并重新链接应用,而不必重新编译其他文件。

5.2 在Ubuntu下链接的命令

使用ld链接指令链接形成hello可执行文件:
https://i-blog.csdnimg.cn/blog_migrate/e2eba4626dd605233762a71cd8b39097.png
图26 链接指令天生可执行文件
5.3 可执行目的文件hello的格式

用readelf检察hello可执行文件hello的ELF文件:
https://i-blog.csdnimg.cn/blog_migrate/ac6625410aa9fc446b225c9aa1f0dd53.png
图27 hello步伐的ELF文件的ELF头
与hello.o的ELF文件相比,入口地址由0x0变为了0x4010f0,步伐的节和起始地址和大小厘革,多了13个节
https://i-blog.csdnimg.cn/blog_migrate/5e63774c8cb1cb49e47a6d44aef38f8b.png
图28 hello步伐的节

分析hello的ELF格式,用readelf等列出其各段的基本信息,包罗各段的起始地址,大小等信息。
https://i-blog.csdnimg.cn/blog_migrate/81585fa344ce43465ebcf10ca5dcc607.png
图29 步伐节
elf可执行文件易加载到内存,可执行文件连续的片被映射到连续的内存段,步伐头部表描述了这一映射关系。步伐头部表包罗各步伐头的名称、范例、偏移量、内存地址、对其要求、目的文件与内存中的段大小及运行时访问权限等信息。
https://i-blog.csdnimg.cn/blog_migrate/bcfad976603059bae19e97edc6fc2fa5.png
图30 重定位节
5.4 hello的虚拟地址空间

https://i-blog.csdnimg.cn/blog_migrate/698bd43268be1f947129d00188172979.png
图31 edb检察hello文件的虚拟内存
对比ELF节内容
https://i-blog.csdnimg.cn/blog_migrate/5cfc932a14c6fa14a4a1d5b539886b27.png
 
图32 .init的位置
在ELF节头中.init表如今40100地址位置
在虚拟内存中对应:
https://i-blog.csdnimg.cn/blog_migrate/8c195412e4da7aa99c87cc075f740d8f.png
 
图33.init在虚拟内存中的内容
依次可找到其他节头在虚拟内存中的位置
5.5 链接的重定位过程分析

使用objdump -d -r hello 检察hello步伐的反汇编如下:
https://i-blog.csdnimg.cn/blog_migrate/b74f36ba110f74df6ba2de9c0b1a46db.png
 
图34 hello步伐反汇编
在hello的反汇编文件中多了很多节和函数,如.init节 和puts函数,在链接过程中,到场了库函数,并进行了重定位
在hello.o的反汇编中,main函数是从0地址开始的,在hello中生存的虚拟内存的地址为401125
在hello.o的反汇编中存在重定位条目,在hello的反汇编中,链接的函数如puts、printf、getchar等都有了分配到虚拟内存的地址,函数调用确定了这些函数重定位后的地址,可以直接执行。
https://i-blog.csdnimg.cn/blog_migrate/805a99a034d3da551b20b995baa75e89.png
 
图35 链接的函数
在重定位过程中:
https://i-blog.csdnimg.cn/blog_migrate/c587e4e04eea10038c386705a776d283.png
 
图36 hello.o中的puts函数
https://i-blog.csdnimg.cn/blog_migrate/a004efe306ee93c4f4faba27d75c2b06.png
 
图37 hello中的puts调用
分析hello.o中的puts可以发现与main函数偏移地址为1f,格式为R_X86_64_PLT32 调用后位置偏移量为-0x4
所以(unsigned)(0x401090 + (-0x4) - (0x401125 + 0x1f))=0xff ff ff 48,转换为小端法即为48 ff ff ff
5.6 hello的执行流程

https://i-blog.csdnimg.cn/blog_migrate/070f9c750a05d9524da1ec5d306ab982.png
 
图38 在edb中执行hello
地址
子步伐名
0x4010f0
_start
0x401000
_init
0x401125
main
0x401090
puts@plt
0x4010d0
exit@plt
0x4011b4
_fini
0x4010e0
sleep@plt
0x4010c0
atoi@plt
0x4010a0
printf@plt
0x4010b0
getchar@plt
0x401120
_dl_relocate_static_pie
0x401020
.plt

5.7 Hello的动态链接分析

动态的链接器在正常工作时链接器采取了延迟绑定的链接器战略,将过程地址的绑定推迟到第一次调用该过程时。
GOT表中存放着函数的目的地址,PLT表则使用GOT中的地址来跳转到目的函数.首先找到GOT地址
https://i-blog.csdnimg.cn/blog_migrate/41796d08fb086139c6ea833b3a0b57ce.png
 
图39 ELF文件中.got地址
https://i-blog.csdnimg.cn/blog_migrate/0a845706debf2406bfe04860ddbcf853.png
图40 dl_init前
https://i-blog.csdnimg.cn/blog_migrate/713ad48239d6391b7d39e55696fa8502.png
图41 dl_init后

5.8 本章小结

本章介绍了链接的概念和作用,具体阐明了链接的过程,可执行文件hello的ELF头和可执行文件hello的反汇编过程,对链接的重定位过程进行了分析,对hello的动态链接过程进行了分析。

第6章 hello历程管理

6.1 历程的概念与作用

6.1.1概念:历程是一个执行中步伐的实例,系统中的每个步伐都运行在某个历程的上下文中。它是操纵系统进行资源分配的基本单位,也就是说每启动一个历程,操纵系统都会给其分配一定的运行资源(内存资源)包管历程的运行。
6.1.2作用:历程可以使一个系统并发执行多个使命;
历程提供给应用步伐关键的抽象:一个独立的逻辑控制流,它提供一个假象,似乎我们的步伐独占地使用处置惩罚器;一个四月的地址空间,它提供一个假象,似乎我们的步伐独占的使用内存系统
6.2 简述壳Shell-bash的作用与处置惩罚流程

6.2.1作用:
shell是一个交互型应用级步伐,代表用户运行其他步伐,用户通过其提供的界面访问操纵系统内核的服务,是用户使用 Linux 的桥梁。shell吸收用户命令,然后调用相应的应用步伐。
6.2.2处置惩罚流程:
(1)终端历程读取用户由键盘输入的命令行。

(2)分析命令行字符串,获取命令行参数,并构造通报给execve的argv向量

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

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

(5)在子历程中,用步调2获取的参数,调用execve( )执行指定步伐。

(6)如果用户没要求后台运行(命令末尾没有&号)否则shell使用waitpid()

(7)如果用户要求后台运行(如果命令末尾有&号),则shell返回;
6.3 Hello的fork历程创建过程

父历程调用fork函数创建一个新的运行的子历程,子历程得到与父历程用户级虚拟地址空间相同的(但是独立的)一份副本,包罗代码和数据短、堆、共享库以及用户栈,子历程获得与父历程任何打开文件描述符相同的副本,这就意味着当父历程调用fork()函数时,子历程可以读取父历程中打开的任何文件。子历程有不同于父历程的PID。
6.4 Hello的execve过程

Hello历程创建后调用execve函数,在当前历程的上下文中加载并运行一个新步伐。execve函数加载并运行可执行目的文件hello,且带参数列表argv和环境变量envp。只有当出现错误时,比方找不到filename,execve才会返回到调用步伐,调用成功不会返回。与fork不同,fork一次调用两次返回,execve一次调用从不返回。

6.5 Hello的历程执行

6.5.1上下文信息:上下文就是内核重新启动一个被抢占的历程所需的状态。它由一些对象的值组成,这些对象包罗通用目的寄存器、浮点寄存器、步伐计数器、用户栈、状态寄存器、内核栈和各种内核数据结构,好比描述地址空间的页表、包罗有关当前历程信息的历程表,以及包罗历程已打开文件的信息的文件表。
6.5.2 逻辑控制流:历程运行过程中PC值的序列叫做逻辑控制流。
6.5.3 历程时间片:一个历程执行它的控制流的一部门的每一时间段叫做时间片。
6.5.4调度:在历程执行的某些时候,内核可以决定抢占当前历程,并重新开始一个先前被抢占了的历程。这种决策就叫做调度(scheduling),是由内核中称为调度器(scheduler)的代码处置惩罚的。当内核选择一个新的历程运行时,我们说内核调度了这个历程。在内核调度了一个新的历程运行后,它就抢占当前历程,并使用一种称为上下文切换的机制来将控制转移到新的历程。
6.5.5上下文切换:当内核决定抢占当前历程时,必要进行上下文切换,其过程通常包罗以下三个步调: ①生存当前历程的上下文;②恢复某个先前被抢占的历程被生存的上下文;③将控制通报给这个新恢复的历程。
6.5.6 用户模式和内核模式
处置惩罚器通常使用一个寄存器提供两种模式的区分,该寄存器描述了历程当前享有的特权,当没有设置模式位时,历程就处于用户模式中, 用户模式的历程不允许执行特权指令,也不允许直接引用地址空间中内核区内的代码和数据;设置模式位时,历程处于内核模式,该历程可以执行指令集中的任 何命令,并且可以访问系统中的任何内存位置。上下文切换的时候,历程就处于内核模式。
https://i-blog.csdnimg.cn/blog_migrate/2e53009e555d45da24d7b64e08252b35.png
 
图42 上下文切换
6.5.7hello的步伐执行:
以hello作为一个独立的历程与其他历程并发执行,内核为hello维持一个上下文,在hello的某个时间片内,若内核判断它已经运行了足够长的时间,那么内核可以决定抢占hello历程,并重新开始一个之前被抢占了的历程,并使用上下文切换的机制将控制转移到新的历程,该机制具体执行分为三步:1)生存当前历程的上下文,2)恢复被抢占历程被生存的上下文,3)将控制转移给这个新的历程;如许,内核就完成了对hello与其他历程的调度。
6.6 hello的异常与信号处置惩罚

6.6.1异常:
异常可以分为四类:中断(interrupt)、陷阱(trap)、故障(fault)和终止(abort)。其属性列表如下:
类别
原因
异步/同步
返回行为
中断
来自I/O装备的信号
异步
总是返回到下一条指令
陷阱
故意的异常
同步
总是返回到下一条指令
故障
潜在可恢复的错误
同步
大概返回到当前指令
终止
不可恢复的错误
同步
不会返回

https://i-blog.csdnimg.cn/blog_migrate/209206184934a621198f74e5e21c3275.png
 
图43中断
https://i-blog.csdnimg.cn/blog_migrate/a828829ee11e7081aa6d513362971ff4.png 
图44陷阱
https://i-blog.csdnimg.cn/blog_migrate/670c5b744538e8bdcb846406739aec22.png
图45故障
https://i-blog.csdnimg.cn/blog_migrate/ffb6af2131d05388cb1e505bf2e5d5b0.png
 
图46 终止
6.6.2在hello执行过程中进行测试:

[*]不绝乱按和回车
https://i-blog.csdnimg.cn/blog_migrate/dec5247da580354c6dc0610a473429ec.png
 
图47 任意乱按
在hello执行过程中随意输入字符和回车并不会对步伐自己造成任何影响。由于shell同时只能有一个前台使命,乱按敲出的乱码被以为是命令,所有的输入会被壅闭在缓冲区中,待hello竣过后进行处置惩罚。

[*]Ctrl-Z
https://i-blog.csdnimg.cn/blog_migrate/8d0beba37f0288d95cee9662a217c436.png
图48 输入Ctrl-Z
历程收到 SIGSTP 信号,hello历程挂起。

[*]Ctrl-C
https://i-blog.csdnimg.cn/blog_migrate/a8d634564e66ac0c5eafdc07633d1f9e.png
图49 输入Ctrl-C
输入Ctrl-z历程收到 SIGINT信号,hello被终止。


[*]Ctrl-z后运行ps  jobs  pstree  fg  kill 等命令
https://i-blog.csdnimg.cn/blog_migrate/3c5dd6851da03ee71af4149d35f3dea2.png
 
图50 运行pstree命令

https://i-blog.csdnimg.cn/blog_migrate/a7b9a4f05860c975bbdfe229f49f5deb.png
 
图51 运行ps、jobs、fg、kill命令
输入ps检察当前历程的状态包罗PID
输入jobs检察被挂起的历程hello
输入fg 1 重启hello历程
输入 kill -9 和PID终止历程
再输入ps发现hello已经被杀死
6.7本章小结

本章介绍了历程的概念和作用,对Shell-bash的作用和处置惩罚流程,hello的fork历程创建过程,execve过程和历程执行过程进行了论述,并研究了异常和信号处置惩罚的过程,通过命令行检察历程的状态等。
第7章 hello的存储管理

7.1 hello的存储器地址空间

逻辑地址:逻辑地址是指在计算机体系结构中是指应用步伐角度看到的内存单元、存储单元、网络主机的地址。逻辑地址往往不同于物理地址,通过地址翻译器或映射函数可以把逻辑地址转化为物理地址。
物理地址:它是在地址总线上,以电子形式存在的,使得数据总线可以访问 主存的某个特定存储单元的内存地址。
7.2 Intel逻辑地址到线性地址的变换-段式管理

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

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

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

CPU发送一条地址,Cache组数的大小要求将PA分为CT(标记位)、CS(组号)以及CO(偏移量)。根据CS寻找到正确的组,比较每一个的标记位是否有用以及CT是否相等,如果命中就直接返回想要的数据,如果未命中,就依次去L2、L3大概主存来判断是否命中:当命中时,将数据传给CPU同时更新各级Cache
7.6 hello历程fork时的内存映射

7.7 hello历程execve时的内存映射

7.8 缺页故障与缺页中断处置惩罚

7.9动态存储分配管理

7.10本章小结

本章大部门内容没有学到,现对地址和Cach支持下的物理内存访问进行论述
第8章 hello的IO管理

8.1 Linux的IO装备管理方法

8.2 简述Unix IO接口及其函数

8.3 printf的实现分析

8.4 getchar的实现分析

8.5本章小结

本章课程中没有学到
结论

1.hello的一生:当hello.c步伐被步伐员输入电脑中后,在磁盘中静静存放,当其被执行时,P2P开始了。
2.颠末cpp预处置惩罚,修改为hello.i文本文件,ccl将hello.i编译为hello.s汇编文件,as将hello.s翻译成机器语言文本指令,最后变成了可重定位目的文件hello.o,ld将hello.o与库函数相互链接形成可执行文件hello。
3.运行hello时,在shell中输入指令,shell用fork函数创建子历程,用execve加载hello,内核通过上下文切换调度各使命的执行,遇到异常或信号触发对应的异常处置惩罚步伐。最终hello竣事一生,系统清除其步伐痕迹。实现020

在计算机系统的学习中,我深刻明白了我所在的专业到底是在研究什么东西,处置惩罚什么题目,在研究题目的过程中我解决了许多之前的困惑,在hello的一生中我探索到了步伐实现最本质的过程,这些都很有趣
附件

中心产物名及其阐明
文件名
文件作用
hello.c
源文件
hello.i
hello.c颠末预处置惩罚(cpp)后的文本文件
hello.s
hello.i颠末编译(ccl)得到的汇编文件
hello.o
hello.s颠末汇编(as)得到的可重定位目的文件
hello
hello.o与其他目的文件链接后得到的可执行目的文件
elf.txt
hello.o的elf文件
hello_elf.txt
hello的elf文件

参考文献

 Randal E. Bryant;David R. O’Hallaron. 深入明白计算机系统. 北京:机器工业出版
 readelf命令使用阐明_木虫下的博客-CSDN博客_readelf
 编译和链接的过程_douguailove的博客-CSDN博客_编译过程


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 哈尔滨工业大学步伐人生-Hello’s P2P