2017-2018-1 20155304 《信息安全系统设计基础》第十一周学习总结
教材学习内容总结
物理和虚拟寻址
物理寻址:计算机系统的主存被组织成一个由M个连续的字节大小的单元组成的数组。每字节都有一个唯一的物理地址PA。第一个字节的地址为0,接下来的字节的地址为1,再下一个为2,依此类推。给定这种简单的结构,CPU访问存储器的最自然的方式就是使用物理地址,我们把这种方式称为物理寻址。
虚拟寻址:使用虚拟寻址时,CPU通过生成一个虚拟地址来访问主存,这个虚拟地址在被送到存储器之前先转换成适当的物理地址。将一个虚拟地址转换为物理地址的任务叫做地址翻译。
CPU芯片上叫做存储器管理单元的专用硬件,利用存放在主存中的查询表来动态翻译虚拟地址,该表的内容是由操作系统管理。
地址空间
- 线性地址空间:地址空间中的整数是连续的一个非整数地址的有序集合:{0,1,2,...}。
- 虚拟地址空间:在一个带虚拟存储器的系统中,CPU从一个有N = 2 ^ n个地址空间中生成虚拟地址。{0,1,2,3,...,N-1}。
- 一个地址空间的大小是由表示最大地址所需要的倍数来描述的。
- 虚拟存储器的基本思想:允许每个数据对象有多个独立的地址,其中每个地址都选自一个不同的地址空间。
虚拟存储器作为缓存的工具
每个字节都有一个唯一的虚拟地址
每个虚拟页大小为P=2^p字节
在任意时刻,虚拟页面的集合都被分为三个不相交的子集:
未分配的:VM系统还没分配/创建的页,不占用任何磁盘空间
缓存的:当前缓存在物理存储器中的已分配页
未缓存的:没有缓存在物理存储器中的已分配页
物理存储器被分割为物理页(PP),也叫页帧,大小也为P字节
DRAM缓存的组织结构
DRAM缓存来表示虚拟存储器系统的缓存
DRAM缓存的组织结构完全是由巨大的不命中开销驱动的
DRAM缓存总是使用写回,而不是直写
页表:是一个数据结构,存放在物理存储器中,将虚拟页映射到物理页,就是一个页表条目的数组
页表就是一个页表条目的数组
PTE:由一个有效位和一个n位地址字段组成的
DRAM缓存不命中称为缺页
在磁盘和存储器之间传送页的活动叫做交换或者页面调度
颠簸:工作集大小超出了物理存储器的大小
虚拟存储器作为存储器管理工具
多个虚拟页面可以映射到同一个共享物理页面上
简化链接:独立的地址空间允许每个进程的存储器映像使用相同的基本格式,而不管代码和数据实际存放在物理存储器的何处
简化加载:虚拟存储器使得容易想存储器中加载可执行文件和共享对象文件
简化共享:独立地址空间为操作系统提供了一个管理用户进程和操作系统自身之间共享的一致机制
简化存储器分配:虚拟存储器为向用户进程提供一个简单的分配额外存储器的机制
虚拟存储器作为存储器保护的工具
PTE的三个许可位:
SUP:表示进程是否必须运行在内核模式下才能访问该页
READ:读权限
WRITE:写权限
Linux虚拟存储器系统
1.Linux虚拟存储器区域
某个区域中,而不属于某个区域的虚拟页是不存在的,并且不能被进程引用。
2.一个具体区域结构包含的字段:
(1)vm_start:指向这个区域的起始处。
(2)vm_end:指向这个区域的结束处。
(3)vm_prot:描述这个区域的内包含的所有页的读写许可权限。
(4)vm_flags:描述这个区域内页面是与其他进程共享的,还是这个进程私有的(还描述了其他一些信息)。
(5)vm_next:指向链表中下一个区域结构。
存储器映射
1.再看共享对象
(1)共享区域:
一个映射到共享对象的虚拟存储器区域叫做共享区域。
共享对象的关键点在于即使对象被映射到了多个共享区域,物理存储器也只需要存放共享对象的一个拷贝。一个共享对象物理页面不一定是连续的。
(2)私有对象是使用写时拷贝巧妙技术被映射到虚拟存储器中的。
2.再看fork函数
当fork函数被当前进程调用时,内核为新进程创建各种数据结构,并分配给它一个唯一的PID。
3.再看execve函数
execve函数在当前进程中加载并运行包含在可执行目标文件a.out中的程序,用a.out程序有效地替代了当前程序。
4.使用mmap函数的用户级存储器映射
mmap函数要求内核创建一个新的虚拟存储器区域,最好是从地址start开始的一个区域,并将文件描述符fd指定的对象的一个连续的片映射到这个新区域。
C语言中常见的与存储器有关的错误
- 间接引用坏指针。
- 读未初始化的存储器。
- 允许栈缓冲区溢出。
- 假设指针和指向他们的对象大小是相同的。
- 造成错位错误。
- 引用指针,而不是他所指向的对象。
- 误解指针运算。
- 引用不存在的变量。
- 引用空闲堆块中的数据。
- 引起存储器泄露。
其他(感悟、思考等,可选)
本周学习了第9章的内容,虚拟存储器,内容和操作系统和有一部分相同,但是感觉还是有很多不同的。主要注重学习了不同的方面,了解了虚拟存储器的工作过程。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 47/100 | 1/1 | 10/10 | |
第二周 | 180/200 | 1/1 | 10/10 | |
第三周 | 200/300 | 1/1 | 10/10 | |
第五周 | 190/300 | 1/1 | 10/10 | |
第六周 | 220/300 | 2/2 | 10/10 | |
第七周 | 320/500 | 2/2 | 10/10 | |
第八周 | 320/500 | 3/3 | 10/10 | |
第九周 | 400/500 | 3/3 | 10/10 | |
第十一周 | 400/500 | 2/2 | 10/10 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
-
计划学习时间:XX小时
-
实际学习时间:XX小时
-
改进情况:
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)