20145310《信息安全系统设计基础》第十四周学习总结

20145310《信息安全系统设计基础》第十四周学习总结

教材学习内容总结

虚拟存储器是硬件异常、硬件地址翻译、主存、磁盘文件和内核软件的完美交互,它为每个进程提供了一个大的、一致的和私有的地址空间。

虚拟存储器的三个重要功能:

1. 将主存看做是一个存储在磁盘上的地址空间的高速缓存,在主存中只保护活动区域。
2. 为每个进程提供了一致的地址空间,从而简化了存储器管理。
3. 保护了每个进程的地址空间不被其他进程破坏。

9.1 物理和虚拟寻址

计算机系统的主存被组织成一个由M个连续的字节大小的单元组成的数组,每字节都有一个唯一的物理地址(PA)。CPU根据物理地址访问存储器的方式是物理寻址。

使用虚拟寻址时,CPU通过生成一个虚拟地址VA来访问主存,这个虚拟地址在被送到存储器之前先转换成适当的物理地址,地址翻译通过CPU芯片上的存储器管理单元完成。

9.2 地址空间

地址空间是一个非负整数地址的有序集合:{0,1,2,......}

线性地址空间:地址空间中的整数是连续的。

虚拟地址空间:CPU从一个有N=2^n个地址的地址空间中生成虚拟地址。

物理地址空间:与系统中的物理存储器的M个字节相对应。

地址空间大小:由表示最大地址所需要的位数来描述。

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

物理存储器被分割为物理页(PP)。

VM系统将虚拟存储器分割为虚拟页(VP),大小为P=2^p字节,虚拟页面的集合分为三个不相交的子集:

未分配的:系统还未分配的页,未存储数据,不占用磁盘空间。

缓存的:当前缓存在物理存储器中的已分配页

未缓存的:没有缓存在物理存储器中的已分配页。

DRAM缓存的组织结构

DEAM缓存的组织结构完全是由巨大的不命中开销驱动。

DRAM缓存是全相联的,任何虚拟页都可以放置在任何的物理页中。

DRAM缓存总是使用写回。

页表

页表:是一个数据结构,存放在物理存储器中,将虚拟页映射到物理页,就是一个页表条目的数组。

页表就是一个页表条目PTE的数组。

PTE:由一个有效位和一个n位地址字段组成的,表明了该虚拟页是否被缓存在DRAM中。

页表的组成:有效位+n位地址字段

如果设置了有效位:地址字段表示DRAM中相应的物理页的起始位置,这个物理页中缓存了该虚拟页。

如果没有设置有效位:

空地址:表示该虚拟页未被分配

不是空地址:这个地址指向该虚拟页在磁盘上的起始位置。

页命中

当CPU读取一个字的时候,地址翻译硬件将虚拟地址作为一个索引来定位PTE,并从存储器中读取它。

缺页

DRA缓存不命中称为缺页。

在不命中发生时,换入页面的策略称为按需页面调度。

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

操作系统为每个进程提供了一个独立的页表,也就是一个独立的虚拟地址空间。

多个虚拟页面可以映射到同一个共享物理页面上。

存储器映射:将一组连续的虚拟页映射到任意一个文件中的任意位置的表示法。

按需页面调度和独立的虚拟地址空间的结合简化了链接和加载、代码和数据共享,以及应用程序的存储器分配。

简化链接:独立的地址空间允许每个进程的存储器映像使用相同的基本格式,而不管代码和数据实际存放在物理存储器的何处。

简化加载:虚拟存储器使得容易想存储器中加载可执行文件和共享文件对象。

简化共享:独立地址空间为操作系统提供了一个管理用户进程和操作系统自身之间共享的一致机制。

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

通过在PTE上添加一些额外的许可来控制对一个虚拟页面的内容访问。

9.6 地址翻译

地址翻译就是一个N元素的虚拟地址空间VAS中的元素和一个M元素的物理地址空间PAS中元素之间的映射。

页面基址寄存器PTBR指向当前页表。

MMU利用VPN选择适当的PTE。

PPO=VPO。

多级页表

多级页表——采用层次结构,用来压缩页表。

以两层页表层次结构为例,好处是:

如果一级页表中的一个PTE是空的,那么相应的二级页表就根本不会存在;

只有一级页表才需要总是在主存中,虚拟存储器系统可以在需要时创建、页面调入或调出二级页表,只有最经常使用的二级页表才缓存在主存中。

Linux虚拟存储器系统

linux为每个进程维持了一个单独的虚拟地址空间,其中,内核虚拟存储器位于用户栈之上;

内核虚拟存储器包含内核中的代码和数据结构,还有一些被映射到一组连续的物理页面(主要是便捷地访问特定位置,比如执行I/O操作的时候需要的位置)

linux将虚拟存储器组织成一些区域(也叫做段)的集合。一个区域就是已经存在的(已分配的)虚拟存储器的连续片;

允许虚拟地址空间有间隙;内核不用记录那些不存在的页,这样的页也不用占用存储器;

一个具体区域的区域结构:

vm _start:指向这个区域的起始处;

vm _end:指向这个区域的结束处;

vm _prot:描述这个区域内所包含的所有页的读写许可权限;

vm _fags:描述这个区域内的页面是与其他进程共享的,还是这个进程私有的,等等;

vm _next:指向链表的下一个结构。

9.8 存储器映射

Linux通过将一个虚拟存储器区域与一个磁盘上的对象关联起来,以初始化这个虚拟存储器区域的内容,这个过程成为存储器映射。具体可以映射的对象有两种:

Unix文件系统中的普通文件。一个区域可以映射到一个普通磁盘文件的连续部分。

匿名文件。匿名文件由内核创建,包含的全是二进制的0。

一旦一个虚拟页面被初始化了,它就在一个由内核维护的专门的交换文件之间换来换去。交换文件也叫交换空间,或交换区域。

共享对象

一个对象被映射到虚拟存储器的一个区域,要么作为共享对象,要么作为私有对象。

一个映射到共享对象的虚拟存储器区域叫做共享区域,类似的,也有虚拟区域。

私有对象时使用一种叫做写时拷贝的技术被映射到虚拟存储器中的,相应私有区域的页表条目都被标记为只读,并且区域结构被标记为私有的写时拷贝。

execve函数

使用execve函数将a.out程序加载到存储器的过程Execve("a.out",NULL,NULL);

具体经过的步骤如下:

删除已存在的用户区域。
映射私有区域。
映射共享区域。
设置程序计数器。

使用map函数的用户级存储器映射

Unix进程可以使用mmap函数来创建新的虚拟存储器区域,并将对象映射到这些区域当中

void *mmap(void *start,size_t length,int prot,int flags,int fd,off_t offest);
若成功则为指向映射区域的指针,若出错则为MAP_FAILDE(-1)

munmap函数删除虚拟存储器的区域。

int munmap(void *start,size_t length);
若成功则返回0,若失败则返回-1.

9.9 动态存储器分配

动态存储器分配器

当运行时需要额外虚拟存储器时,使用动态存储器分配器维护一个进程的虚拟存储器区域。分配器有两种风格。

显示分配器:要求应用显式地释放任何已经分配的块。

隐式分配器:要求分配器检测一个已分配块何时不再被程序所使用,就释放这个块。也叫做垃圾收集器。

malloc和free函数

C标准库提供了一个称为malloc程序包的显式分配器,程序通过调用malloc函数来从标准堆中分配块。

void *malloc(size_t size);
若成功则为指针,若出错则为NULL。

通过调用free函数来释放已分配的块。

void free(void *ptr);

分配器的目标和要求

显式分配器工作的约束条件:

处理任意请求序列。

立即响应请求。

只使用堆。

对齐块(对齐要求)。

不修改已分配的额块。

理想分配器的目标:

最大化吞吐率:吞吐率定义为每个单位时间里完成的请求数。

最大化存储器利用率:最有用的标准是峰值利用率。

9.10 垃圾收集

垃圾收集器是一种动态存储分配器。,自动释放程序已经不再需要的已分配快(垃圾)。

垃圾收集器的基本知识

垃圾收集器将存储器视为一张有向可达图,图的节点被分配为一组根节点和一组堆节点。当存在一条从任意根节点出发到并到达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的后继。

9.11 C语言中常见的与存储器有关的错误

1.间接引用坏指针

常见错误:

——scanf错误

2.读未初始化的存储器

常见错误:

——假设堆存储器被初始化为0

3.允许栈缓冲区溢出

常见错误:

——缓冲区溢出错误

4.假设指针和它们指向的对象是相同大小的

在远处起作用action at distance

5.造成错位错误

6.引用指针,而不是它所指向的对象

7.误解指针运算

8.引用不存在的变量

9.引用空堆块中的数据

10.引起存储器泄露

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 100/100 1/2 10/10
第二周 150/250 1/3 12/22
第三周 200/450 1/4 20/42
第四周 300/750 1/5 20/62
第五周 300/1150 1/6 20/82
第六周 300/1450 1/7 20/102
第七周 200/1650 1/8 20/122
第八周 210/1860 1/9 20/142
第九周 210/2070 1/10 20/162
第十周 210/2070 1/11 20/182
第十一周 210/2280 1/12 20/202
第十二周 0/2070 1/13 20/222
第十三周 200/2270 1/14 20/242
第十四周 0/2270 1/14 20/262
posted @ 2016-12-18 23:09  20145310刘宇飞  阅读(142)  评论(1编辑  收藏  举报