20145303 《信息安全系统设计基础》第十四周学习总结
20145303 《信息安全系统设计基础》第十四周学习总结
教材学习内容总结
第九章 虚拟存储器
•虚拟存储器三个重要功能:
(1)将主存看作是一个存储在磁盘上的地址空间的高速缓存,在主存中只保护活动的区域,并根据需要在磁盘和主存之间来回传送数据
(2)为每个进程提供了一致的地址空间,从而简化了存储器管理
(3)保护了每个进程的地址空间不被其它进程破坏
•物理寻址:主存被组织成一个由M个连续的字节大小的单元组成的数组,依次类推的寻址方式称为物理寻址
•虚拟寻址:CPU生成一个虚拟地址(VA)来访问主存,在被传送到存储器之前先转换成适当的物理地址。地址翻译通过CPU芯片上的存储器管理单元完成
•地址翻译:使用虚拟寻址时,CPU通过生成一个虚拟地址VA来访问主存,这个虚拟地址在被送到存储器之前先转换成适当的物理地址,相关硬件为存储器管理单元MMU
•线性地址空间:地址空间中的整数是连续的
•虚拟地址空间:CPU从一个有 N=2^n 个地址的地址空间中生成虚拟地址,这个地址空间成为称为虚拟地址空间
•物理地址空间:与系统中的物理存储器的M个字节相对应
•地址空间的大小:由表示最大地址所需要的位数来描述
•主存中的每个字节都有一个选自虚拟地址空间的虚拟地址和一个选自物理地址空间的物理地址
•虚拟存储器:虚拟页VP,每个虚拟页大小为P=2^平字节
•物理存储器:物理页PP,也叫页帧,大小也为P字节
•DRAM缓存的组织结构:
不命中处罚很大
是全相联的——任何虚拟页都可以放在任何的物理页中。
替换算法精密
总是使用写回而不是直写
•页表:一个数据结构,存放在物理存储器中,将虚拟页映射到物理页,就是一个页表条目的数组
•PTE:由一个有效位和一个n位地址字段组成的,表明了该虚拟页是否被缓存在DRAM中
•页命中:当CPU读取一个字的时候,地址翻译硬件将虚拟地址作为一个索引来定位PTE,并从存储器中读取它
•缺页:DRA缓存不命中称为缺页。在不命中发生时,换入页面的策略称为按需页面调度
•颠簸:工作集大小超出了物理存储器的大小
•操作系统为每个进程提供了一个独立的页表,也就是一个独立的虚拟地址空间
•存储器映射:将一组连续的虚拟页映射到任意一个文件中的任意位置的表示法
•PTE的三个许可位:
SUP:表示进程是否必须运行在内核模式下才能访问该页
READ:读权限
WRITE:写权限
•地址翻译:一个N元素的虚拟地址空间(VAS)中的元素和一个M元素的物理地址空间(PAS)之间的映射
•TLB:翻译后备缓冲器,是一个小的、虚拟存储的缓存,其中每一行都保存着一个由单个PTE组成的块
•多级页表:采用层次结构,用来压缩页表
•存储器映射:指Linux通过将一个虚拟存储器区域与一个磁盘上的对象关联起来,以初始化这个虚拟存储器区域的内容的过程
•共享对象对于所有把它映射到自己的虚拟存储器进程来说都是可见的
•当fork函数被当前进程调用时,内核为新进程创建各种数据结构,并分配给它一个唯一的PID。为了给这个新进程创建虚拟存储器,它创建了当前进程的mm_struct、区域结构和页表的原样拷贝。它将两个进程中的每个页面都为标记只读,并将两个进程中的每个区域结构都标记为私有的写时拷贝。当fork在新进程中返回时,新进程现在的虚拟存储器刚好和调用fork时存在的虚拟存储器相同。当这两个进程中的任一个后来进行写操作时,写时拷贝机制就会创建新页面,因此,也就为每个进程保持了私有地址空间的抽象概念
•execve函数:将a.out程序加载到存储器
•Unix进程可以使用mmap函数来创建新的虚拟存储器区域,并将对象映射到这些区域当中
•显示分配器:要求应用显式地释放任何已经分配的块
•隐式分配器:要求分配器检测一个已分配块何时不再被程序所使用,就释放这个块。也叫做垃圾收集器
•分配器要求:
处理任意请求序列
立即响应请求
只使用堆
对齐块
不修改已分配的块
•分配器目标
最大化吞吐率
最大化存储器利用率
• 内部碎片:发生在一个已分配块比有效载荷大的时候,易于量化。
外部碎片:发生在当空闲存储器合计起来足够满足一个分配请求,但是没有一个单独的空间块足以处理这个请求时发生。难以量化,不可预测
•堆块的格式:由一个字的头部,有效荷载,和可能的额外填充组成
•垃圾收集器:一种动态存储分配器。,自动释放程序已经不再需要的已分配块(垃圾)
•垃圾收集器将存储器视为一张有向可达图,图的节点被分配为一组根节点和一组堆节点。当存在一条从任意根节点出发到并到达P的有向路径时,就称节点P是可达的
•Mark&Sweep垃圾收集器由标记阶段和清除阶段组成,标记阶段标记出根节点所有可达的和已分配的后继,清除阶段释放每个未被标记的已分配块
•对Mark&Sweep的描述中使用下列函数
ptr isPtr(ptr p):如果p指向一个已分配块中的某个字,那么就返回一个指向这个块起始位置的指针b,否则返回NULL
int blockMarked(ptr b):如果已经标记了块b,就返回true
int blockAllocated(ptr b):如果块b是已分配的,就返回true
void markBlock(ptr b):标记块b
int length(ptr b):返回块b的以字为单位的长度(不包括头部)
void unmarkBlock(ptr b):将块b的状态由已标记的改为未标记的
ptr nextBlock(ptr b):返回堆中块b的后继
•在进程的虚拟地址空间中有较大的洞,没有映射到任何有意义的数据,如果试图引用一个指向这些洞的指针,操作系统就会以段异常来终止程序
•如果一个程序不检查输入串的大小就写入栈中的目标缓冲区,程序就会出现缓冲区溢出错误
感想
本周是最后一次任务了,在linux中,可以说在这个学期还是学到了很多知识。写博客也在一次次在加强对自己所学的理解。实践的动手项目让我看到执行结果,再回头看代码效果就会更好。学习过程中也一直在转变自己的态度,慢慢感觉到学习linux还是很愉快的