# 2018-2019-1 20165316 《信息安全系统设计基础》第九周学习总结
2018-2019-1 20165316 《信息安全系统设计基础》第九周学习总结
教材学习内容总结
理解虚拟存储器的概念和作用
- 虚拟内存提供了三个重要的能力:
- 它将主存看成是一个存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,并根据需要在磁盘和主存之间来回传送数据,通过这种方式,高效的使用了主存。
- 它为每个进程提供了一致的地址空间,从而简化了存储器管理。
- 它保护了每个进程的地址空间不被其他进程破坏。
- 程序员需要理解虚拟内存
- 虚拟内存是核心的:有助于理解计算机系统的工作方式
- 虚拟内存是强大的:给与应用程序强大的能力
- 虚拟内存是危险的:合理地管理分配内存可以减少出错风险。
理解地址翻译的概念
- 地址翻译:一个N元素的虚拟地址空间(VAS)中的元素和一个M元素的物理地址空间(PAS)之间的映射:MAP: VAS → PAS ∪ ∅
- MAP = A' ,如果虚拟地址A处的数据在PAS的物理地址A'处
- MAP = ∅ ,如果虚拟地址A处的数据不在物理存储器中
- CPU中的一个控制寄存器,页表基址寄存器指向当前页表,n 位的虚拟地址包含两个部分:一个 p 位的虚拟页面偏移(VPO) 和一个(n-p)位的虚拟页号,页表条目中的物理页页号和虚拟地址中的VPO串联起来,就得到了相应的物理地址。
理解存储器映射
- 存储器映射:Linux通过将一个虚拟存储器区域与一个磁盘上的对象(object)关联起来,以初始化这个虚拟内存区域的内容的过程。
- 虚拟内存区域可以映射到两种对象中的一种:
- Linux 文件系统中的普通文件
- 匿名文件
- 一旦一个虚拟页面被初始化了,它就在一个由内核维护的专门的交换文件(swap file)之间换来换去。交换文件也叫交换空间,或交换区域。交换空间限制能够分配的虚拟页面总数。
掌握动态存储器分配的方法
- 当运行时需要额外虚拟存储器时,使用动态内存分配器维护一个进程的虚拟存储器区域。
- 分配器有两种基本风格。两种风格都要求应用显式地分配块。不同在于由哪个实体来负责释放已分配地块:
- 显示分配器:要求应用显式地释放任何已经分配的块。
- 隐式分配器:要求分配器检测一个已分配块何时不再被程序所使用,就释放这个块。也叫做垃圾收集器。
理解垃圾收集的概念
- 动态内存分配器,自动释放程序不再需要的已分配块。
- 垃圾收集器将内存视为一张有向可达图,从根节点出发,不可达的堆节点视为垃圾。两个节点的指向关系是其中一个节点包含另一个的位置信息。
了解C语言中与存储器有关的错误
- 间接引用坏指针
- 在进程的虚拟地址空间中有较大的洞,没有映射到任何有意义的数据,如果试图引用一个指向这些洞的指针,操作系统就会以段异常来终止程序。
- 典型的错误是:scanf("%d",val);,没有加&符号
- 读未初始化的内存
- 虽然bass存储器位置总是被加载器初始化为0,但对于堆存储器却并不是这样的。
- 常见的错误就是假设堆存储器被初始化为0.
- 允许栈缓冲区溢出
- 如果一个程序不检查输入串的大小就写入栈中的目标缓冲区,程序就会出现缓冲区溢出错误。
- 假设指针和指向他们的对象大小是相同的。
- 造成错位错误。
- 引用指针,而不是他所指向的对象。
- 误解指针运算
- 忘记了指针的算术操作是以它们指向的对象的大小为单位来进行,而这种大小单位不一定是字节。
- 引用不存在的变量
- 引用空闲堆块中的数据
- 引起存储器泄露
- 当不小心忘记释放已分配块,而在堆里创建了垃圾时,就会引起存储器泄露。
代码托管
学习进度条
| | 代码行数(新增/累积)| 博客量(新增/累积)|学习时间(新增/累积)|
| -------- | :----------------😐:----------------😐:---------------: |:-----😐
| 目标 | 1000行 | 30篇 |400小时 | |
| 第一周 | 156/200 | 2/2 | 20/20 | |
| 第二周 | 121/200 | 2/2 | 18/30 | |
| 第三周 | 107/200 | 2/2 | 15/30
| 第四周 | 111/200 | 2/2 | 16/30
| 第五周 | 101/200 | 1/1 | 18/30
| 第六周 | 110/200 | 2/2 | 19/30
| 第七周 | 90/200 | 1/1 | 18/30
| 第八周 | 93/200 | 1/1 | 15/30
| 第九周 | 265/200 | 1/1 | 25/30