2017-2018-1 20155335《信息安全系统设计基础》第十一周学习总结
教材学习内容总结
- 理解虚拟存储器的概念
为解决内存小而作业大、作业多的矛盾, 以及执行过程中只是把当前运行需要的那部分程序和数据装入内存。 所以,操作系统把各级存储器统一管理起来。就是说, 应该把一个程序当前正在使用的部分放在内存, 而其余部分放在磁盘上,就启动执行它。操作系统根据程序执行时的要求和内存的实际使用情况, 随机地对每个程序进行换入/换出。
这样, 就给用户提供一个比正式的内存空间大的多的地址空间, 这就是虚拟存储器。所谓虚拟存储器是用户能作为可编址内存对待的存储空间, 在这种计算机系统中虚地址被映射成实地址。简单地说,虚拟存储器:是由操作系统提供的一个假想的特大存储器。就是说, 虚拟存储器并不是实际的内存,它的大小比内存空间大的多; 用户感觉所能使用的“内存”非常大, 但这是操作系统对物理内存的扩充。
它的物质基础是:二级存储器结构、和动态地址转换(DAT)。
- 理解虚拟存储器的作用
为解决内存小而作业大、作业多的矛盾, 以及执行过程中只是把当前运行需要的那部分程序和数据装入内存。 所以,操作系统把各级存储器统一管理起来。就是说, 应该把一个程序当前正在使用的部分放在内存, 而其余部分放在磁盘上,就启动执行它。操作系统根据程序执行时的要求和内存的实际使用情况, 随机地对每个程序进行换入/换出。
这样, 就给用户提供一个比正式的内存空间大的多的地址空间, 这就是虚拟存储器。所谓虚拟存储器是用户能作为可编址内存对待的存储空间, 在这种计算机系统中虚地址被映射成实地址。简单地说,虚拟存储器:是由操作系统提供的一个假想的特大存储器。就是说, 虚拟存储器并不是实际的内存,它的大小比内存空间大的多; 用户感觉所能使用的“内存”非常大, 但这是操作系统对物理内存的扩充。
它的物质基础是:二级存储器结构、和动态地址转换(DAT)。
注释:动态地址转换将内部本地地址与内部合法地址一对一的进行转换,与静态地址转换不同的是它是从内部合法地址池(POOL)动态选择一个未使用的地址来对内部本地地址进行转换!
存储器结构:
第一层:通用寄存器堆
第二层:指令与数据缓冲栈
第三层:高速缓冲存储器
第四层:主储存器(DRAM)
第五层:联机外部储存器(硬磁盘机)
第六层:脱机外部储存器(磁带、光盘存储器等
虚拟内存作为缓存的工具
虚拟内存作为内存管理的工具
虚拟内存作为内存保护的工具
- 理解地址翻译的概念
现代处理器使用虚拟寻址,通过一个虚拟地址(VA)来访问主存,将虚拟地址转换为物理地址的任务叫做地址翻译。CPU芯片上的内存管理单元(MMU)硬件,利用存放在主存中的查询表来动态翻译虚拟地址,这个查询表由操作系统管理。
- 理解存储器映射
Linux通过将一个虚拟内存区域与一个磁盘上的对象关联起来,以初始化这个虚拟内存区域的内容,这个过程称为内存映射。虚拟内存区域可以映射到两种类型的对象中的一种:
- Linux文件系统中的普通文件
- 匿名文件
一旦一个虚拟页面被初始化了,它就在一个由内核维护的专门的交换文件之间换来换去。在任何时刻,交换空间都限制着当前运行着的进程能够分配的虚拟页面的总数。
一个对象被映射到虚拟内存的一个区域,要么作为共享对象,要么作为私有对象。
通过赋予每个任务不同的虚拟–物理地址转换映射,支持不同任务之间的保护。地址转换函数在每一个任务中定义,在一个任务中的虚拟地址空间映射到物理内存的一个部分,而另一个任务的虚拟地址空间映射到物理存储器中的另外区域。...
就是把一个地址连接到另一个地址。
例如,内存单元A的地址为X,把它映射到地址Y,这样访问Y时,就可以访问到A了。当然,访问原来的地址X,也可以访问到A。
再如,在C语言等高级语言里面没有访问IO的指令,所以那样的话在C里面就无法访问IO,只能通过嵌入汇编或者通过调用系统函数来访问IO了。采用IO映射后就不同了,因为IO空间和内存空间本来不同,有不同的访问指令,那么,将IO空间映射到内存空间,就可以通过使用访问内存的方法来访问IO了,例如在C语言里面可以通过指针来访问内存单元,从而访问到被映射的IO。
- 掌握动态存储器分配的方法
动态存储分配,即指在目标程序或操作系统运行阶段动态地为源程序中的量分配存储空间,动态存储分配包括栈式或堆两种分配方式。需要主要的是,采用动态存储分配进行处理的量,并非所有的工作全部放在运行时刻做,编译程序在编译阶段要为其设计好运行阶段存储组织形式,并为每一个数据项安排好它在数据区中的相对位置。[1
动态内存分配器维护着一个进程的虚拟内存区域,称为堆。分配器将堆视为一组不同大小的块的集合来维护,每个块就是一个连续的虚拟内存片,要么是已分配的(显式地保留为供应用程序使用,释放可以显式/隐式执行),要么是空闲的(保持空闲直到被分配)。
动态存储分配方式
动态存储分配方式是不一次性将整个程序装入到主存中。可根据执行的需要,部分地动态装入。同时,在装入主存的程序不执行时,系统可以收回该程序所占据的主存空间。再者,用户程序装入主存后的位置,在运行期间可根据系统需要而发生改变。此外,用户程序在运行期间也可动态地申请存储空间以满足程序需求。由此可见,动态存储分配方式在存储空间的分配和释放上,表现得十分灵活,现代的操作系统常采用这种存储方式。[2
显式分配器:
malloc返回一个指针,指向大小为至少size字节的内存块。不初始化它返回的内存
calloc将分配内存初始化为0。
realloc改变已分配块的大小。
free释放已分配的堆块。
分配器的实现:
分配器组织堆的数据结构是隐式空闲链表。放置、分割、合并。
更好的,将空闲块组织为某种形式的显示数据结构。比如双向空闲链表。或者采用分离存储,维护多个空闲链表。
- 理解垃圾收集的概念
垃圾收集器是一种动态内存分配器,它自动释放程序不再需要的已分配块。定期识别垃圾块,并相应地调用free,将这些块放回到空闲链表中。
垃圾收集器将内存是为一张有向可达图,不可达节点对应于垃圾。
了解C语言中与存储器有关的错误
1. 间接引用无效指针
2. 读未初始化的存储器(Reading Uninitialized Memory)
3. 栈缓冲区溢出(Allowing Stack Buffer Overflows)
5. 造成错位错误(Making Off-by-One Errors)
6.误解指针运算(Misunderstanding Pointer Arithmetic)
- 引用不存在的变量(Referenceing Nonexistent Variables)
- 引用空闲堆块中的数据(Referencing Data in Free Heap Blocks
10. 引起内存泄露(Introducing Memory leaks)