马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
盘算机体系
大作业
题 目 步伐人生-Hello’s P2P
专 业 未来技能
学 号 2021112476
班 级 21WL026
学 生 王俊喆
指 导 教 师 吴锐
盘算机科学与技能学院
2023年5月
摘 要
本文从预处置惩罚,编译,汇编,链接,历程管理,储存管理6个方面,深刻而全面地概述了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简介
1.1.1 hello的P2P
所谓P2P,即programme To(英文谐音数字2 Two) progress。
hello的P2P流程体现图如下图所示。
图1.1 hello的P2P流程
此中hello.c依次变为了hello.i, hello.s, hello.o,以及hello(即可实行文件)。
变为hello.i的部分由预处置惩罚器(cpp)完成,变为hello.s的部分由编译器(ccl)完成,变为hello.o的部分由汇编器(Id)完成,末了变为可实行文件的过程由链接器(as)完成。
1.1.2 hello的O2O
所谓O2O 即Zero-O To Zero-O。
在shell中发出实行的指令后,起首由fork()函数加载历程,再由execve()函数加载hello的数据等等。运行竣事后,hello由父历程接纳,今后hello就不复存在了。
1.2 情况与工具
软件情况:Windows10 64位;Vmware11,ubuntu16.04。
硬件情况:X64 CPU;2GHz;2G RAM;256GHD Disk。
开辟工具:开辟与调试工具:Visual Studio 2019;CodeBlocks 64位;vim;gcc;gdb;edb。
1.3 中心结果
hello.c: hello的源文件。
hello.i:颠末预处置惩罚后产生的文件。
hello.s:颠末编译后产生的文件,包罗一个汇编语言步伐。
hello.o:颠末汇编后产生的文件,是一个二进制可重定位文件。
hello:颠末链接后产生的可实行目的文件。
hello.elf.text:hello.产生的elf文件。
hellooasm..text:hello.反汇编后产生的文件。
hello.text:hello产生的elf文件。
1.4 本章小结
hello的P2P和020是hello的缩影写照。代表了hello的一生阅历。
(第1章0.5分)
第2章 预处置惩罚
2.1 预处置惩罚的概念与作用
2.1.1预处置惩罚的概念:
预处置惩罚是对源文件编译之前所做的准备工作,是盘算机在处置惩罚一个步伐时所举行的第一步处置惩罚,可以举行代码文本的更换工作但是不会做语法查抄。
预处置惩罚可以或许对源步伐文件中出现的以#开头的下令举行处置惩罚,包罗宏界说#define,文件包罗#include,条件编译#if,#else,#elif,#ifdef,等,末了将修改之后的文本举行生存,将源步伐以及引用的库归并成完备的文件,末了得到了另一个以.i作为文件扩展名的步伐。
2.2.2预处置惩罚的作用:
预处置惩罚的作用是从体系的头文件包中将头文件的源码插入到目的文件中,在编译代码前起首将标识符更换好,确保步伐的完备性,天生.i文件后再举行接下来的编译工作。
2.2在Ubuntu下预处置惩罚的下令
下令行:gcc -E hello.c -o hello.i
远程登录假造机,然后对hello.c举行预处置惩罚。
图2.1 预处置惩罚下令行
预处置惩罚天生文件为hello.i。
2.3 Hello的预处置惩罚结果分析
利用 vim hello.i下令打开.i文件查察。
图2.2 vim进入i文件
可以发现,文件非常长。
截取其一部分举行分析。
图2.3 i文件
此中第一部分是对于.h头文件的引入,寻址和睁开。
图 2.4 2.5 .i文件
接下来是对于头文件中干系宏界说的睁开。比方typedef enum布局的界说也都在这一部分。
图2.6 i文件
以及对于extern对外部变量的引用,对引用目次的标注。
图2.7 i文件
文件的末了是C步伐源代码部分。
2.4 本章小结
本章分析了从hello.c到hello.i预处置惩罚的过程,并展现了预处置惩罚文件的内容范例。
(第2章0.5分)
第3章 编译
3.1 编译的概念与作用
编译将hello.i翻译成hello.s.编译是对预处置惩罚文件举行词法分析,语法分析,语义分析,优化,转化为汇编语言步伐.
1.词法分析:输入源步伐,对构成源步伐的字符串举行扫描和分解,辨认出一个个的单词
2.语法分析:在词法分析的底子上,根据语言的语法规则,把单词符号串分解成各类语法单位
3.词义分析与中心代码的产生:对语法分析所辨认出的各类语法范畴,分析其寄义,并举行开端翻译(产生中心代码).
4.优化:优化的任务在于对前段产生的中心代码举行加工变更,以期在末了阶段能产生出更为高效(省时间和空间)的目的代码.
5.目的代码的天生:把中心代码(或经优化处置惩罚之后)变更成特定呆板上的低级语言代码。这阶段实现了末了的翻译,它的工作有赖于硬件体系布局和呆板指令寄义。
3.2 在Ubuntu下编译的下令
下令行:gcc -S hello.c -o hello.s
图 3.1 下令行
先收支q!退出hello.i 然后输出下令行天生 hello.s。
图3.2 下令行
3.3 Hello的编译结果分析
hello.s文件内容如下图所示。
图3.3 3.4 编译结果
3.3.1数据
3.3.1.1 字符常量
对应5-11行的汇编代码。
LC0 LC1对应着两串字符 “用法:Hello 学号 姓名 秒数!\n”以及“Hello %s %s\n”,即为print函数里的常量。
.text即为步伐的代码段;.rodata声明只读;.align8声明以8个字节的倍数对齐。
3.3.1.2 局部变量
对应31-33行汇编代码。
将立刻数0移到-4(%rsp),即为将变量i赋值0。
3.3.1.3 函数参数
对应22-23汇编代码。与局部变量雷同,函数参数也储存在栈中,返回后开释。22 23行分别对应int 和 char 范例的两个参数。
3.3.2 表达式
3.3.2.1 算术表达式
对应53行代码。即为i自增1。
3.3.2.2 赋值表达式
对应32行代码。由mov指令来完成赋值。
3.3.2.3 判断、跳转 控制转移
对应24、25行。
Cmp指令对比两个值,根据结果跳转。
若argc !=4 则跳转到.L2的标志。
3.3.3 数组利用
对应34-40行。所示为一个字符数组,以堆栈情势储存。%rbp为其首所在。
3.3.4 函数利用
3.3.4.1 参数
对应22-23汇编代码。与局部变量雷同,函数参数也储存在栈中,返回后开释。22 23行分别对应int 和 char 范例的两个参数。
步伐中参数小于6个。故用寄存器通报之。
3.3.4.2 函数调用
对应45行代码。通报好参数之后,用call调用函数。45行调用的即为printf函数打印字符串。
3.3.4.3函数返回
对应61行代码。用ret返回函数。返回值存在寄存器%rax里。
3.4 本章小结
本章先容了hello.i编译得到hello.s的过程,并从数据,表达式,数组指针体现,函数利用等方面先容了hello.s这一汇编语言步伐。
(第3章2分)
第4章 汇编
4.1 汇编的概念与作用
4.1.1概念:汇编是指从 .s 到 .o 即编译后的文件到天生呆板语言二进制步伐的过程,汇编器(as)将.s汇编步伐翻译成呆板语言并将这些指令打包成可重定目的步伐的格式存放在.o目的文件中,.o 文件是一个二进制文件,它包罗步伐的指令编码。
4.1.2作用:将汇编语言翻译成呆板语言,使其在链接后可以或许被呆板辨认并实行。
4.2 在Ubuntu下汇编的下令
as hello.s -o hello.o
图4.1 编译下令
4.3 可重定位目的elf格式
图4.2 4.3 进入elf下令行
vim 进入可重定位目的文件,其内容如下:
图4.4elf文件内容
图 4.5elf文件内容
分析之 elf文件分为以下几部分:
4.3.1 节头部表
.text:步伐的呆板代码
.rela.text:一个text节中位置的列表,当毗连器把这个目的文件和其他文件组适时,须要修改这些位置
.data:已经初始化的全局变量和静态c变量
.bss:未初始化的全局变量和静态c变量,以及初始化为0的全局变量和静态c变量
.comment:包罗版本控制信息
.note:包罗表明信息,有独立的格式
.symtab:一个符号表,它存放在步伐中界说和引用的函数和全局变量的信息
.strtab:一个字符串表,此中包罗.symtab和.debug中的符号表,以及节头部中的节名字
.shstrtab:包罗节区的名称
4.3.2重定位条目
其包罗要被修改引用的节偏移,符号索引信息重定位范例,符号值,符号名称—加数。
4.3.3 符号表
name是字符串表中的字节偏移,指向符号的以null末了的字符串名字。value是符号的所在。
4.4 Hello.o的结果分析
objdump -d -r hello.o 分析hello.o的反汇编,并请与第3章的 hello.s举行对照分析。
分析呆板语言的构成,与汇编语言的映射关系。特别是呆板语言中的利用数与汇编语言不同等,特别是分支转移函数调用等。
4.5 本章小结
本章论述了汇编的流程。颠末此流程,汇编代码转化为呆板语言,其转化的可重定位目的文件可以给链接阶段提供告急的信息。
(第4章1分)
第5章 链接
5.1 链接的概念与作用
5.1.1链接的概念:链接是将各种代码和数据片断网络并组合成一个单一文件的过程,这个文件可以被加载到内存并实行。
5.1.2链接的作用:链接器在软件开辟过程中扮演着一个关键的脚色,由于它们使得分离编译成为大概。我们不消将一个大型的应用步伐构造为一个巨大的源文件,而是可以把它分解为更小、更好管理的模块,可以独立地修改和编译这些模块。当我们改变这些模块中的一个时,只需简朴地重新编译它,并重新链策应用,而不必重新编译别的文件。
5.2 在Ubuntu下链接的下令
图5.1 下令行
5.3 可实行目的文件hello的格式
图 5.2 下令行
图5.3-5.7文件内容
5.3.1 EFL头
可以看到节头部表也和hello.o的很相似。
多出来的部分节:
.interp:该段决定了动态链接器在利用体系当中的位置.该段生存了一个字符串,这个字符串就生存了所需动态链接器的位置。
.dynamic:该段生存了动态链接器所须要的根本信息。
.dynsym:该段生存了与动态链接干系的符号,该符号表中记载了动态链接符号在动态符号字符串表中的偏移。
.dynstr:该段是.dynsym段的辅助段.
.rel.dyn:对数据引用的修正,其所修正的位置位于 “.got”以及数据段。
.rel.plt:对函数引用的修正,其所修正的位置位于 “.got.plt”。
5.3.2. 符号表
分别为hello的动态符号表和符号表,比hello.o多了一个动态符号表。
存放了在步伐中界说和引用的函数和全局变量的信息。
而且函数名被更换为更加具体的内容。
5.3.3 重定位信息
相比与hello.o多出来了一个.rela.dyn节,存放和动态链接干系的信息,是对于数据引用的修正。
别的,步伐的函数酿成了雷同@GLIBC_2.2.5+0的情势,分析其在干系的库中找到了这个函数,是对于函数的修正。
5.4 hello的假造所在空间
edb –run ./hello
图5.8 edb
图5.9 edb\
- .init节:从0x401000开始,偏移量为0x1000。
- .text 节 从0x4010f0开始 偏移0x10f0。
- .fini节 从0x4011c0 开始偏移0x11c0。
- .data节 步伐无全局变量 故为0。
5.5 链接的重定位过程分析
图5.10 重定位后的文件内容
其与hello.o的差别之处有以下几点:
5.5.1 代码起始位置
与hello.o的0相比,hello.o代码从0x401000开始。
5.5.2 汇编代码
除了main函数外,增长了其他函数,这些都是通过链接的重定位过程添加进来的。
5.5.3所在
函数跳转时,接纳的是假造所在。这也是重定位后的结果。
同样,静态字符串的位置也被具体标志出来了(而不是0x0(%rip))。
5.5.4 代码长度
代码长度显着变长。
重定位过程:
起首重定位节和符号界说,毗连器将全部雷同范例的节归并为同一范例的新的节,然后将运行内存所在赋给这个新的节和输入模块界说的每个节以及输入模块界说的每个符号;然后依靠毗连器修改代码节和数据节中对每个符号的引用,使之指向准确的运行所在。
5.6 hello的实行流程
-2.27.so!_dl_start 0x7fce 8cc38ea0
ld-2.27.so!_dl_init 0x7fce 8cc47630
hello!_start 0x400500
libc-2.27.so!libc_start_main 0x7fce 8c867ab0
-libc-2.27.so!__cxa_atexit 0x7fce 8c889430
-libc-2.27.so!__libc_csu_init 0x4005c0
hello!_init 0x400488
libc-2.27.so!_setjmp 0x7fce 8c884c10
-libc-2.27.so!_sigsetjmp 0x7fce 8c884b70
–libc-2.27.so!__sigjmp_save 0x7fce 8c884bd0
hello!main 0x400532
hello!puts@plt 0x4004b0
hello!exit@plt 0x4004e0
*hello!printf@plt –
*hello!sleep@plt –
*hello!getchar@plt –
ld-2.27.so!_dl_runtime_resolve_xsave 0x7fce 8cc4e680
-ld-2.27.so!_dl_fixup 0x7fce 8cc46df0
–ld-2.27.so!_dl_lookup_symbol_x 0x7fce 8cc420b0
libc-2.27.so!exit 0x7fce 8c889128
5.7 Hello的动态链接分析
图5.11 毗连前
链接前为空。
图5.12 链接后
链接后产生内容,分析链接乐成。
5.8 本章小结
本章概述了链接器举行链接的过程。
(第5章1分)
第6章 hello历程管理
6.1 历程的概念与作用
6.1.1历程的概念
历程是一个具有独建功能的步伐关于某个数据聚集的一次运行活动。它可以申请和拥有体系资源,是一个动态的概念,是一个活动的实体。它不光是步伐的代码,还包罗当前的活动,通过步伐计数器的值和处置惩罚寄存器的内容来体现。
6.1.2 历程的作用
历程的作用:历程是盘算机科学中最深刻、最乐成的概念之一。它令我们得到一种假象:我们的步伐似乎是体系中当前运行的唯一的步伐一样;我们的步伐似乎是独占地利用处置惩罚器和内存;处置惩罚器似乎是不停止地实行着指令;我们步伐中的代码和数据似乎是体系内存中唯一的对象。
6.2 简述壳Shell-bash的作用与处置惩罚流程
6.2.1 shell的作用
shell是一个高级步伐计划语言编写的步伐,它是用户利用linux的桥梁。它既是一种应用,也是一种步伐计划语言。这种应用步伐提供了一个界面,用户通过这个界面访问利用体系的内核服务。
6.2.2shell处置惩罚流程
1.从终端读入输入的下令。
2.将输入的字符串切分从而得到全部的参数。
3.假如下令为内置下令则立刻实行,否则调用相应步伐为其分配子历程并运行。
4.Shell会随时吸取键盘传来的信号并对其处置惩罚。
6.3 Hello的fork历程创建过程
终端步伐通过调用fork()函数创建一个子历程,子历程得到与父历程完全雷同但是独立的一个副本,包罗代码段、段、数据段、共享库以及用户栈。
6.4 Hello的execve过程
创建新历程后在新历程中调用execve函数会在当进步程中加载并运行包罗在可实行文件hello.out中的步伐。
加载并运行hello.out须要以下几个步调。
1.删除已存在的用户地区,即删除当进步程假造所在的用户部分中的已存在的地区布局。
2.映射私有地区,为新步伐的diamante,数据,bss和栈地区创建新的地区布局,这些新的地区均为私有的,写时复制的。
3.映射共享地区,即与hello.out链接的共享对象(如尺度C库libc.so),它们都是动态链接到这个步伐的,然后再映射到用户假造所在空间中的共享地区内。
4.设置步伐计数器(PC),设置当进步程上下文中的步伐计数器,使之指向代码地区的入口点。
6.5 Hello的历程实行
历程调理可以分为三个阶段:历程切换、上下文规复和用户态/核心态的转换。这三个阶段之间没有明白的边界,它们通常是同时举行的,并在某些情况下可以通过优化来归并成一个步调。
6.5.1历程切换:当利用体系决定让另一个历程利用cpu时,起首要切换到该历程的上下文。这包罗生存当进步程的寄存器状态、堆栈指针以及步伐计数器等信息,并还原大概更新被调入历程生存的上下文。
6.5.2上下文规复:一旦目的历程的上下文切换完成,利用体系会开始实行上下文规复利用,这意味着它会将寄存器和内存变量的值设置为准确的副本,复位再重新启动新历程被停止实行时计数器的值,以确保历程从准确位置开始实行。
6.5.3用户态/核心态转换:当历程切换到内核模式时,它须要举行用户态和核心态之间的转换。在用户态中运行的步伐只能利用有限的体系资源,如存储器、cpu时间片等,而内核态则具有更高的权限,因此可以直接访问盘算机的全部体系资源。
6.6 hello的非常与信号处置惩罚
6.6.1 正常运行
图6.1 正常运行
6.6.2 ctrl-C
图6.2 crtlC
出键盘输入会对父历程发起信号,该信号会使该历程调用信号处置惩罚步伐。内核收到信号后,令步伐克制。
6.6.3 Ctrl-Z
图6.3 ctrlV
与ctrl-C一样 输入Ctrl-Z也会导致克制。
6.6.4 PS
图 6.4 ps
输入PS 我们会发现,被克制后,hello仍旧存在。
6.6.5 jobs
图 6.5 jobs
前台作业号。
6.6.6pstree
图5.6 pstree
体现了步伐和历程间各种错综复杂的关系。
6.6.7 fg
吸取到fg下令后,内核收到信号,被挂起的hello继续之前运行。
图 5.7 fg
6.6.8 kill
图 5.8 kill
在kill中,我们终于杀死了hello,其历程不复存在。
6.7本章小结
本章先容了hello的步伐管理和对非常、信号的处置惩罚。
(第6章1分)
第7章 hello的存储管理
7.1 hello的存储器所在空间
"hello"步伐在内存中存储的位置会涉及四个所在概念:逻辑所在、线性所在、假造所在和物理所在。
7.1.1逻辑所在是应用步伐发出的一个所在,通常由cpu天生。这个所在是相对于该历程自己简直切起始位置而言的。它不会改变物理所在,仅形貌历程怎样访问其内部内存。比方,当一个步伐要读取数据时,它只须要发出逻辑所在即可,而无需真正相识这些数据在物理内存中的具体位置。
7.1.2线性所在是从0x00000000到0xffffffff的一段一连的所在空间,在利用体系看来应当是从逻辑所在透明映射而来,大概颠末硬件所在转换簿举行转换后得到的;
7.1.3假造所在(也称逻辑所在)是在历程视角下的所在空间,它由历程自己界说,这些所在大概会被映射到线性所在或物理所在上。利用体系可以根据历程的须要来为每个历程分配相应的假造所在空间,让它们可以互不干扰地运行。
7.1.4物理所在是实际存在于ram(或其他存储装备)中的物理内存所在。当利用体系须要将cpu发出的逻辑所在映射到真实的物理所在时,它会对线性所在举行转换(假如须要的话),并将其映射到对应的物理所在上。
7.2 Intel逻辑所在到线性所在的变更-段式管理
段式管理是一种内存所在变更的方式,将逻辑所在转换为线性所在。利用段式管理须要利用一组形貌内存分区的段形貌符,每个段形貌符包罗了段的起始物理所在、段的长度以及一些控制位等信息。段式管理的流程如下:
1.从逻辑所在中获取段选择子(16位)。段选择子指定了要访问的段形貌符在全局形貌符表(gdt)或局部形貌符表(ldt)中的索引。
2.根据段选择子定位到对应的段形貌符,并将其加载入gdtr或ldtr中。
3.从逻辑所在中获取段内偏移量。段内偏移量指定了相对于段起始所在的偏移量。
4.将段形貌符中的基所在和段内偏移量相加,得到线性所在。
7.3 Hello的线性所在到物理所在的变更-页式管理
在页式管理下,将一个步伐的逻辑空间(假造所在)分为巨细固定的块,即页,使得实际的物理内存分配也是按页举行的。这种访问方式可以进步内存利用率,镌汰外部碎片,而且易于动态调解页面巨细。
将线性所在分解为页目次表索引、页表索引和页内偏移量。页目次表和页表都是由利用体系维护的数据布局,用来记载假造空间中每个页对应的物理所在或其他干系信息。
利用页目次表中索引所指向的页表基址,找到页表项,并利用页表索引所指向的页帧号码(对应实际物理内存中的一块空闲地区)、标志等信息,盘算出假造所在对应的物理所在。
将页帧号和页内偏移量组合成终极输出的物理所在。
7.4 TLB与四级页表支持下的VA到PA的变更
cpu天生一个假造所在(va),包罗一个页号(pn)和偏移量(offset)。
cpu查找tlb以查察是否有相应的页表项(pti)。假如未掷中,则跳转到步调3;假如已掷中,则利用物理页帧号(pfn)从页表项(pte)得到物理所在(pa)。然后将偏移量添加到pa以得到终极的物理所在。比方: pa = pfn + offset。
假如tlb未掷中,则cpu须要利用页表来确定物理所在(pa)。起首,cpu从pn获取四级页表的索引,然后利用该索引查找第一级页表,以获取指向第二级页表的所在。
然后cpu利用第二级页表索引的值查找第二级页表,并重复这个过程直到第四级页表得到。
在第四级页表中,cpu利用offset作为索引来查找页框号(pfn)。
终极的物理所在(pa)是pfn和偏移量(offset)的组合。比方: pa = pfn + offset。
7.5 三级Cache支持下的物理内存访问
cpu发出哀求:当cpu须要读取或写入内存中的数据时,起首会向l1 cache发送哀求。假如所需的数据在l1 cache中已经存在,则可以直接从l1 cache中获取;否则,哀求将通报到下一级缓存。
哀求到达l2 cache:假如l1 cache无法找到所需数据,则哀求将通报到l2 cache。通常情况下,l2 cache也比l1 cache更大,因此它具有更高的查找概率。
哀求到达l3 cache:假如l2 cache也无法找到所需数据,则哀求将通报到l3 cache。l3 cache通常比l2 cache更大,但速率较慢。
哀求到达内存控制器:假如l3 cache都无法找到数据,则哀求将通报到内存控制器。内存控制器是负责管理整个体系内存的专用硬件。
数据从物理内存返回:一旦内存控制器找到所需的数据,它将返回给cpu,并存储到l1 cache中以供后续利用。同样,在这个过程中,假如数据无法在某个缓存层中找到,则会向上一级缓存或内存控制器举行哀求。
7.6 hello历程fork时的内存映射
当一个历程实行fork()体系调用创建子历程时,子历程会得到和父历程一样的代码、数据和堆栈空间的副本。在这个过程中,内核将为子历程新分配一块假造所在空间,并将该空间映射到与父历程雷同内容的物理页面上。
具体来说,当fork()函数被调用时,利用体系会创建子历程的历程形貌符和页表等数据布局,并将其与父历程的相应布局复制,以确保子历程与父历程之间的隔离性。接着,内核会依次对每个页表项举行处置惩罚,以创建子历程的页表并将其映射到相应的物理页面。
7.7 hello历程execve时的内存映射
在历程中调用 execve() 函数时,当前的历程映像会被新步伐的映像更换。这个过程可以分为以下步调:
1.将新步伐读入内存。
2.创建并初始化一个新的步伐堆栈(包罗下令行参数和情况变量)。
3.关闭全部旧步伐打开的文件形貌符,并根据须要重定向尺度输入、输出和错误。 开释旧步伐利用的全部资源。
4.新步伐开始实行。
5.在新步伐读入内存时,在历程空间中将会创建一个新的假造内存空间。这些假造所在空间将与磁盘上的可实行文件或共享库中的代码段、数据段和堆栈段干系联。
6.当历程开始实行新步伐时,假造所在空间映射到实际的物理内存页。这个过程通过页面调理算法完成,每个历程都有一个自己的所在空间。
7.8 缺页故障与缺页停止处置惩罚
7.8.1缺页故障
缺页故障是利用体系中的一种错误,当步伐须要访问某个假造内存页时,该页不在内存中可用时就会发生缺页故障。在这种情况下,利用体系须要从磁盘中读取所需的页面,并更新页面表,以便将其分配到物理内存中。
7.8.2缺页停止处置惩罚
当缺页故障出现时,cpu 会向利用体系发送一个停止哀求,这称为缺页停止。缺页停止处置惩罚步伐是利用体系中的一部分,它负责相应缺页停止并实行须要的利用,包罗:
1.通过磁盘 i/o 读取缺失的页面;
2.更新页表,以便将新页面映射到准确的假造所在;
3.将页面加载到物理内存中,使其可供历程利用;
4.规复产生停止的指令,使历程可以或许继续实行。
缺页停止处置惩罚步伐是利用体系中非常告急的一部分,由于它对体系性能和相应时间有很大的影响。优化停止处置惩罚步伐可以镌汰体系的耽误并进步服从。
(第7章 2分)
第8章 hello的IO管理
8.1 Linux的IO装备管理方法
(以下格式自行编排,编辑时删除)
装备的模子化:文件
装备管理:unix io接口
8.2 简述Unix IO接口及其函数
(以下格式自行编排,编辑时删除)
8.3 printf的实现分析
(以下格式自行编排,编辑时删除)
https://www.cnblogs.com/pianist/p/3315801.html
从vsprintf天生体现信息,到write体系函数,到陷阱-体系调用 int 0x80或syscall等.
字符体现驱动子步伐:从ASCII到字模库到体现vram(存储每一个点的RGB颜色信息)。
体现芯片按照革新频率逐行读取vram,并通过信号线向液晶体现器传输每一个点(RGB分量)。
8.4 getchar的实现分析
(以下格式自行编排,编辑时删除)
异步非常-键盘停止的处置惩罚:键盘停止处置惩罚子步伐。继续按键扫描码转成ascii码,生存到体系的键盘缓冲区。
getchar等调用read体系函数,通过体系调用读取按键ascii码,直到继续到回车键才返回。
8.5本章小结
(以下格式自行编排,编辑时删除)
(第8章1分)
结论
hello.c颠末预处置惩罚天生hello.i,hello.i颠末编译天生hello.s,hello.s颠末汇编天生hello.o,hello.o再颠末链接就可以天生hello.out可实行步伐.当运行hello.out时,体系会先fork一个新的历程,并在新的历程中利用execve加载hello.out.在这个过程中历程管理和盘算机内部的所在管理都发挥了至关告急的作用,终极hello.out实行完后被父历程接纳,竣事自己的历程。
通过对hello一生的记载,我更加深刻地明白了呆板对于一个C步伐是怎样一步一步处置惩罚直到步伐被杀死彻底从盘算机抹除。对盘算机体系有了更加全面的熟悉。
(结论0分,缺失 -1分,根据内容酌情加分)
附件
hello.i:cpp根据以字符#开头的下令,修改原始的C步伐。重要是将头文件,比方stdio文件插入步伐文本中,得到新的C步伐。
hello.s:编译器将C语言翻译成汇编语言,作为中心的太过阶段。
hello.o:汇编器将汇编语言转化为呆板可读的呆板语言。
hello:源步伐中调用了printf,getchar,sleep,atoi等函数。利用毗连器,将C语言函数库中相应的可毗连文件与3中的文件毗连,天生可实行的文件。
hello.txt:hello文件的反汇编代码文件。
hello.elf.txt: hello的elf文件。
(附件0分,缺失 -1分)
参考文献
为完本钱次大作业你翻阅的册本与网站等
[1] (美)兰德尔E.布莱恩特等. 北京:呆板工业出书社,2016.7
[2] https://blog.csdn.net/sy06106/article/details/118274118
(参考文献0分,缺失 -1分)
|