20145311 《信息安全系统设计基础》第十四周学习总结
教材学习内容总结
1.物理寻址
计算机系统的主存被组织成一个由M个连续的字节大小的单元组成的数组。每字节都有一个唯一的物理地址PA。第一个字节的地址为0,接下来的字节的地址为1,再下一个为2,依此类推。给定这种简单的结构,CPU访问存储器的最自然的方式就是使用物理地址,我们把这种方式称为物理寻址。
2.虚拟寻址
使用虚拟寻址时,CPU通过生成一个虚拟地址来访问主存,这个虚拟地址在被送到存储器之前先转换成适当的物理地址。将一个虚拟地址转换为物理地址的任务叫做地址翻译。
CPU芯片上叫做存储器管理单元的专用硬件,利用存放在主存中的查询表来动态翻译虚拟地址,该表的内容是由操作系统管理。
虚拟存储器的三个重要能力:
它将主存看成是一个存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,并根据需要在磁盘和主存之间来回传送数据,通过这种方式,高效的使用了主存。
它为每个进程提供了一致的地址空间,从而简化了存储器管理。
它保护了每个进程的地址空间不被其他进程破坏
虚拟存储器的基本思想:允许每个数据对象有多个独立的地址,其中每个地址都选自一个不同的地址空间
虚拟存储器作为存储器管理的工具
操作系统为每个进程提供了一个独立的页表,也就是一个独立的虚拟地址空间。
多个虚拟页面可以映射到同一个共享物理页面上。
存储器映射:将一组连续的虚拟页映射到任意一个文件中的任意位置的表示法。
按需页面调度和独立的虚拟地址空间的结合简化了链接和加载、代码和数据共享,以及应用程序的存储器分配。
简化链接:独立的地址空间允许每个进程的存储器映像使用相同的基本格式,而不管代码和数据实际存放在物理存储器的何处。
简化加载:虚拟存储器使得容易想存储器中加载可执行文件和共享文件对象。
简化共享:独立地址空间为操作系统提供了一个管理用户进程和操作系统自身之间共享的一致机制。
简化存储器分配:虚拟存储器为向用户进程提供一个简单的分配额外存储器的机制。
地址翻译:
1.页面命中时,CPU执行步骤:
第一步:处理器生成一个虚拟地址,并把它传送给MMU
第二步:MMU生成PTE地址,并从高速缓存/主存请求得到他
第三步:高速缓存/主存向MMU返回PTE
第四步:MMU构造物理地址,并把它传送给高速缓存/主存
第五步:高速缓存/主存返回所请求的数据字给处理器
2.处理缺页,要求硬件和操作系统协作完成
第一步到第三步同上
第四步:PTE中的有效位是0,MMU触发异常,传递CPU中的控制到操作系统内核中的缺页异常处理程序
第五步:程序确定物理存储器中的牺牲页,如果页面被修改,则换出到磁盘
第六步:程序页面调入新的页面,并更新存储器中的PTE
第七步:程序返回到原来的进程,再次执行导致缺页的指令
3.结合高速缓存和虚拟存储器
主要的思路:地址翻译发生在高速缓存查找之前
4.利用TLB加速地址翻译
翻译后备缓冲器TLB:是一个小的,虚拟寻址的缓存,其中每一行都保存着一个由单个PTE组成的块,具有高度的相连性
5.用来压缩页表的常用方法是使用层次结构的页表,这种方式从两个方面减少了存储器要求:
第一点:节约,如果一级页表中的PTE是空的,那么相应的二级页表就不会存在
第二点:减压,只有一级页表存在主存中,只有经常使用的二级页表才需要缓存在主存中
Linux虚拟存储器: 每个存在的虚拟页存在某个区域中,而不属于某个区域的虚拟页是不存在的,并且不能被进程引用。 一个具体区域结构包含的字段:
(1)vm_start:指向这个区域的起始处。 (2)vm_end:指向这个区域的结束处。 (3)vm_prot:描述这个区域的内包含的所有页的读写许可权限。 (4)vm_flags:描述这个区域内页面是与其他进程共享的,还是这个进程私有的(还描述了其他一些信息)。 (5)vm_next:指向链表中下一个区域结构。
Linux缺页异常处理:
碎片:虽然有未使用的存储器,但是不能用来满足分配请求。 内部碎片:发生在一个已分配块比有效载荷大的时候,易于量化。 外部碎片:发生在当空闲存储器合计起来足够满足一个分配请求,但是没有一个单独的空间块足以处理这个请求时发生。难以量化,不可预测。
垃圾收集器是动态存储分配器,自动释放程序不在需要的已分配块 makr&sweep垃圾收集器有标记阶段和清除阶段
Mark&Sweep垃圾收集器
- 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的后继。
C程序中常见的与存储器有关的错误 间接引用坏指针:在进程的虚拟地址空间中有较大的洞,没有映射到任何有意义的数据,如果试图引用一个指向这些洞的指针,操作系统就会以段异常来终止程序。 读未初始化的存储器 允许栈缓冲区溢出 造成错位错误 误解指针运算 引用不存在的变量
本周代码托管
其他(感悟、思考等,可选)
这章是关于虚拟存储器的,这是计算机的一个重要的抽象,从而将计算机中的物理存储空间抽象了出来。
当然这也可能引发一些错误,例如上面所说到的c语言中的一些错误,在了解了这些知识后能够更好地帮助我们去避免一些因为存储而出现的错误
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | |
---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 |
第一周 | 100/100 | 1/2 | 10/10 |
第二周 | 150/200 | 2/4 | 8/18 |
第三周 | 200/250 | 1/5 | 5/23 |
第五周 | 50/300 | 1/6 | 9/32 |
第六周 | 20/320 | 1/7 | 8/40 |
第七周 | 20/340 | 1/8 | 6/46 |
第八周 | 60/400 | 2/10 | 6/52 |
第九周 | 80/480 | 1/11 | 8/60 |
第十周 | 60/540 | 2/13 | 6/66 |
第十一周 | 80/620 | 1/14 | 6/72 |
第十二周 | 50/670 | 1/15 | 5/77 |
第十三周 | 50/720 | 1/16 | 6/83 |
第十四周 | 0/720 | 1/17 | 5/88 |