信息安全系统设计基础第十四周学习总结
虚拟存储器:
1 将主存看成是一个存储在磁盘上的地址空间的高速缓存
2 为每个进程提供了一致
的地址空间
3 保护了每个进程的地址空间
不被其他进程破坏
一个包含N=2^n个地址的虚拟地址空间就叫做一个n位地址空间,最大可能地址为N-1。
SRAM缓存
:位于CPU和主存之间的L1、L2、L3高速缓存
DRAM缓存
:虚拟存储器系统的缓存,在主存中缓存虚拟页
页表
:一个由页表条目(PTE)组成的数组
PTE
:一个
有效位+一个n位
地址字段
页面调度
:(交换)在磁盘和存储器之间传送页的活动
工作集
:(常驻集)根据局部性原理
,程序将往往在一个较小的活动页面集合上工作
PTE的三个许可位:
SUP位
:表示进程是否必须运行在内核模式下才能访问
READ
:控制对页面的读
WRITE
:控制对页面的写
VPO
:虚拟页面偏移量(字节)
VPN
:虚拟页号
PPO
:物理页面偏移量(字节)
PPN
:物理页号
PTBR
:(页表基址寄存器)指向当前页表
n位虚拟地址:p位
VPO+(n-p)位
VPN
物理寻址的高速缓存结合虚拟存储器思想:
地址翻译发生在高速缓存查找之前
存储器映射
:
Linux虚拟存储器可以关联的对象
:
1 普通文件
:普通磁盘文件中的连续部分
2 匿名文件
:由内核创建的,包含的全是二进制0。
Fork函数
:
当fork被调用,内核为了给这个新进程创建虚拟存储器,拷贝了当前进程的mm_struct
、区域结构
和页表
,将两个进程的每个页面都标记为只读
,并将两个进程的每个区域结构都标记为私有的写时拷贝
。
Execve(“a.out”,NULL,NULL);执行过程:
删除已存在的用户区域
映射私有区域
映射共享区域
设置程序计数器(PC)
Void *mmap(void *start,size_t length, int prot ,int flags, int fd,off_t offset);
Int munmap(void *start, size_t length);
参数prot
包含描述新映射的虚拟存储器区域的访问权限位
参数flags
由描述被映射对象类型的位组成
显式分配器约束条件:
处理任意请求序列
立即响应请求
只实用堆
对齐快要求
不修改已分配的块
两个通常相冲突的性能目标:
最大化吞吐率
最大化存储器利用率
隐式空闲链表
:空闲块通过头部的大小字段隐含地连接着
优点:简单
缺点:任何操作的开销要求空闲链表的搜索与堆中已分配块和空闲块的总数呈线性关系
显式空闲链表
:程序实现空闲块显式数据结构的指针可以存放在这些空闲块的主体里面。
缺点:空闲块必须足够大,以包含所有需要的指针
垃圾收集:
垃圾收集器:一种动态存储分配器,自动释放程序不再需要的已分配块。
C语言常见与存储器有关的错误:
1 间接引用坏指针:
当间接引用映射到没有意义的区域或者只读区域时发生
2 读未初始化的存储器
假设堆存储器被初始化为0
3 允许栈缓冲区溢出
程序不检查输入串大小就写入栈中的目标缓冲区
4 假设指针和他们指向的对象相同大小
例如,只有当int和指向int的指针大小的机器上才能忽略这个问题
5 造成错位错误
例如,创建了一个n个元素的数组,却按n+1个元素来初始化
6 引用指针不注意C语言优先级
当对优先级和结合性有疑问时,应该使用括号
7 误解指针运算
指针的算术操作以它们指向的对象的大小为单位来进行
8 引用不存在的变量
9 引用空闲堆块中的数据
10 引起存储器泄露
忘记释放已分配块
小结:
虚拟存储器是对主存的一个抽象。
三个重要功能:
1 在主存中自动缓存最近使用的存放磁盘上的虚拟地址空间的内容
2 简化了存储器管理,链接,进程间数据共享、存储器分配和程序加载
3 在每条页表条目中加入保护位,简化存储器保护
地址翻译的过程必须与系统中所有的硬件缓存操作集成在一起。大多数页表条目位于L1高速缓存中,但是一个成为TLB的页表条目的片上高速缓存,通常会消除访问在L1上的页表条目的开销。