20145233 《信息安全系统设计基础》第十四周学习总结
教材学习总结
物理和虚拟寻址
物理地址
-
计算机系统的主存被组织成一个由M个连续的字节大小的单元组成的数组,每字节都有一个唯一的物理地址PA。
-
根据物理地址寻址的是物理寻址。
虚拟地址
-
虚拟存储器被组织为一个由存放在磁盘上的N个连续的字节大小的单元组成的数组。
-
使用虚拟寻址时,CPU通过生成一个虚拟地址VA来访问主存,这个虚拟地址在被送到存储器之前先转换成适当的物理地址(这个过程叫做地址翻译,相关硬件为存储器管理单元MMU)
地址空间
地址空间
- 地址空间是一个非负整数地址的有序集合:
{0,1,2,……}
线性地址空间
- 地址空间中的整数是连续的。
虚拟地址空间
- CPU从一个有 N=2^n 个地址的地址空间中生成虚拟地址,这个地址空间成为称为虚拟地址空间。
地址空间的大小
-
由表示最大地址所需要的位数来描述。
-
N=2^n:n位地址空间
主存中的每个字节都有一个选自虚拟地址空间的虚拟地址和一个选自物理地址空间的物理地址。
虚拟存储器作为缓存的工具
-
虚拟存储器——虚拟页VP,每个虚拟页大小为P=2^平字节
-
物理存储器——物理页PP,也叫页帧,大小也为P字节。
-
任意时刻,虚拟页面的集合都被分为三个不相交的子集:
- 未分配的:VM系统还没分配/创建的页,不占用任何磁盘空间。
- 缓存的:当前缓存在物理存储器中的已分配页
- 未缓存的:没有缓存在物理存储器中的已分配页
DRAM缓存的组织结构
这种缓存结构:
- 不命中处罚很大
- 是全相联的——任何虚拟页都可以放在任何的物理页中。
- 替换算法精密
- 总是使用写回而不是直写。
页表
- 页表是一个数据结构,存放在物理存储器中,将虚拟页映射到物理页。
- 页表就是一个页表条目PTE的数组,组成为:
有效位+n位地址字段
1.如果设置了有效位:
地址字段表示DRAM中相应的物理页的起始位置,这个物理页中缓存了该虚拟页
2.如果没有设置有效位:
(1)空地址:
表示该虚拟页未被分配
(2)不是空地址:
这个地址指向该虚拟页在磁盘上的起始位置。
虚拟存储器作为存储器管理的工具
- 操作系统为每个进程提供了一个独立的页表,也就是一个独立的虚拟地址空间。
- 抖个虚拟页面可以映射到同一个共享物理页面上。
- 存储器映射:将一组连续的虚拟页映射到任意一个文件中的任意位置的表示法。
虚拟存储器作为存储器保护的工具
这里需要知道PTE的三个许可位:
- SUP:表示进程是否必须运行在内核模式下才能访问该页
- READ:读权限
- WRITE:写权限
地址翻译
- 地址翻译是一个N元素的虚拟地址空间(VAS)中的元素和一个M元素的物理地址空间(PAS)之间的映射。MAP:VAS→PAS∪空
- MAP(A)=
- A:如果虚拟地址A处的数据在PAS的物理地址A处'
- 空:如果虚拟地址A处的数据不在物理存储器中
地址翻译过程 - CPU中的一个控制寄存器,页表基址寄存器指向当前页表;
- n位的虚拟地址包括以下两个部分:一个p位的虚拟页面偏移和一个(n-p)位的虚拟页号;
- MMU用后者选择适当的PTE,再将物理页号和虚拟地址中的VPO串联起来得到物理地址;
- 因为物理和虚拟页面都是P字节的,所以物理页面偏移和VPO是相同的。
动态存储器分配
动态存储器分配器
- 当运行时需要额外虚拟存储器时,使用动态存储器分配器维护一个进程的虚拟存储器区域。分配器有两种风格。
- 显示分配器:要求应用显式地释放任何已经分配的块。
- 隐式分配器:要求分配器检测一个已分配块何时不再被程序所使用,就释放这个块。也叫做垃圾收集器。
malloc和free函数
- C标准库提供了一个称为malloc程序包的显式分配器,程序通过调用malloc函数来从标准堆中分配块。
void *malloc(size_t size);
若成功则为指针,若出错则为NULL。
- 通过调用free函数来释放已分配的块。
void free(void *ptr);
分配器的目标和要求
- 显式分配器工作的约束条件:
- 处理任意请求序列。
- 立即响应请求。
- 只使用堆。
- 对齐块(对齐要求)。
- 不修改已分配的额块。
- 理想分配器的目标:
- 最大化吞吐率:吞吐率定义为每个单位时间里完成的请求数。
- 最大化存储器利用率:最有用的标准是峰值利用率。
垃圾收集
垃圾收集器是一种动态存储分配器。,自动释放程序已经不再需要的已分配快(垃圾)。
垃圾收集器的基本知识
- 垃圾收集器将存储器视为一张有向可达图,图的节点被分配为一组根节点和一组堆节点。当存在一条从任意根节点出发到并到达P的有向路径时,就称节点P是可达的。
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语言中常见的与存储器有关的错误
- 间接引用坏指针:在进程的虚拟地址空间中有较大的洞,没有映射到任何有意义的数据,如果试图引用一个指向这些洞的指针,操作系统就会以段异常来终止程序。典型的错误是:scanf("%d",val);
- 读未初始化的存储器:虽然bass存储器位置总是被加载器初始化为0,但对于堆存储器却并不是这样的。
- 允许栈缓冲区溢出:如果一个程序不检查输入串的大小就。写入栈中的目标缓冲区,程序就会出现缓冲区溢出错误。
- 假设指针和指向他们的对象大小是相同的。
- 造成错位错误。
- 引用指针,而不是他所指向的对象。
- 误解指针运算:忘记了指针的算术操作是以它们指向的对象的大小为单位来进行,而这种大小单位不一定是字节。
- 引用不存在的变量。
- 引用空闲堆块中的数据。
- 引起存储器泄露:当不小心忘记释放已分配块,而在堆里创建了垃圾时,就会引起存储器泄露。
练习题
习题9.2
确定下列虚拟地址大小(n)和页大小(P)的组合所需要的PTE数量
n P=2^p #PTE
16 4K 16
16 8K 8
32 4K 1M
32 8K 512K
因为每个虚拟页面都是 P = 2p个字节,所以在系统中总共有2n/2^p = 2(n-p)个可能的页面,其中每个都需要一个页表条目(PTE)。K=210,M=220,G=230,T=240,P=250,E=2^60
练习题9.3
给定一个32位的虚拟地址空间和一个24位的物理地址,对于下面的页面大小P,确定VPN,VPO,PPN,PPO的位数。VPN——虚拟页号;VPO——虚拟页面偏移量;PPN——物理页号;PPO——物理页面偏移量。
P = 1KB——>VPN = 22,VPO = 10,PPN = 14,PPO = 10
P = 4KB——>VPN = 20,VPO = 12,PPN = 12,PPO = 12
代码链接
- 因为上周我已经跑完了老师所给的代码,所以在这里我贴上自己上周的博客链接
-代码运行
代码托管链接
总结思考
- 本周的学习任务只有书上第九章的内容,第九章讲的是虚拟存储器的内容,学完本章的内容,整本书也算是过完了一遍,但是需要我加固的地方还有很多,其他几章中都有自己没有搞清楚的地方。
- 并且第九章有很多内容对之前学的地方有所关联,前面进程堆栈的内容也好理解了很多。下周是最后一次考试了,争取好好复习,能拿个高分。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 24篇 | 350小时 | |
第一周 | 0/0行 | 1/2 | 20小时 | |
第二周 | 53/53行 | 1/3 | 25/45小时 | |
第三周 | 130/183行 | 1/4 | 30/75小时 | |
第四周 | 0/183行 | 0/4 | 5/80小时 | |
第五周 | 158/341行 | 1/5 | 30/110小时 | |
第六周 | 84/425行 | 2/7 | 30/140小时 | |
第七周 | 209/634行 | 1/7 | 30/170小时 | |
第八周 | 0/634行 | 2/9 | 25/195小时 | |
第九周 | 83/717行 | 2/11 | 30/225小时 | |
第十周 | 421/1138行 | 2/13 | 25/250小时 | |
第十一周 | 1827/2965行 | 2/15 | 30/280小时 | |
第十二周 | 0/2965行 | 3/18 | 20/300小时 | |
第十三周 | 873/3838行 | 1/19 | 25/325小时 | |
第十四周 | 0/3838行 | 1/20 | 25/350小时 |
参考资料
-教学进程
- 课本上第九章的内容
- 老师本周所给的代码、PPT等资料。