1. 页表
**虚拟内存:**虚拟内存被分割成大小固定的块,即虚拟页(Virtual Page),对应物理内存也被分割成物理页/页帧(Physical Page / Page Frame)。虚拟页有三种:未分配、已缓存、未缓存。
**虚拟寻址方式:**一个进程的所有数据存放在虚拟页中,提供的也是虚拟地址。虚拟页存放在磁盘中,缓存在内存中。页表存放所有虚拟页的信息,即虚拟页到底在内存中还是磁盘中。
🔹页表:
- 页表就是一个页表条目(Page Table Entry,PTE)的数组。
- 每个 PTE 至少由一个有效位(valid bit)和一个N位地址字段(PFN)组成。
- 有效位表明该虚拟页是否被缓存到内存中。地址字段指向页的起始位置。
- 如果有效位为1,地址字段指向该虚拟页对应的物理页在内存中的起始位置。如果有效位为0,地址字段为空时表明该虚拟页还没有被分配,不为空时指向该虚拟页在磁盘中的起始位置。
🔹缺页:
- CPU 想要引用 VP3 中的一个字,地址翻译硬件从内存中读取 PTE3,从有效位推断出VP3没有被缓存,所以触发了一个缺页异常。
- 缺页异常会调用内核中的缺页异常处理程序,该程序会选择一个牺牲页。如果这个牺牲页中的数据已经发生修改,然后内核就会将它复制回磁盘。
- 接下来,内核从磁盘复制
VP 3
到内存中的PP 3
,更新PTE 3
,然后返回。 - 当异常处理程序返回时,它会重新启动导致缺页的指令,该指令会把原来的虚拟地址重新发送到地址翻译硬件。
🔹虚拟内存可以保护内存:
计算机不应该允许一个用户进程修改它的只读代码、内核代码和数据、其他进程的私有内存、以及与其他进程共享的内存。要实现这些功能只需在PTE中添加访问控制位即可。