下学期看完了OSTEP这本书, 但是感觉对于虚拟内存以及其相关的程序加载机制一直有些模糊, 然后开始做CSAPP的malloc lab, 发现这本书对于虚拟内存相关的知识讲的比较全面, 于是参考CSAPP的思路来整理一下相关的知识.
由于不同层次单位容量造价不同以及他们之间访问速度的差异, 以及良好软件的局部性的存在, 这两种软件和硬件的性质完美互补使得存储器层次结构产生.
存储器层次结构的核心思想是: 对于k, 位于k层的更快更小的存储设备作为k + 1层的更大更慢设备的缓存(caching), k + 1层的存储器被分为连续的数据对象组块(chunk), 称之为块(block). 类似的, 第k层的存储器被划分成同样大小的块的集合. 在任何时刻, 第k层的缓存包括第k + 1层的一个子集的副本.
通用的高速缓存存储器结构可以用元组(S,E,B,m)表示. 含义是
其中 S 和 E 将存储器地址分为三部分: s 位组索引, 剩下 b 位块偏移, 还有 t = m - s - b 位标记位.
当 E = 1 时, 称为直接映射高速缓存
查找方式:
当 1 < E < C/B 的高速缓存, 称为E路组相连的高速缓存
查找方式:
E = C / B, 只有一个包含所有高速缓存行的组.
处理写命中方法:
处理写不命中:
直写高速缓存通常是非写分配, 写回高速缓存通常是写分配.
指标:
具体实践见: Cache lab part A
实践见: Cache lab part B
上面总结了缓存的概念, 因为虚拟内存技术用到了缓存的思想, 结合缓存技术来实现.
计算机的主存可以看成是一个连续字节大小的单元组成的数组, 每字节都有一个唯一的物理地址(Physical Address, PA)
虚拟寻址是CPU生成一个虚拟地址(Virtual Address, VA)来访问主存, 通过内存管理单元(Memory Management Unit, MMU)硬件通过查询主存中的页表将VA翻译成PA, 页表的内容由操作系统管理, 下文会详细描述.
虚拟内存的基本思想就是允许一个数据对象有多个独立的地址, 其中每个地址都选自不同的地址空间. 主存中每个字节都有一个来自虚拟地址空间的虚拟地址和物理地址空间的物理地址
对于程序员来说, 所接触到的地址一般都是虚拟地址, 这里的虚拟地址对应的来自虚拟地址空间,虚拟内存可以看成是将主存和磁盘一起抽象成一个存储器, 由主存作为磁盘的 Cache , 通过将文件划分为固定大小的块来最为主存和磁盘间的传输单元.
跟 Cache 一样, 虚拟内存需要某种方法来判断一个虚拟页是否已经被载入主存中, 于是就有了一个软硬件结合完成的一个由页表项(记录了虚拟页物理页号(有效)或磁盘地址(无效)等信息)组成的数组叫做页表,