2017-2018-1 20155324 《信息安全系统设计基础》第十四周学习总结

2017-2018-1 20155324 《信息安全系统设计基础》第十四周学习总结

找出全书你认为学得最差的一章,深入重新学习一下,要求(期末占5分):
•总结新的收获
•给你的结对学习搭档讲解或请教,并获取反馈
•参考上面的学习总结模板,把学习过程通过博客(随笔)发表,博客标题“学号 《信息安全系统设计基础》第十四周学习总结”,博客(随笔)要通过作业提交,截至时间本周日 23:59。

教材学习内容总结

第九章 虚拟存储器

虚拟存储器

虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。目前,大多数操作系统都使用了虚拟内存,如Windows家族的“虚拟内存”;Linux的“交换空间”等。

虚拟内存别称虚拟存储器(Virtual Memory)。电脑中所运行的
程序均需经由内存执行,若执行的程序占用内存很大或很多,则会导致内存消耗殆尽。为解决该问题,Windows中运用了虚拟内存[2] 技术,即匀出一部分硬盘空间来充当内存使用。当内存耗尽时,电脑就会自动调用硬盘来充当内存,以缓解内存的紧张。若计算机运行程序或操作所需的随机存储器(RAM)不足时,则 Windows 会用虚拟存储器进行补偿。它将计算机的RAM和硬盘上的临时空间组合。当RAM运行速率缓慢时,它便将数据从RAM移动到称为“分页文件”的空间中。将数据移入分页文件可释放RAM,以便完成工作。 一般而言,计算机的RAM容量越大,程序运行得越快。若计算机的速率由于RAM可用空间匮乏而减缓,则可尝试通过增加虚拟内存来进行补偿。但是,计算机从RAM读取数据的速率要比从硬盘读取数据的速率快,因而扩增RAM容量(可加内存条)是最佳选择。

虚拟内存是Windows 为作为内存使用的一部分硬盘空间。虚拟内存在硬盘上其实就是为一个硕大无比的文件,文件名是PageFile.Sys,通常状态下是看不到的。必须关闭资源管理器对系统文件的保护功能才能看到这个文件。虚拟内存有时候也被称为是“页面文件”就是从这个文件的文件名中来的。

内存在计算机中的作用很大,电脑中所有运行的程序都需要经过内存来执行,如果执行的程序很大或很多,就会导致内存消耗殆尽。为了解决这个问题,WINDOWS运用了虚拟内存技术,即拿出一部分硬盘空间来充当内存使用,这部分空间即称为虚拟内存,虚拟内存在硬盘上的存在形式就是 PAGEFILE.SYS这个页面文件。

image

虚拟存储器是由硬件和操作系统自动实现存储信息调度和管理的。它的工作过程包括6个步骤:
  1. 中央处理器访问主存的逻辑地址分解成组号a和组内地址b,并对组号a进行地址变换,即将逻辑组号a作为索引,查地址变换表,以确定该组信息是否存放在主存内。
  2. 如该组号已在主存内,则转而执行④;如果该组号不在主存内,则检查主存中是否有空闲区,如果没有,便将某个暂时不用的组调出送往辅存,以便将这组信息调入主存。
  3. 从辅存读出所要的组,并送到主存空闲区,然后将那个空闲的物理组号a和逻辑组号a登录在地址变换表中。
  4. 从地址变换表读出与逻辑组号a对应的物理组号a。
  5. 从物理组号a和组内字节地址b得到物理地址。
  6. 根据物理地址从主存中存取必要的信息。
调度方式有分页式、段式、段页式3种。
虚存的访问过程

虚存空间的用户程序按照虚地址编程并存放在辅存中。程序运行时,由地址变换机构依据当时分配给该程序的实地址空间把程序的一部分调入实存。每次访存时,首先判断该虚地址所对应的部分是否在实存中:如果是,则进行地址转换并用实地址访问主存;否则,按照某种算法将辅存中的部分程序调度进内存,再按同样的方法访问主存。由此可见,每个程序的虚地址空间可以远大于实地址空间,也可以远小于实地址空间。前一种情况以提高存储容量为目的,后一种情况则以地址变换为目的。后者通常出现在多用户或多任务系统中:实存空间较大,而单个任务并不需要很大的地址空间,较小的虚存空间则可以缩短指令中地址字段的长度。

9.1 物理与虚拟寻址
  • 物理地址(Physical Address,PA):计算机系统的主存被组织为M个连续的字节大小的单元组成的数组。每个字节的地址叫物理地址.

  • 物理地址(Physical Address,PA):计算机系统的主存被组织为M个连续的字节大小的单元组成的数组。每个字节的地址叫物理地址.

  • 早期的PC,数字信号处理器,嵌入式微控制器以及Cray超级计算机使用物理寻址。

  • 现代处理器使用的是虚拟寻址(virtual addressing)的寻址形式。

image

  • CPU通过生成一个虚拟地址(Virtual address,VA)来访问主存。

  • 地址翻译也需要CPU硬件和操作系统之间的紧密结合。

  • CPU芯片上有叫做存储器管理单元(Memory Management Unit,MMU)的专用硬件。

9.2 地址空间
  • 一个包含N=2^n个地址的虚拟地址空间就叫做一个n位地址空间

  • 主存中的每个字节都有一个选自虚拟地址空间的虚拟地址和一个选自物理地址空间的物理地址
    image

9.3 虚拟存储器作为缓存的工具
  • 虚拟存储器被组织为一个由存放在磁盘上的N个连续的字节大小的单元组成的数组。每个字节都有一个唯一的虚拟地址,这个唯一的虚拟地址是作为到数组的索引的

  • 磁盘上数据的内容被缓存在主存中

  • 和存储器层次结构中其他缓存一样,磁盘上的数据被分割成块,这些块作为磁盘和主存之间的传输单元

DRAM缓存的组织结构处理过程如下:

读取虚拟地址所指向的PT。

读取PTE有效位,发现未被缓存,触发缺页异常。

调用缺页异常处理程序

选择牺牲页。

如果牺牲页发生了改变,将其拷贝回磁盘(因为是写回)

需要读取的页代替了牺牲页的位置。

结果:牺牲也不被缓存,需要读取的页被缓存。

中断结束,重新执行最开始的指令。

在DRAM中读取成功。

image

image

image

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

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

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

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

简化链接

独立的空间地址意味着每个进程的存储器映像使用相同的格式。

文本节总是从0x08048000(32位)处或0x400000(64位)处开始。

然后是数据,bss节,栈。
一致性极大简化了链接器的设计和实现。

简化加载

加载器可以从不实际拷贝任何数据从磁盘到存储器。

基本都是虚拟存储系统完成。

简化共享

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

操作相同的操作系统内核代码

C标准库的printf.

  • 因此操作系统需要将不同进程的适当的虚拟页映射到相同的物理页面。

多个进程共享这部分代码的一个拷贝。

而不是每个进程都要加载单独的内核和C标准库的拷贝。

简化存储器分配

即虚拟页连续(虚拟页还是单独的),物理页可以不连续。使得分配更加容易。

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

任何现代操作系统必须为操作系统提供手段来控制对存储器系统的访问。

  • 不应该允许用户进程修改它的只读文本段。
  • 不允许它读或修改任何内核的代码和数据结构
  • 不允许读写其他进程的私有存储器。
  • 不允许修改共享的虚拟页,除非所有共享者显示允许这么做(通过调用明确的进程间通信)

link

  • SUP: 是否只有在内核模式下才能访问?
  • READ: 读权限。
  • WRITE: 写权限。
9.6 地址翻译

image

  • 形式上来说,地址翻译是一个N元素的虚拟地址空间(VAS)中的元素和一个M元素的物理地址空间(PAS)元素之间的映射

image

image

图(a)展示页面命中,CPU硬件执行过程:
  • 第一步:处理器生成虚拟地址,把它传送给MMU。
  • 第二步: MMU生成PTE地址(PTEA),并从高速缓存/主存请求中得到它。
  • 第三步: 高速缓存/主存向MMU返回PTE。
  • 第四步: MMU构造物理地址(PA),并把它传送给高速缓存/主存。
  • 第五步: 高速缓存/主存返回所请求的数据字给处理器。

页面命中完全由硬件处理,与之不同的是,处理缺页需要 硬件和操作系统内核协作完成。

第一到三步: 与命中时的一样

第四步:PTE有效位是零,所以MMU触发异常,传递CPU中的控制到操作系统内核中的 缺页异常处理程序。

第五步:缺页异常处理程序确定出物理存储页中的牺牲页,如果这个页面已经被修改,则把它换出到磁盘。

第六步:缺页异常处理程序调入新的页面,并更新存储器中的PTE。

第七部:缺页异常处理程序返回到原来的进程,再次执行导致缺页的指令,之后就是页面命中一样的步骤。

9.7 案例研究: Intel Core i7/Linux 存储器系统

image

处理器包(processor package)

四个核
层次结构的TLB

  • 虚拟寻址
  • 四路组相连
  • Linux 一页4kb

层次结构的数据和指令高速缓存。

  • 物理寻址
  • L1,L2 八路组相连
  • L3 十六路组相连
  • 块大小64字节

快速的点到点链接。

  • 基于Intel QuickPath技术
  • 为了让核与其他核和外部I/O桥直接通信

L3高速缓存

DDR3存储器控制器

9.7.2 Linux 虚拟存储系统

image

内核虚拟存储器

  • 内核虚拟存储器包含内核中的代码和数据。
  • 内核虚拟存储器的某些区域被映射到所有进程共享的物理页面
  • 如:内核代码,全局数据结构。
  • Linux也将一组连续的虚拟页面(大小等同于系统DRAM总量)映射到相应的一组物理页面。
  • 内核虚拟存储器包含每个进程不相同的数据。
  • 页表,内核在进程上下文中时使用的栈,等等。
Linux 虚拟存储器区域

Linux将虚拟存储器组织成一些区域(也叫做段)的集合。

  • 一个区域就是已经存在着的(已分配的) 虚拟存储器的连续片,这些片/页已某种形式相关联。
  • 代码段,数据段,堆,共享库段,用户栈。
  • 所有存在的虚拟页都保存在某个区域。
  • 区域的概念很重要
  • 允许虚拟地址空间有间隙。
  • 一个进程中虚拟存储器的内核数据结构。

mmap

  1. vm_area_structs(区域结构)
  2. 每个vm_area_structs都描述了当前虚拟地址空间的一个区域(area).
  3. vm_start:指向这个区域的起始处。
  4. vm_end:指向这个区域的结束处。
  5. vm_port:描述这个区域内包含的所有页的读写许可权限。
  6. vm_flags:描述这个区域页面是否与其他进程共享,还是私有。
  7. vm_next: 指向链表的下一个区域。
9.8 存储器映射

存储器映射: Linux通过将一个虚拟存储器区域与一个磁盘上的对象关联起来,以初始化这个虚拟存储器区域的内容,这个过程叫做存储器映射。

虚拟存储器区域可以映射到以下两种类型文件。

  • 一旦一个虚拟页面被初始化了,它就在一个由内核维护的专门的交换文件(swap file)之间换来换去。交换文件也叫交换空间或者交换区域。
  • 需要意识到,在任何时刻,交换空间都限制着当前运行着的进程分配的虚拟页面总数。
9.9 动态存储器分配

虽然可以使用更低级的mmap和munmap函数来创建和删除虚拟存储器的区域。

但是C程序员还是觉得用动态存储器分配器(dynamic memory allocator)更方便。

image
解:

image
解:

image

解:

image

image

代码实现:

#include"csapp.h"  

void mmapcopy(int fd,int fd1,int size){  
    char *bufp;  
    bufp =(char *)mmap(NULL,size,PROT_READ,MAP_PRIVATE,fd,0); 
    write(1,bufp,size);
    munmap(bufp,size);
    return;  
}  

int main(int argc,char **argv){  
    struct stat _stat; 
    int fd,fd1;  
    if(argc != 2){  
        printf("usage :%s <filename>",argv[0]);  
        exit(0);  
    }  
    fd = open(argv[1],O_RDONLY,0);  
    fstat(fd,&_stat);
    mmapcopy(fd,fd1,_stat.st_size);    
    return 0;  
}  

image

image

其他(感悟、思考等,可选)

本学期的课程虽然已经接近尾声了,但是我们学习的道路才刚刚开始。不能因为最后一段路就要放松警惕,更要提高自我意识,通过自己的努力来走好每一段路。

代码托管

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 85/85 1/1 5/5
第二周 150/230 1/2 10/15
第三周 50/280 1/3 7/22
第四周 70/350 1/4 5/27
第五周 100/450 2/6 5/32
第六周 50/500 1/7 10/42
第七周 70/570 2/9 10/55
第八周 80/650 1/10 8/63
第九周 100/750 3/13 8/71
第十周 80/830 1/14 8/79
第十一周 50/880 2/16 10/89
第十二周 40/920 1/17 10/89
第十三周 60/980 2/19 10/89
第十四周 80/1070 1/20 10/99

尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。

参考:软件工程软件的估计为什么这么难软件工程 估计方法

  • 计划学习时间:XX小时

  • 实际学习时间:XX小时

  • 改进情况:

(有空多看看现代软件工程 课件
软件工程师能力自我评价表
)

参考资料

posted @ 2017-12-24 23:21  20155324  阅读(237)  评论(0编辑  收藏  举报