没有合适的资源?快使用搜索试试~ 我知道了~
Windows内存管理的内核源码详细分析.doc
需积分: 10 1 下载量 23 浏览量
2019-07-23
16:34:06
上传
评论
收藏 92KB DOC 举报
温馨提示
试读
30页
每个进程有一个地址空间,共4GB,(具体分为低2GB的用户地址空间 高2GB的内核地址空间) 各个进程的用户地址空间不同,属于各进程专有,内核地址空间部分则几乎完全相同 虚拟地址如0x11111111, 看似这8个数字是一个整体,其实是由三部分组成的,是一个三维地址,将这个32位的值拆开,高10位表示二级页表号,中间10位表示二级页表中的页号,最后12位表示页内偏移(2^12=4kb),因此,一个虚拟地址实际上是一个三维地址,指明了本虚拟地址在哪个二级页表,又在哪个页以及页内偏移是多少 这三样信息! 【虚拟地址 = 二级页表号。页号。页内偏移】:口诀【页表、页号、页偏移】 Cpu访问物理内存的原理介绍:
资源推荐
资源详情
资源评论
位系统中有 的虚拟地址空间
每个进程有一个地址空间,共 ,(具体分为低 的用户地址空间高 的内核地址空间)
各个进程的用户地址空间不同,属于各进程专有,内核地址空间部分则几乎完全相同
虚拟地址如 看似这 个数字是一个整体,其实是由三部分组成的,是一个三维地址,将
这个 位的值拆开,高 位表示二级页表号,中间 位表示二级页表中的页号,最后 位表示页内
偏移()因此,一个虚拟地址实际上是一个三维地址,指明了本虚拟地址在哪个二级页表,
又在哪个页以及页内偏移是多少 这三样信息!
【虚拟地址 二级页表号页号页内偏移】:口诀【页表、页号、页偏移】
访问物理内存的原理介绍:
如高级语言
假设这个全局变量被编译器编译为
!"假设这个局部变量被编译到寄存器 # 中暂存
那么这条赋值语句编译后对应的汇编语句为:$!#%&'(
这里 就是一个虚拟地址,简称 )*,那么这条 $!指令究竟是如何寻址的呢?
寻址过程为:%+ 中的虚拟地址转换器也即 ,,+,将虚拟地址 转换为物理地址
具体转换过程为:
根据 寄存器中记录的当前进程页表的物理地址,找到总页表,再根据虚拟地址中的页表号,以页表
号为索引,找到总页表中对应的 %-,再根据 %-,找到对应的二级页表,再根据虚拟地址中的页号部
分为索引,找到二级页表中的对应 %&-,再根据这个 %&- 记录的映射关系,找到这个虚拟页面对应的物
理页面,最后加上虚拟地址中的页内偏移部分,加上这个偏移值,就得出最后的物理地址。具体用下面的
函数可以形象表达寻址转换过程:
$!#%&'(这条指令的内部原理(没考虑二级缓冲情况)
.
页表号,页号,页内偏移
总页表本进程的总页表的物理地址固定保存在 " 寄存器中
%-总页表'页表号(%- 为对应的二级页表描述符
二级页表%-%#*//得出本二级页表的地址
%&-二级页表'页号(得出到该虚拟地址所在页面的 %&- 映射描述符
012%&- 空白3%&- 为空表示该虚拟页面尚未建立映射
触发 号页面访问异常(具体为缺页异常)
- 4#
012%&-%#4#561 4#3%&- 的这个字段表示该虚拟页面当前是否映射到了物理内存
触发 号页面访问异常(具体为缺页异常)
- 4#
012页面保护功能位已开启 77%&-#/ #1 4#3检查这个页面是否可读
触发 号页面访问异常(具体为页面访问保护权限异常)
- 4#
物理地址 "44#%&-%#*//页内偏移 得出对应的物理地址
将得到的 放到地址总线上,经 #89:;89北桥89内存总线89内存条 读得对应数据
<
%&- 是二级页表中的表项,记录了对应虚拟页面的映射情况,这个 %&- 实际上可以看做一个描述符。
上面的过程比较简单,由于每次访问内存都要先访问一次 %&- 获取该虚拟页面对应的物理页面,再访问
物理页面读得对应的数据,因此实际上访问了两次物理内存,如果类似于每条这样的 ,! 指令都要访问
物理内存两次,才能获得数据,效率就很低。因此," 芯片中专门开辟了一个二级缓冲,用来保存那些
频繁访问的 %&-,这样," 每次去查物理页面时,就先尝试在二级缓冲中查找对应的 %&-,如果找不到,
再才去访问内存中的 %&-。这样,效率就比较高,实际上绝大数情况就可以在二级缓冲中一次性找到对应
的 %&-。
另外有一个问题需要说明下:9999= 的转换过程实际上是 9= 9=实际上 %&-%#*// 表示
的是相对于 "4 段的偏移,加上 "4 段的 4# 基址,就得到了该页面的 线性地址。
(线性地址段基地址 段内偏移),但是由于 >5/!?4 采取了 : 6 也即所谓的平坦分段机制,使得
每个段的基地址都在 处,长度为 ,也即相当于 >5/!?4 没有采取分段机制。前面讲
过,"4 是 & 表中的索引,指向 & 表中的 "4 段描述符,由于 >5/!?4 不分段,因此 & 中每个
段描述符的基址,长度,是固定的!这样一来,由于不分段,线性地址就刚好是物理地址,所
以本来是由虚拟地址9=线性地址9=物理地址的转换就可以直接看做虚拟地址9=物理地址。
前文说了,每个进程有两个地址空间,一个用户地址空间,一个内核地址空间,该地址空间的内核结构体
定义为:
;6"6,*-;;;%*-地址空间描述符
.
,-,@*-*A,#$!B!!6本地址空间的已分配区段表(一个 *)C 树的根)
)0AC!?#46*//#44本地址空间的最低地址(用户空间是 ,内核空间是 )
-%-;;A%!"#44本地址空间的所属进程
A一个表,表中每个元素记录了本地址空间中各个二级页表中的 %&- 个数,一旦某个二级页表中的
%&- 个数减到了 ,就自动释放该二级页面表本身,体现为稀疏数组特征A
+;D&A%#& ##1!56& #
+CE%#& ##1!56& #;>F#上面那个表的大小
<
地址空间中所有已分配的区段都记录在一张表中,这个表不是简单的数组,而是一个 *)C 树,用来提高
查找效率。每个区段的基址都对齐 GH 或 H(指 GH 整倍数),各个区段之间可以有空隙,
区段的分布是很零散的!各个区段之间,夹杂的空隙就是尚未分配的虚拟内存。
注:所谓已分配区段,是指已经过 )>6 * !" 预订(#4##)或提交("!$$>6)后的虚拟内存
区段的描述符如下:
;6"6,-,@*-*区段描述符
.
)!>/A;66>5*//#44开始地址,普通区段对齐 GH,其它类型区段对齐 H
)!>/A-5/*//#44结尾地址,-5/*//#44I;66>5*//#44 就是该区段的大小
,-,@*-*A%#56*)C 树中的父节点
,-,@*-*AC#16J> /左边的子节点
,-,@*-*A>J6J> /右边的子节点
常见的区段类型有:普通型区段、视图型区段、缓冲型区段(后面文件系统中会讲到)等
+CE6B#本区段的类型
+CE!6#"6本区段的保护权限,可读、可写、可执行的组合
+CEK4当初分配本区段时的分配标志
C-*E# #6#05%!#44本区段是否标记为了‘已删除’
+CE%#!56
+5>!5
.
;6"6这个 ;6"6 专用于视图型区段
.
凡是含有 ; 字样的函数与结构体都表示是 #"6; 与 >5/!?4 不同的实现
;;-&0EL-&A4#"6>!5
+CE)>#?M#46指本视图型区段在所在 ;#$#56 内部的偏移
,,;-&0E;-,-E&A;#$#56所属 ;#$#56
C-*E>6#!B)>#?本视图区段是不是一个写复制区段
<;#"6>!56
C0;&-E&@#>!5C>46D#/本区段内部的所有 #>!5 区块,放在一个链表中
<6
<#5/
浅谈区段类型:
,-,@*-*)0&+*C,-,@:普通型区段,由 )>6* !" 应用层用户分配的区段都是普通
区段
,-,@*-*;-&0E)0-:视图型区段,用于文件映射,共享内存
,-,@*-**D-;-,-E&:用于文件缓冲的区段(一个簇大小)
,-,@*-*%*-%CN内核分页池中的区段
,-,@*-*H-E-C;&*H:用于内核栈中的区段
,-,@*-*%-&-N用于 %-、&- 的区段
,-,@*-*,C,*%%0E:内核中专用于建立 ,C 映射的区段
,-,@*-*E&0E++;,-,@:对应的物理页面也连续的区段
,-,@*-*0,*%%0E:内核空间中用于映射外设内存(如显存)的区段
,-,@*-*;D*-*&*:内核空间中用于与用户空间共享的区段
;6"6,,-0E区块描述符
.
+CE6B#指本区块的分配类型(预定型分配、提交型分配),又叫映射状态(已映射、尚未映
射)
+CE!6#"6本区块的访问保护权限可读、可写、可执行的组合
+CE #56J区块长度,对齐页面大小(H)
C0;&-E&@#>!5C>46-56B用来挂入所在区段的区块链表
<
内存以区段为分配单位,一个区段内部,又按分配类型、保护属性划分区块。一个区块包含一到多个内存
页面,分配类型相同并且保护权限相同的区域组成一个个的区块,因此,称为“同属性区块”。一个区段内
部,相邻区块之间的属性肯定是不相同的(分配类型或保护权限不同),若两个相邻区块的属性相同了,
会自动合并成一个新的区块。
进程,地址空间,区段,区块,页面的逻辑层次关系
一个虚拟页面实际上有五级限定:
【进程地址空间区段区块虚拟页面】
意为:哪个进程的哪个地址空间中的哪个区段中的哪个区块中的哪个虚拟页面
,-,@*-*A,$C!"6#,#$!B*#B*//#442,*-;;;%*-A4!>/A//3
这个内核函数用于在指定地址空间中查找指定地址所属的已分配区段,如果返回 E+CC,表示该地址尚不
处于任何已分配区段中,也即表示该地址尚未分配。
)!>/A
,$:>5/2,*-;;;%*-A4+CE #5+CE* >55 >6BC&!!?53
这个函数在指定地址空间中 查找一块符合 #5 长度的空闲(也即未分配)区域,返回找到的空闲区的地
址,* >55 >6B 表示该空白区必须的对齐粒度,&!!?5 表示是否从高地址端向低地址端搜索
,-,@*-*A
,$C!"6#,#$!B*#B#>!52,*-;;;%*-A4!>/A//+CE #53
这个函数从指定地址空间的低地址端向高地址段搜索,返回第一个与给点区间( //, #5)有交集的已
分配区段
E&;&*&+;
,$#6#,#$!B*#2,*-;;;%*-A 4 6B# !>/AA 4#*// C#5 !6#"6
:>#/*//* !": 4,-,@*-*AA#4 63
.
C#5* >52C#53区段长度都要对齐
+0E&4#* >5区段的基址对齐粒度
0126B#普通区段3
4#* >5GH
- 4#
4#* >5H
012A4#*//E+CC77O:>#/*//3>1用户不要求从固定地址处开始分配
.
A4#*//,$:>5/24C#54#* >5* !": 4 要求 &!!?5P3
<
- 4## 4# 只要用户给定了基址,就必须从那儿开始分配
.
A4#*//* >52A4#*//4#* >53
012要分配的区段没有完全落在指定地址空间内部3
#651>
012,$C!"6#,#$!B*#B#>!524A4#*//C#53O3>1这段范围已分配过
#651>
<
找到了一个空闲区域后指定的地址满足分配要求,就把这块区域分配出去
,#$!B*#A*#-* !"6#%!! 2E!5%#%!! 4>F#!12A*#363
Q#!,#$!B2*#3
*#6B#6B#本区段的初始分配类型(初始时,一个区段内部就一个区块)
*#;66*//A4#*//
*#-5/*//A4#*//C#5
*#!6#"6!6#"6本区段的初始保护属性
*#K4* !"K4
,$054#6,#$!B*#24*#3分配后插入地址空间中的已分配区段表中(*)C 树)
A#4 6*#
#654""
<
上面这个函数用来从指定地址或者让系统自动寻找一块空闲的区域,分配一块指定长度、类型的区段。所
谓分配,包含 #4## 型分配(即预定型分配),和 "!$$>6 型分配(即提交型分配)
预定:只占用分配一块区段,不建立映射
提交:分配一块区段并建立映射(映射到磁盘页文件物理内存页面)
,,-0EA
,$:>5/#>!52!>/A*#4#*//C0;&-E&@A#>!5C>46D#/!>/A&6*//
)!>/AA#>!54#*//3
这个函数从指定区段的区块链表中,查找给定目标地址 &6*// 落在哪一个区块内
第一个参数表示区段的基址。函数返回找到的区段并顺便将该区段的基址也存入最后一个参数中返回给调
用者
,,-0EA
,$; >6#>!52,,-0EA54#*//;66*//C#5E#?&B#E#?%!6#"6
* 6#:5"3
这个函数将指定区块内部的指定区域(;66*//C#5)修改为新的分配类型、保护属性,使原区块分裂,
一分为三(特殊情况一分为二),然后调用 * 6#:5" 跟着修改二级页表中,新区块的那些 %&-,最后
再跟着修改物理页面分配情况。函数返回新分出来的那个中间区块。这是一个内部辅助函数。
E&;&*&+;
,$* 6##>!52*#4#*// #>!5C>46D#/ &6*//C#5 E#?&B#E#?%!6#"6
* 6#:5"3
这个函数是个通用函数,用来修改指定区段内部的指定区域的分配类型、保护属性,然后
调用调用 * 6#:5" 跟着修改二级页表中,目标区域对应的那些 %&-,最后再跟着修改物理
页面的分配情况。
物理内存讲述:
内核中有一个全局的物理页面数组,和 R 个物理页面链表。分别是:
%D@;0*C%*-,$%#*B'(物理内存有多大,该数组就有多大
C0;&-E&@:##Q#!#/%#C>46D#/空闲物理页面链表(且物理页面已清 )
剩余29页未读,继续阅读
资源评论
weixin_39840650
- 粉丝: 409
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于Matlab的运动目标跟踪系统+源代码+全部数据+文档说明+详细注释(高分课程设计)
- 基于Matlab的人脸考勤系统+源代码+全部数据+文档说明+详细注释(高分课程设计)
- 基于Matlab的异常行为检测+源代码+全部数据+文档说明+详细注释(高分课程设计)
- 基于MATLAB的条形码识别系统源码+全部数据+文档说明+详细注释+文档(高分课程设计)(带GUI界面)
- 基于C#,Winform,SQL SERVER的条形码识别操作系统+源代码+文档说明(期末大作业)
- 10_base.apk.1
- matlab-great-drawing-输出月份英文名pta
- My-Graduation-母亲节祝福python
- My-Graduation-Project华中农业大学python
- 摄像头图像采集系统.pages
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功