2017-2018-1 20155334 《信息安全系统设计基础》第十一周学习总结
2017-2018-1 20155334 《信息安全系统设计基础》第十一周学习总结
学习目标
- 理解虚拟存储器的概念和作用
- 理解地址翻译的概念
- 理解存储器映射
- 掌握动态存储器分配的方法
- 理解垃圾收集的概念
- 了解C语言中与存储器有关的错误
虚拟存储器:
虚拟存储器,是由N个字节组成的,它存在于磁盘上,不是存储器内存上。
虚拟存储器是硬件异常、硬件地址翻译、主存、磁盘文件和内核软件的完美交互,它为每个进程提供了一个大的、一致的和私有的地址空间。
通过一个很清晰的机制,虚拟存储器提供了三个重要的能力:
- 它将主存看成是一个存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,并根据需要在磁盘和主存之间来回传送数据,通过这种方式,它高效地使用了主存。
- 它为每个进程提供了一致的地址空间,从而简化了存储器管理。
- 它保护了每个进程的地址空间不被其他进程破坏。
物理和虚拟寻址:
物理寻址:主存被组织成一个由M个连续字节大小的单元组成的数组,依次类推的寻址方式称为物理寻址。虚拟存储器被组织为一个由存放在磁盘上的N个连续的字节大小的单元组成的数组。
虚拟寻址:CPU生成一个虚拟地址(VA)来访问主存,在被传送到存储器之前先转换成适当的物理地址。地址翻译通过CPU芯片上的存储器管理单元完成。地址翻译通过CPU芯片上的存储器管理单元完成。
页表:
同任何缓存一样,虚拟存储器系统必须有某种方法来判定一个虚拟页是否存放在DRAM中的某个地方。如果是,系统还必须确定这个虚拟页存放在哪个物理页中。如果不命中,系统必须判断这个虚拟页存放在磁盘的哪个位置,在物理存储器中选择一个牺牲页,并将虚拟页从磁盘拷贝到DRAM中,替换这个牺牲页。
这些功能是由许多软硬件联合提供的,包括操作系统软件,MMU(存储器管理单元)中地址翻译硬件和一个存放在物理存储器中叫做页表(page table)的数据结构,页表将虚拟页映射到物理页。页表就是一个页表条目(Page Table Entry,PTE)的数组。
Linux虚拟存储器系统:
Linux为每个进程维持了一个单独的虚拟地址空间。
内核虚拟存储器包含内核中的代码和数据结构。内核虚拟存储器的某些区域被映射到所有进程共享的物理页面。
例如,每个进程共享内核的代码和全局数据结构。
Linux虚拟存储器区域
Linux将虚拟存储器组织成一些区域(也叫做段)的集合。一个区域(area)就是已经存在着的(已分配的)虚拟存储器的连续片(chunk),这些页是以某种方式相关联的。例如,代码段、数据段、堆、共享库段,以及用户栈都不同的区域。每个存在的虚拟页面保存在某个区域中,而不属于某个区域的虚拟页是不存在的,并且不能被进程引用。区域的概念很重要,因为它允许虚拟地址空间有间隙。内核不用记录那些不存在的虚拟页,而这样的页也不占用存储器。磁盘或者内核本身的任何额外资源。
理解存储器映射
指Linux通过将一个虚拟存储器区域与一个磁盘上的对象关联起来,以初始化这个虚拟存储器区域的内容的过程。
映射对象:
- Unix文件系统中的普通文件
- 匿名文件(全都是二进制0)
malloc
和 free
函数:
系统调用
malloc
函数,从堆中分配块
#include <stdlib.h>
void *malloc(size_t size);//成功返回指针,指向大小至少为size字节的存储器块,失败返回NULL
free
函数:释放已分配的堆块。
#include <stdlib.h>
void free(void *ptr);//无返回值,ptr参数必须指向一个从malloc、calloc或者reallov获得的已分配块的起始位置。
ptr参数必须指向一个从malloc、calloc或者realloc获得的已分配的起始位置。
Tips
存储器是一系列存储单元的集合,一般情况下存储器主要有随机存取存储器RAM(Random Access Memory)和只读存储器ROM(Read Only Memory)两种,随机存取存储器RAM就像黑板一样,可以在里面写上东西, 也可以擦掉后再写上新的内容,即既可以读数据也可以写数据。只读存储器ROM事先把规定好的内容存入存储器,只能将规定内容读出,不能改写。无论是RAM还是ROM,为使CPU能准确找到存储有某个信息的存储单元,就必须为这些存储单元分配一个能相互区别的标识,这些标识就是我们通常所说的地址编码。实际情况下,计算机或其他处理器(如ARM,在ARM中内核采用冯。诺依曼结构,即数据和指令共用一个存储器混合编址)在上电或复位之前,存储器只是一些没有地址编码的物理存储器,计算机或嵌入式系统在上电后要想很好的工作,就要求存储器与计算机或处理器所拥有的地址编码资源建立一一映射的关系。一般情况下,处理器设计者会为每一个存储器分配一个数值连续,数目与其存储单元数相等,以16进制表示的自然数的集合作为该存储器的地址编码,这种自然数集合与存储器的对应关系就是存储器映射,可以把存储器映射理解为嵌入式系统上电(复位)时的预备动作。
计算机最重要的功能单元之一是Memory,memory是众多存储单元的集合,为了使CPU准确地找到存储有某个信息的存储单元,必须为这些单元分配一个相互区别的编号,这个编号就是地址编码。在嵌入式处理器内,集成了多种类型的Memory,通常我们称同一类型的Memory为一个Memory Block,一般情况下,处理器设计者会为每一个memory block分配一个数值连续、数目与其存储单元数相等、以16进制表示的自然数集合作为该memory block的地址编码。这种自然数集合与memory block的对应关系就是Memory Map(存储器映射、内存映射),有时也叫地址映射(Address Map)。在这里需要强调的是memory Map是一个逻辑概念,是在计算机系统在(上电)复位后才建立起来的。Memory Map相当于这样一个函数:函数的输入量是地址编码,输出量是被寻址单元中的数据。当计算机系统掉电后或复位时,这个函数就不复存在,只剩下实现这个函数的物理基础——电路连接。也可以这样认为:Memory Map是计算机系统上电(复位)时的预备动作,是一个将CPU所拥有的地址编码资源向系统内各个物理存储器块分配的自动过程。
动态存储器分配的方法
堆是一个请求二进制0的区域,紧接在未初始化的bss区域后开始,并向上(更高的地址)生长。有一个变量brk指向堆的顶部。
分配器有两种基本风格,都采用显示地分配块:
(1). 显示分配器:要求应用显式地释放任何已经分配的块。
(2). 隐式分配器:要求分配器检测一个已分配块何时不再被程序所使用,那么就释放这个块。也叫做垃圾收集器。
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 75/75 | 1/1 | 5/0 | |
第二周 | 135/210 | 1/2 | 4/9 | |
第三周 | 234/444 | 1/3 | 6/15 | |
第四周 | 486/930 | 1/4 | 8/23 | |
第五周 | 753/1683 | 3/7 | 43/66 | |
第六周 | 503/2186 | 2/9 | 54/120 | |
第七周 | 823/3006 | 2/11 | 43/163 | |
第八周 | 756/3762 | 1/12 | 52/215 | |
第九周 | 1120/4882 | 3/15 | 63/278 | |
第十周 | 420/5302 | 0/15 | 32/310 | |
第十一周 | 531/5833 | 2/17 | 46/356 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
-
计划学习时间:XX小时
-
实际学习时间:XX小时
-
改进情况:
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)