盘算机体系
大作业
题 目 步伐人生-Hello’s P2P
专 业 网络空间安全
学 号 2021111156
班 级 2103901
学 生 刘之弘
指 导 教 师 吴锐
盘算机科学与技能学院
2023年5月
摘 要
择要是论文内容的高度概括,应具有独立性和自含性,即不阅读论文的全文,就能得到须要的信息。择要应包罗本论文的目标、紧张内容、方法、结果及其理论与实际意义。择要中不宜利用公式、布局式、图表和非公知公用的符号与术语,不标注引用文献编号,同时制止将择要写成目次式的内容先容。
关键词:盘算机体系;关键词2;……;
本文从hello的一生(P2P,020)入手,深入先容了一个C步伐从源码到编译为可实行步伐再到作为历程完备实行的全流程,并以此为主线完备先容了盘算机体系的知识体系。
在第2、3、4、5章,我们对源代码hello.c依次举行预处理处罚、编译、汇编,链接,深入先容这些过程的目标、意义及细节,同时用代码实例举行分析。
在第6、7章,我们实行hello并探究步伐运行过程中的历程管理和内存管理,由此窥及整个盘算机体系的运行逻辑。
在跟随hello步伐走完它一生的过程中,我们也会领会到盘算机科学的精妙与优雅:既有顶层筹划的洞见构想,也有底层实行的精致筹划。
目 录
第1章 概述................................................................................................................ - 4 -
1.1 Hello简介......................................................................................................... - 4 -
1.2 环境与工具........................................................................................................ - 4 -
1.3 中央效果............................................................................................................ - 4 -
1.4 本章小结............................................................................................................ - 4 -
第2章 预处理处罚............................................................................................................ - 6 -
2.1 预处理处罚的概念与作用........................................................................................ - 6 -
2.2在Ubuntu下预处理处罚的下令............................................................................. - 6 -
2.3 Hello的预处理处罚效果分析................................................................................. - 7 -
2.4 本章小结............................................................................................................ - 7 -
第3章 编译................................................................................................................ - 8 -
3.1 编译的概念与作用............................................................................................ - 8 -
3.2 在Ubuntu下编译的下令................................................................................ - 8 -
3.3 Hello的编译效果分析..................................................................................... - 9 -
3.4 本章小结.......................................................................................................... - 12 -
第4章 汇编.............................................................................................................. - 13 -
4.1 汇编的概念与作用.......................................................................................... - 13 -
4.2 在Ubuntu下汇编的下令.............................................................................. - 13 -
4.3 可重定位目标elf格式.................................................................................. - 14 -
4.4 Hello.o的效果分析....................................................................................... - 16 -
4.5 本章小结.......................................................................................................... - 17 -
第5章 链接.............................................................................................................. - 18 -
5.1 链接的概念与作用.......................................................................................... - 18 -
5.2 在Ubuntu下链接的下令.............................................................................. - 18 -
5.3 可实行目标文件hello的格式...................................................................... - 18 -
5.4 hello的假造所在空间................................................................................... - 20 -
5.5 链接的重定位过程分析.................................................................................. - 21 -
5.6 hello的实行流程........................................................................................... - 21 -
5.7 Hello的动态链接分析................................................................................... - 22 -
5.8 本章小结.......................................................................................................... - 22 -
第6章 hello历程管理....................................................................................... - 23 -
6.1 历程的概念与作用.......................................................................................... - 23 -
6.2 简述壳Shell-bash的作用与处理处罚流程........................................................ - 23 -
6.3 Hello的fork历程创建过程......................................................................... - 25 -
6.4 Hello的execve过程..................................................................................... - 25 -
6.5 Hello的历程实行........................................................................................... - 25 -
6.6 hello的非常与信号处理处罚............................................................................... - 26 -
6.7本章小结.......................................................................................................... - 29 -
第7章 hello的存储管理................................................................................... - 30 -
7.1 hello的存储器所在空间............................................................................... - 30 -
7.2 Intel逻辑所在到线性所在的变更-段式管理............................................... - 30 -
7.3 Hello的线性所在到物理所在的变更-页式管理......................................... - 30 -
7.4 TLB与四级页表支持下的VA到PA的变更................................................ - 31 -
7.5 三级Cache支持下的物理内存访问............................................................. - 31 -
7.6 hello历程fork时的内存映射..................................................................... - 32 -
7.7 hello历程execve时的内存映射................................................................. - 33 -
7.8 缺页故障与缺页制止处理处罚.............................................................................. - 33 -
7.9动态存储分配管理.......................................................................................... - 34 -
7.10本章小结........................................................................................................ - 34 -
第8章 hello的IO管理........................................................... 错误!未界说书签。
8.1 Linux的IO装备管理方法.................................................... 错误!未界说书签。
8.2 简述Unix IO接口及其函数................................................. 错误!未界说书签。
8.3 printf的实现分析................................................................. 错误!未界说书签。
8.4 getchar的实现分析............................................................. 错误!未界说书签。
8.5本章小结................................................................................. 错误!未界说书签。
结论............................................................................................................................ - 35 -
附件............................................................................................................................ - 36 -
参考文献.................................................................................................................... - 37 -
第1章 概述
1.1 Hello简介
P2P:
hello的生命是从一个源步伐(hello.c)开始的。如许的步伐可以被直接编写出来,但不能直接实行。因此从Programme到Progress,起首必要颠末预处理处罚(Preprocessing)、编译(Compilation)、汇编(Assembly)、链接(Linking)四个阶段。链接后我们会得到可实行文件hello,用fork和exceve将其载入到内存并运行,才是真的变成了一个历程(Progress)。
020:
作为历程的hello,在最开始空空如也。利用体系会为他分配页面,将它装入内存;随后CPU从入口开始实行它的代码,它也会担当外部的输入,输出信息;它会碰到各种非常,发生制止和上下文切换;终极退出变为僵尸历程,为体系采取,竣事他的一生,不留下一片云彩。
1.2 环境与工具
Linux iZ2ze990f69tlt5qfzu7miZ 3.10.0-1160.83.1.el7.x86_64 #1 SMP Wed Jan 25 16:41:43 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-120.el7
gcc 版本 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)
1.3 中央效果
hello 可实行文件
hello.c 源文件
hello.i 预处理处罚后的天生文件
hello.s 编译后得到的汇编文件
hello1.disasm 对hello.o的反汇编效果
hello.disasm 对hello的反汇编效果
hello.o 可重定位文件
1.4 本章小结
本章简朴先容了hello.c编译和实行的大抵过程,由此大抵引入盘算机体系的知识体系。
第2章 预处理处罚
2.1 预处理处罚的概念与作用
预处理处罚的过程
- 预处理处罚器(cpp)将全部的#define删除,而且睁开全部的宏界说。
- 处理处罚全部的条件预编译指令,比如#if、#ifdef、#elif、#else、#endif等。
- 处理处罚#include预编译指令,将被包罗的文件直接插入到预编译指令的位置。
- 删除全部的解释。
- 添加行号和文件标识,以便编译时产生调试用的行号及编译错误告诫行号。
- 保存全部的#pragma编译器指令,由于编译器必要利用它们。
- 利用gcc -E hello.c -o hello.i下令来举行预处理处罚, 预处理处罚得到的另一个步伐通常是以.i作为文件扩展名。
预处理处罚的意义
预处理处罚一样寻常是指在步伐源代码被翻译为目标代码的过程中,天生二进制代码之前的过程。范例地,由预处理处罚器(preprocessor)对步伐源代码文本举行处理处罚,得到的效果再由编译器核心进一步编译。
如允许以大概做方便步伐员编写代码,进步代码的复用性和可维护性。
2.2在Ubuntu下预处理处罚的下令
gcc -E hello.c -o hello.i
2.3 Hello的预处理处罚效果分析
预处理处罚效果(部门):
2.4 本章小结
纵览整个hello.i,可以发现前面99%的内容都是被include的库文件,末了是原来的hello.c代码。hello.c较简朴,代码部门没有发生厘革。
第3章 编译
3.1 编译的概念与作用
编译的概念
编译器将原始步伐(source program)作为输入,翻译产生利用目标语言(target language)的等价步伐。在这里便是用上一个阶段预处理处罚后的hello.i作为输入,将其翻译成汇编语言。在这个过程中还大概发现原步伐的语法错误。
编译的作用:
- 词法分析:扫描器(Scanner)将源代的字符序列分割成一系列的暗号(Token)。lex工具可实现词法扫描。
- 语法分析:语法分析器将暗号(Token)产生语法树(Syntax Tree)。yacc工具可实现语法分析(yacc: Yet Another Compiler Compiler)。
- 语义分析:静态语义(在编译器可以确定的语义)、动态语义(只能在运行期才气确定的语义)。
- 源代码优化:源代码优化器(Source Code Optimizer),将整个语法书转化为中央代码(Intermediate Code)(中央代码是与目标呆板和运行环境无关的)。中央代码使得编译器被分为前端和后端。编译器前端负责产生呆板无关的中央代码;编译器后端将中央代码转化为目标呆板代码。
- 目标代码天生:代码天生器(Code Generator).
- 目标代码优化:目标代码优化器(Target Code Optimizer)。
3.2 在Ubuntu下编译的下令
gcc -S hello.i -o hello.s
3.3 Hello的编译效果分析
3.3.1 常量
包罗printf的模板字符串和整数4。
对于前者,编译器将起放在.rodata中:
对于后者,直接作为立刻数写在汇编代码中。
3.3.3 全局变量
直接标明,如main函数
3.3.3 局部变量
大概在寄存器里,也大概在栈中。这里以i为例,i被存放在了栈中。
int i;
for (i=0;i<8;i++)
3.3.5 赋值
赋值运算在“局部变量”中出现过,不再赘述。
3.3.8 算术利用
算术利用在“局部变量”中出现过,不再赘述。
3.3.10 关系利用
关系利用在“局部变量”中出现过,不再赘述。
3.3.11 数组、指针
数组或指针在hello中以argv和指向string常量的指针的情势出现。argv在“函数”中叙述,本节举例分析后一种。
这里movl $.LC0, %edi将前面提过的字符串常量了存入%edi中,具体来说是以指针的情势,指向标签.LC0。随后,%edi作为参数,被函数puts利用,输出到stdout中。
3.3.12 控制转移
控制转移在前面多次出现过,比方“局部变量”中的for循环里,假如i<8,就继承跳转到循环体,假如该条件不建立就竣事循环,继承实行背面的代码。
3.3.13 函数
main函数被调用时吸取了两个参数,argc位于%edi中,argv位与%rsi中。可以看到编译器起首将它们存在了栈中,随后比力argc与立刻数4,用比力效果举行条件跳转。这对应hello.c中“假如argc不为4就输出提示并退出步伐”的逻辑。argv中的各个指针对应的参数后续也被放在寄存器中,传给printf利用。
3.4 本章小结
编译器将C语言代码翻译成了汇编语言,根据优化品级差异也陪伴着差异水平的逻辑改动。本章对各种数据与利用的细节作了举例分析。
第4章 汇编
4.1 汇编的概念与作用
呆板语言可以被呆板直接实行,但难以辨别和影象,且可移植性欠好。于是便产生了汇编语言,步伐员通过汇编代码编写步伐,通过汇编编译器,终极还是转化为呆板语言,终极让盘算机实行。
汇编就是将汇编语言转换成呆板语言的过程。
4.2 在Ubuntu下汇编的下令
gcc -c hello.s -o hello.o
4.3 可重定位目标elf格式
ELF文件的根本格式
ELF头给出了一些根本信息,如版本、入口点所在、头巨细等。
.symtab界说了步伐中的符号表。符号表中存放了所在必要分析的符号信息,包罗main函数、调用的puts和printf、exit等函数。
.rela.text一节存放了.text中的重定位信息,在链接时这一节会起作用。偏移量指示了必要被重定位的符号相对于.text节起始位置的隔断。范例有两种,PC相对(PC32)和绝对定位(32)。这些信息会被用于盘算终极的指令利用数。。
4.4 Hello.o的效果分析
利用 objdump -d -r hello.o > hello.disasm 对hello.o举行反汇编
反汇编得到的代码与hello.s中的汇编代码根本划一,区别在反汇编代码中不再有跳转标签,而是利用所在跳转、寻址。如今(链接之前)代码中的跳转所在都是全0,但包罗在.rel.text中的相对寻址信息也被一并表如今下方了。
4.5 本章小结
本章对汇编和反汇编的效果举行了一个概览,重点会合在汇编时的相对寻址部门。
第5章 链接
5.1 链接的概念与作用
汇编后得到的可重定位文件只包罗hello.c自己的信息,想要得到可实行步伐还必要可以大概调用此中include的库函数的信息。链接器分析多个原文件中的符号并举行重定位,终极得到一个拼接起来的可实行步伐。
5.2 在Ubuntu下链接的下令
利用ld的链接下令
5.3 可实行目标文件hello的格式
与hello.o差异,hello的所在不再从0开始,而是从0x400000开始。
5.4 hello的假造所在空间
发现所在空间确实是从0x400000开始的。如许做是为了包管空指针可以触发访问缺失页的非常SIGSEGV,而不是访问了不应访问的资源从而导致了奇奇怪怪的题目。0x400000也就是4MB,是x86-64假造内存最大的页巨细,也就是说内存从这里开始,可以大概包管刚好空出来一个页。
5.5 链接的重定位过程分析
objdump -d -r hello 对hello反汇编
(部门效果)
起首是比对hello.o的反汇编效果长了很多,由于链接进了库文件。
这次的反汇编效果中增长了.init和.fini段的代码,这两段代码紧张是编译器增长的代码段。
.text段增长了_start入口和一些其他函数,_start入口在C语言运行时被动态库添加,是步伐真正的入口点。
增长了.plt(过程链接表)段,这些段通过访问GOT来得到动态库中目标函数的所在。
5.6 hello的实行流程
利用edb实行hello,分析从加载hello到_start,到call main,以及步伐制止的全部过程。请列出其调用与跳转的各个子步伐名或步伐所在。
_start函数:0x004010f0
main: 0x004005b0
printf: 0x00400540
atoi: 0x00400580
sleep: 0x004005a0
getchar: 0x00400560
5.7 Hello的动态链接分析
dl_init前
dl_init后
可以发现有部门内存空间发生厘革,这是动态链接延长绑定的过程中,GOT表中的所在徐徐被添补。GOT是数据段的一部门,而PLT是代码段的一部门。编译器在数据段的开头创建了全局偏移表(GOT),在加载时,动态链接器重新定位GOT中的每个条目,使其包罗目标的精确绝对所在。被可实行步伐调用的每个库函数都有自己的PTL条目,每个条目负责调用一个特定的函数。
5.8 本章小结
本章分析了链接的过程,探究了起始所在设置的逻辑、链接前后的厘革、动态链接的过程。
第6章 hello历程管理
6.1 历程的概念与作用
狭义界说:历程是正在运行的步伐的实例
广义界说:历程是一个具有肯定独建功能的步伐关于某个数据聚集的一次运行运动。它是利用体系动态实行的根本单位,在传统的利用体系中,历程既是根本的分配单位,也是根本的实行单位。
历程是由历程控制块、步伐段、数据段三部门构成
从理论角度看,是对正在运行的步伐过程的抽象;
从实现角度看,是一种数据布局,目标在于清晰地描画动态体系的内在规律,有用管理和调理进入盘算机体系主存储器运行的步伐。
6.2 简述壳Shell-bash的作用与处理处罚流程
Shell 是指一种应用步伐,这个应用步伐提供了一个界面,用户通过这个界面访问利用体系内核的服务。
1. 将下令行分成由 元字符(meta character) 分隔的 暗号(token):
元字符包罗 SPACE, TAB, NEWLINE, ; , (, ), <, >, |, &
暗号的范例包罗单词,关键字,I/O重定向符和分号。
2. 检测每个下令的第一个暗号,看是否为不带引号或反斜线的关键字。假如是一个 开放的关键字,如if和其他控制布局起始字符串,function,{或(,则下令实际上为一复合下令。shell在内部对复合下令举行处理处罚,读取下一个命 令,并重复这一过程。假如关键字不是复合下令起始字符串,而是如then等一个控制布局中央出现的关键字,则给出语法错误信号。
3. 依据别名列表查抄每个下令的第一个关键字。假如找到相应匹配,则更换其别名界说,并退回第一步;否则进入第4步。
4. 实行大括号扩展,比方a{b,c}变成ab ac
5. 假如~位于单词开头,用$HOME更换~。利用usr的主目次更换~user。
6. 对任何以符号$开头的表达式实行参数(变量)更换
7. 对形如$(string)大概`string` 的表达式举行下令更换
这里是嵌套的下令行处理处罚。
8. 盘算情势为$((string))的算术表达式
9. 把行的参数更换,下令更换和算术更换 的效果部门再次分成单词,这次它利用$IFS中的字符做分割符而不是步调1的元字符集。
10. 对出现*, ?, [ ]对实行路径名扩展,也称为通配符扩展
11. 按下令优先级表(跳过别名),举行下令查寻。先作为一个特别的内建下令,接着是作为函数,然后作为一样寻常的内建下令,末了作为查找$PATH找到的第一个文件。
12. 设置完I/O重定向和其他利用后实行该下令。
6.3 Hello的fork历程创建过程
当fork函数被当前hello历程调用时,内核为新hello历程创建各种数据布局,并分配该历程一个唯一的pid。为子历程分配假造内存时,会赋予其一个和父历程共享的假造内存。其属性被标志为只读和私有的写时复制。
6.4 Hello的execve过程
- 删除已经存在的用户地区。删除当进步程假造所在的用户部门中的内容。
- 映射私有地区,要为hello的代码,数据,bss和栈区创建新的布局。这些布局都是私有/写时复制的。此中,代码和数据来自a.out文件的.text和.data地区。Bss,栈,堆则哀求二进制零地区。
- 映射共享地区。在这个例子中,hello中必要创建一个共享到标准C库的共享地区。当hello调用到标准C库中的对象时。延时动态链接器必要举行到libc.so的动态链接。
- 设置步伐计数器,统统都载入完毕以后,PC必要指向_start入口。
6.5 Hello的历程实行
联合历程上下文信息、历程时间片,叙述历程调理的过程,用户态与核心态转换等等。
上下文:
上下文就是内核重新启动一个被抢占的历程所需的状态。它由一些对象的值构成,包罗通用的目标寄存器、浮点寄存器、步伐计数器、用户栈、状态寄存器、内核栈和各种内核数据布局(历程表和文件表)。
时间片:
时间片由利用体系内核的调理步伐分配给每个历程。起首,内核会给每个历程分配相称的初始时间片,然后每个历程轮番地实行相应的时间,当全部历程都处于时间片耗尽的状态时,内核会重新为每个历程盘算并分配时间片,云云往复。
历程调理:
就是先把前一个任务的 CPU 上下文(也就是 CPU 寄存器和步伐计数器)生存起来,然后加载新任务的上下文到这些寄存器和步伐计数器,末了再跳转到步伐计数器所指的新位置,运行新任务。
而这些生存下来的上下文,会存储在体系内核中,并在任务重新调理实行时再次加载进来。如许就能包管任务原来的状态不受影响,让任务看起来还是一连运行。
从历程A切换到历程B时,历程A初始运行在用户态中,直到它由于某些缘故原由陷入内核。内核此时实行历程A到历程B的上下文切换,在切换的第一部门中,内核代表历程A在内核态下实行指令,然后在某一时候,它代表历程B在用户模式下实行指令。
6.6 hello的非常与信号处理处罚
非常有4类:
制止:是来自外部I/O装备的信号,如鼠标键盘等。
故障:由错误环境引起,如缺页非常,大概被修复,也大概无法规复并制止历程。
制止:不可规复的错误,如内存数据破坏,会强行制止历程。
陷阱:是故意的,通过指令产生的非常,通常以体系调用的方式出现。
Ctrl-Z(发送SIGSTP) > ps(查察历程) > jobs(查察任务)
pstree
fg (发送SIGCONT,继承实行了背面的内容)
背景运行+kill(发送了SIGKILL信号,欺压杀死历程)
Ctrl+C(发送SIGINT信号,制止历程)
6.7本章小结
本章分析了历程实行和切换的过程,并用下令行实例实践了通过信号对历程举行控制。
第7章 hello的存储管理
7.1 hello的存储器所在空间
逻辑所在:
在有所在变更功能的盘算机中,访问指令给出的所在 (利用数) 叫逻辑所在,也叫相对所在。要颠末寻址方式的盘算或变更才得到内存储器中的物理所在。逻辑所在由两个16位的所在分量构成,一个为段基值,另一个为偏移量。两个分量均为无符号数编码。
线性所在:
线性所在(Linear Address)是逻辑所在到物理所在变更之间的中央层。在分段部件中逻辑所在是段中的偏移所在,然后加上基所在就是线性所在。
假造所在:
在掩护模式下,步伐在假造内存中运行。假造内存被构造成一个存储在磁盘上的N个一连的字节巨细的单位阵列。每个字节都有一个唯一的假造所在,作为数组的索引。假造所在由VPO(假造页偏移)、VPN(假造页号)、TLBI(TLB索引)和TLBT(TLB标签)构成。
物理所在:
物理内存的真实的所在,即可以通过所在线举行精确访问的所在。
7.2 Intel逻辑所在到线性所在的变更-段式管理
段式管理分为实模式和和掩护模式:
实模式:逻辑所在满足CS:EA=EA+16*CS;
掩护模式:辑所在包罗一个段标识符和一个段偏移。利用段标识符作为下标,进入索引的段形貌符表,假如T1=0,则索引全局段形貌符表(GDT),假如T1=1,则索引局部段形貌符表(LDT)。段形貌符表中的段所在(基数字段)被添加到段偏移量中,这就是线性所在。
7.3 Hello的线性所在到物理所在的变更-页式管理
一个假造所在由一个假造页号(VPN)和一个假造页偏移量(VPO)构成,页表由有用位和一个物理页号构成。VPN作为页表的索引,用于在页表中找到相应的PTE,PTE指示了物理所在(PA)。
7.4 TLB与四级页表支持下的VA到PA的变更
多级页表仍然是通过VPN探求PTE,区别在于前三级页表指向下一级页表的物理基所在,第四级页表指向物理所在。
7.5 三级Cache支持下的物理内存访问
利用物理所在依次读取一级、二级、三级Cache,假如上一级掷中就直接返回效果,假如没有掷中继承向下读。假如三级Cache都没有掷中,就必要读取主存,同样是利用物理所在。
7.6 hello历程fork时的内存映射
当 fork 函数被当进步程调用时,内核为新历程创建各种数据布局,并分配给它一个唯一的 PID。为了给这个新历程创建假造内存,它创建了当进步程的 mm_struct、地区布局和页表的原样副本。它将两个历程中的每个页面都标志为只读,并将两个历程中的每个地区布局都标志为私有的写时复制。
当 fork 在新历程中返回时,新历程如今的假造内存刚好和调用 fork 时存在的假造内存雷同。当这两个历程中的任一个厥后举行写利用时,写时复制机制就会创建新页面,因此,也就为每个历程保持了私有所在空间的概念。
7.7 hello历程execve时的内存映射
加载并运行 hello 必要以下几个步调:
- 删除已存在的用户地区(布局)。
- 映射私有地区。为新步伐的代码、数据、bss 和栈地区创建新的地区布局,都是私有、写时复制的。bss 地区是哀求二进制零的,映射到匿名文件,其巨细包罗在 hello 中的。栈和堆地区也是哀求二进制零的,初始长度为零。
- 映射共享地区。共享库中的对象必要动态链接到这个步伐,然后再映射到用户假造所在空间中的共享地区内。
- 设置步伐计数器。实行的末了一件事变就是设置当进步程上下文中的步伐计数器,使之指向代码地区的入口点。
Linux 历程可以利用 mmap 函数来创建新的假造内存地区,并将对象映射到这些地区中。
7.8 缺页故障与缺页制止处理处罚
内核的缺页处理处罚步伐:
- 假造所在 A 正当吗?(A 在某个地区布局界说的地区内吗?)
缺页处理处罚步伐必要搜索地区布局的链表,把 A 和每个地区布局中的 vm_start 和 vm_end 做比力,假如不正当就触发一个段错误,从而制止这个历程(如图中的「1」)。
由于一个历程可以创建恣意数目的新假造内存地区(利用之后形貌的 mmap 函数),以是次序搜索花销很大。因此在实际中,Linux 利用某些这里没有表现出来的字段,在链表中构建了一棵树,并在这棵树上举行查找。
- 试图举行的内存访问正当吗?(历程是有读写这个地区内页面的权限?)
假如试图举行的访问是不正当的,那么缺页处理处罚步伐会触发一个掩护非常,从而制止这个历程,如图中的「2」。
- 此时,内核知道了这个缺页是由于对正当的假造所在举行正当的利用造成,它将选择一个断送页面,假如其被修改过,那么就将它交换出去,换入新的页面并更新页表。当缺页处理处罚步伐返回时,CPU 重新启动引起缺页的指令,这条指令将再次发送 A 到 MMU。
7.9动态存储分配管理
动态内存分配器维护着一个历程的假造内存地区,称为堆(heap)。体系之间细节差异,但不失通用性。假设堆是一个哀求二进制零的地区,它紧接在未初始化的数据地区后开始,并向上生长(向更高所在)。对于每个历程,内核维护者一个变量 brk(读「break」),它指向堆的顶部。
分配器将堆视为一组差异巨细的块(block)的聚集来维护。每个块就是一个一连的假造内存片(chunk),要么是已分配的,要么是空闲的。内存开释要么是应用步伐显式实行,要么是内存分配器自身隐式实行。
分配器有两种根本风格:
- 显式分配器(explicit allocator):C 步伐通过调用 malloc 函数来分配一个块,并通过调用 free 函数来开释一个块(雷同于 C++ 的 new 和 delete 关键字)。
- 隐式分配器(implicit allocator):也叫做垃圾网络器(garbage collection),诸如 Lisp、ML 以及 Java 之类的高级语言就依赖垃圾网络来开释已分配的块。
分配器的两个性能目标:最大化吞吐率和最大化内存利用率。
7.10本章小结
本章对历程实行过程中的内存访问与利用过程举行了一个全方位的梳理。Cache办理CPU与主存的速率差异题目,假造内存办理主存与磁盘的存储容量题目,与此同时利用体系对于内存的分配和利用也有很多细节,以上这些共同作育了当代盘算机良好的运行速率。
结论
hello虽小,五脏俱全;它所履历的一生,也是全部步伐/历程会履历的一生。管中窥豹,见微知著,信任对hello的学习可以大概为我们其他编程实践提供资助,乃至对改变更大天下的巨大工作具有代价。
- 预处理处罚,做简朴的文本处理处罚,编译控制,宏,头文件的包罗。
- 编译,通过编译器,将源代码转化成等价的汇编语言形貌。
- 汇编,将汇编语言翻译成呆板码(实际上是目标文件)。
- 链接,处理处罚外部符号的引用,将多个可重定位目标文件毗连成一个可实行目标文件。
- 加载,在shell中键入下令,shell通过fork创建子历程,子历程通过execve把hello加载进内存。
- 运行,hello担当内核的调理,在自己的时间片上运行。
- 竣事,被体系制止,清算资源,由父历程采取。
附件
hello 可实行文件
hello.c 源文件
hello.i 预处理处罚后的天生文件
hello.s 编译后得到的汇编文件
hello1.disasm 对hello.o的反汇编效果
hello.disasm 对hello的反汇编效果
hello.o 可重定位文件
参考文献
[1] 林来兴. 空间控制技能[M]. 北京:中国宇航出书社,1992:25-42.
[2] 辛希孟. 信息技能与信息服务国际研讨会论文集:A集[C]. 北京:中国科学出书社,1999.
[3] 赵耀东. 新期间的工业工程师[M/OL]. 台北:天下文化出书社,1998 [1998-09-26]. http://www.ie.nthu.edu.tw/info/ie.newie.htm(Big5).
[4] 谌颖. 空间交会控制理论与方法研究[D]. 哈尔滨:哈尔滨工业大学,1992:8-13.
[5] KANAMORI H. Shaking Without Quaking[J]. Science,1998,279(5359):2063-2064.
[6] CHRISTINE M. Plant Physiology: Plant Biology in the Genome Era[J/OL]. Science,1998,281:331-332[1998-09-23]. http://www.sciencemag.org/cgi/ collection/anatmorp.
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
|