首页 > 代码库 > 20145326蔡馨熤《信息安全系统设计基础》第14周学习总结

20145326蔡馨熤《信息安全系统设计基础》第14周学习总结

20145326蔡馨熤《信息安全系统设计基础》第14周学习总结

教材内容总结(过多内容不赘述)

1.虚拟存储器的三个重要能力:

  • 它将主存看成是一个存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,并根据需要在磁盘和主存之间来回传送数据,通过这种方式,高效的使用了主存。
  • 它为每个进程提供了一致的地址空间,从而简化了存储器管理。
  • 它保护了每个进程的地址空间不被其他进程破坏。

2.虚拟存储器是对主存的一个抽象。

3.支持虚拟存储器的处理器通过使用一种叫做虚拟寻址的间接形式来引用主存,处理器产生一个虚拟地址,在被发送到主存之前,这个地址被翻译成一个物理地址。 专门的硬件通过使用页表来翻译虚拟地址,而页表的内容是由操作系统提供的。

4.地址空间

  • 地址空间是一个非负整数地址的有序集合:{0,1,2,……}
  • 线性地址空间:地址空间中的整数是连续的。
  • 虚拟地址空间:CPU从一个有 N=2^n 个地址的地址空间中生成虚拟地址,这个地址空间成为称为虚拟地址空间。
  • 地址空间的大小:由表示最大地址所需要的位数来描述。
  • 物理地址空间:与系统中的物理存储器的M个字节相对应。

  • 虚拟存储器的基本思想:主存中的每个字节都有一个选自虚拟地址空间的虚拟地址和一个选自物理地址空间的物理地址。

5.虚拟存储器作为缓存的工具

  • 虚拟存储器——虚拟页(VP),每个虚拟页大小为P=2^p字节。
  • 物理存储器——物理页(PP),也叫页帧,大小也为P字节。
  • 任意时刻,虚拟页面的集合都被分为三个不相交的子集:
    • 未分配的:VM系统还没分配(创建)的页,不占用任何磁盘空间。
    • 缓存的:当前缓存在物理存储器中的已分配页。
    • 未缓存的:没有缓存在物理存储器中的已分配页。

6.虚拟存储器作为存储器管理的工具

  • 多个虚拟页面可以映射到同一个共享物理页面上。
  • 存储器映射:将一组连续的虚拟页映射到任意一个文件中的任意位置的表示法。
  • 按需页面调度和独立的虚拟地址空间的结合简化了链接和加载、代码和数据共享,以及应用程序的存储器分配。
    • 简化链接:独立的地址空间允许每个进程的存储器映像使用相同的基本格式,而不管代码和数据实际存放在物理存储器的何处。
    • 简化加载:虚拟存储器使得容易想存储器中加载可执行文件和共享文件对象。
    • 简化共享:独立地址空间为操作系统提供了一个管理用户进程和操作系统自身之间共享的一致机制。
    • 简化存储器分配:虚拟存储器为向用户进程提供一个简单的分配额外存储器的机制。

7.虚拟存储器作为存储器保护的工具

  • 通过在PTE上添加一些额外的许可来控制对一个虚拟页面的内容访问。
  • PTE的三个许可位:
    • SUP:表示进程是否必须运行在内核模式下才能访问该页
    • READ:读权限
    • WRITE:写权限

8.当页面命中时,CPU硬件执行步骤

  • 处理器生成虚拟地址,传给MMU
  • MMU生成PTE地址,并从高速缓存/主存请求得到它
  • 高速缓存/主存向MMU返回PTE
  • MMU构造物理地址,并把它传给高速缓存/主存
  • 高速缓存/主存返回所请求的数据给处理器。

9.处理缺页时,CPU硬件执行步骤

  • 处理器生成虚拟地址,传给MMU
  • MMU生成PTE地址,并从高速缓存/主存请求得到他
  • 高速缓存/主存向MMU返回PTE
  • PTE中有效位为0,触发缺页异常
  • 确定牺牲页
  • 调入新页面,更新PTE
  • 返回原来的进程,再次执行导致缺页的指令,会命中

10.共享对象和私有对象

  • 共享对象

    • 共享对象对于所有把它映射到自己的虚拟存储器进程来说都是可见的。
    • 即使映射到多个共享区域,物理存储器中也只需要存放共享对象的一个拷贝。
  • 私有对象

    • 私有对象运用的技术:写时拷贝
    • 在物理存储器中只保存有私有对象的一份拷贝。

11.动态存储器分配

  • 当运行时需要额外虚拟存储器时,使用动态存储器分配器维护一个进程的虚拟存储器区域。
  • 分配器有两种风格:
    • 显示分配器:要求应用显式地释放任何已经分配的块。
    • 隐式分配器:要求分配器检测一个已分配块何时不再被程序所使用,就释放这个块。也叫做垃圾收集器。

12.在对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的后继。

13.C程序中常见的与存储器有关的错误

  • 间接引用坏指针
  • 读未初始化的存储器
  • 允许栈缓冲区溢出
  • 假设指针和指向他们的对象大小是相同的。
  • 造成错位错误
  • 引用指针,而不是他所指向的对象。
  • 误解指针运算
  • 引用不存在的变量
  • 引用空闲堆块中的数据
  • 引起存储器泄露

实践过程

实现一个简单的分配器

  • 源代码

技术分享

代码托管

代码托管链接

技术分享

技术分享

心得体会

  • 本周学习的是虚拟存储器这一章的知识,我把操作系统、数据结构、汇编语言以及C语言的很多相关知识都结合了起来,融会贯通,这让我对存储器的概念有了一个更深入的认识。虚拟存储器是对主存的一个抽象。 我明白了支持虚拟存储器的处理器是通过使用一种叫做虚拟寻址的间接形式来引用主存的,处理器还会产生一个虚拟地址,在被发送到主存之前,这个地址被翻译成一个物理地址。而专门的硬件通过使用页表来翻译虚拟地址,页表的内容是由操作系统提供的。
  • 印象最深的还是这章最后一节C程序中常见的与存储器有关的错误,我以前就遇到过很多类似的问题,每次都不知所措,网上有解决办法的话,就一个一个的试,如果没有,那也就搁浅了。看了这一节相关内容后,我还是受了一些启发的,比如一个程序如果不检查输入串的大小就写入栈中的目标缓冲区的话,程序就会出现缓冲区溢出错误。再比如在进程的虚拟地址空间中,有较大的洞,它没有映射到任何有意义的数据,如果试图引用一个指向这些洞的指针,操作系统就会以段异常来终止程序。
  • 我觉得这本《深入理解计算机系统》教材上的内容如果都掌握了,那肯定是非常了得的!所以我还会继续学习它!Keep Moving~

学习进度条

  代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时  
第一周 0/0 1/2 20/20  
第二周 58/58 1/3 20/40  
第三周 150/208 1/4 22/62  
第五周 150/358 1/5 21/83  
第六周 136/494 1/6 25/108  
第七周 115/609 2/8 24/132  
第八周 0/609 2/10 22/154  
第九周 109/718 3/13 20/174  
第十周 472/1190 1/14 21/195  
第十一周 1883/3073 3/17 21/216  
第十二周 0/3073 2/19 20/236  
第十三周 1023/4096 1/20 21/257  
第十四周 227/4323 1/21 12/269  

20145326蔡馨熤《信息安全系统设计基础》第14周学习总结