20155220 《信息安全系统设计基础》第11周学习总结
教材学习内容总结
虚拟存储器的两个“三”
-
三个能力:
-
它将主存看成是一个存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,并根据需要在磁盘和主存之间来回传送数据,通过这种方式,高效的使用了主存。
-
它为每个进程提供了一致的地址空间,从而简化了存储器管理。
-
它保护了每个进程的地址空间不被其他进程破坏。
-
-
理解的三个原因:
-
虚拟存储器是中心的:它是硬件异常、硬件地址翻译、主存、磁盘文件和内核软件的交互中心;
-
虚拟存储器是强大的:它可以创建和销毁存储器片、可以映射存储器片映射到磁盘某个部分等等;
-
虚拟存储器若操作不当则十分危险。
-
物理和虚拟寻址
-
物理地址PA
- 计算机系统的主存被组织成一个由M个连续的字节大小的单元组成的数组,每字节都有一个唯一的物理地址PA。根据物理地址寻址的是物理寻址。
-
地址翻译
- 使用虚拟寻址时,CPU通过生成一个虚拟地址VA来访问主存,这个虚拟地址在被送到存储器之前先转换成适当的物理地址,相关硬件为存储器管理单元MMU。
页表
-
页表:是一个数据结构,存放在物理存储器中,将虚拟页映射到物理页,就是一个页表条目的数组。
-
页表就是一个页表条目PTE的数组。
- PTE:由一个有效位和一个n位地址字段组成的,表明了该虚拟页是否被缓存在DRAM中。
-
页表的组成:有效位+n位地址字段
-
如果设置了有效位:地址字段表示DRAM中相应的物理页的起始位置,这个物理页中
缓存了该虚拟页。 -
如果没有设置有效位:
-
空地址:表示该虚拟页未被分配;
-
不是空地址:这个地址指向该虚拟页在磁盘上的起始位置。
-
-
当CPU读取一个字的时候,地址翻译硬件将虚拟地址作为一个索引来定位PTE,并从存储器中读取它。
-
缺页:就是指DRAM缓存不命中。
-
缺页异常:会调用内核中的缺页异常处理程序,选择一个牺牲页。
-
页:虚拟存储器的习惯说法,就是块
-
交换=页面调度:磁盘和存储器之间传送页的活动
-
按需页面调度:直到发生不命中时才换入页面的策略,所有现代系统都使用这个。
地址空间
-
地址空间是一个非负整数地址的有序集合:{0,1,2,……}
-
线性地址空间:地址空间中的整数是连续的。
-
虚拟地址空间:CPU从一个有 N=2^n 个地址的地址空间中生成虚拟地址,这个地址空间成为称为虚拟地址空间。
-
地址空间的大小:由表示最大地址所需要的位数来描述。
-
物理地址空间:与系统中的物理存储器的M个字节相对应。
-
虚拟存储器的基本思想:主存中的每个字节都有一个选自虚拟地址空间的虚拟地址和一个选自物理地址空间的物理地址。
-
虚拟存储器——虚拟页(VP),每个虚拟页大小为P=2^p字节。
-
物理存储器——物理页(PP),也叫页帧,大小也为P字节。
地址翻译
- 地址翻译:一个N元素的虚拟地址空间(VAS)中的元素和一个M元素的物理地址空间(PAS)之间的映射。
MAP:VAS→PAS∪空 MAP(A)
-
MAP = A' ,如果虚拟地址A处的数据在PAS的物理地址A'处;
-
MAP = ∅ ,如果虚拟地址A处的数据不在物理存储器中
-
CPU中的一个控制寄存器页表基址寄存器指向当前页表,n位的虚拟地址包含两个部分:一个p位的虚拟页面偏移(VPO) 和一个(n-p)位的虚拟页号,页表条目中的物理页页号和虚拟地址中的VPO串联起来,就得到了相应的物理地址。
-
当页面命中时,CPU硬件执行步骤:
-
处理器生成虚拟地址,传给MMU;
-
MMU生成PTE地址,并从高速缓存/主存请求得到他;
-
高速缓存/主存向MMU返回PTE;
-
MMU构造物理地址,并把它传给高速缓存/主存;
-
高速缓存/主存返回所请求的数据给处理器。
-
-
处理缺页时,CPU硬件执行步骤
-
处理器生成虚拟地址,传给MMU;
-
MMU生成PTE地址,并从高速缓存/主存请求得到他;
-
高速缓存/主存向MMU返回PTE;
-
PTE中有效位为0,触发缺页异常;
-
确定牺牲页;
-
调入新页面,更新PTE;
-
返回原来的进程,再次执行导致缺页的指令,会命中。
-
利用TLB加速地址翻译
-
TLB:翻译后备缓冲器,是一个小的、虚拟存储的缓存,其中每一行都保存着一个由单个PTE组成的块
-
步骤:
-
CPU产生一个虚拟地址;
-
MMU从TLB中取出相应的PTE;
-
MMU将这个虚拟地址翻译成一个物理地址,并且将它发送到高速缓存/主存;
-
高速缓存/主存将所请求的数据字返回给CPU。
-
多级页表
-
多级页表——采用层次结构,用来压缩页表。
-
以两层页表层次结构为例,好处是:
-
如果一级页表中的一个PTE是空的,那么相应的二级页表就根本不会存在;
-
只有一级页表才需要总是在主存中,虚拟存储器系统可以在需要时创建、页面调入或调出二级页表,只有最经常使用的二级页表才缓存在主存中。
-
垃圾收集
- 垃圾收集器:一种动态存储分配器,它自动释放程序不再需要的已分配块,这些块被称为垃圾,自动回收堆存储的过程叫做垃圾收集。
Mark&Sweep垃圾收集器
-
Mark&Sweep垃圾收集器由标记阶段和清除阶段组成,标记阶段标记出根节点所有可达的和已分配的后继,清除阶段释放每个未被标记的已分配块。
-
在对Mark&Sweep的描述中使用下列函数
ptr isPtr(ptrp)
:如果p指向一个已分配块中的某个字,那么就返回一个指向这个块起始位置的指针b,否则返回NULL。int blockMarked(ptrb)
:如果已经标记了块b,就返回true。int blockAllocated(ptrb)
:如果块b是已分配的,就返回true。void markBlock(ptr b)
:标记块b。int length(ptrb)
:返回块b的以字为单位的长度(不包括头部)。void unmarkBlock(ptr b)
:将块b的状态由已标记的改为未标记的。ptr nextBlock(ptr b)
:返回堆中块b的后继。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 0/0 | 2/2 | 5/5 | |
第二周 | 100/100 | 3/4 | 10/15 | |
第三周 | 100/200 | 4/5 | 20/35 | |
第四周 | 200/400 | 2/7 | 25/60 | |
第五周 | 1000/1400 | 2/9 | 35/95 | |
第六周 | 300/1700 | 3/12 | 50/135 | |
第七周 | 200/1900 | 2/14 | 45/180 | |
第八周 | 200/2100 | 1/15 | 55/235 | |
第九周 | 300/2400 | 3/18 | 45/280 | |
第十周 | 200/2600 | 0/18 | 20/300 | |
第十一周 | 100/2700 | 2/20 | 45/345 |