Page Tables
[TOC]
对虚拟内存的印象:
- 一个表将虚拟地址映射到物理地址
- A:偏移来表示地址
- 间接地表示物理地址,44为映射到64位地址
- 每个地址有代理的地址空间,虚拟地址的地位是相同的
- 允许保护每个进程的地址
- 是隔离的基础,每个进程都可以假装自己有空间可用
- 有一种某个形式的映射,可以帮助实现隔离
Address Spaces
地址空间
使用虚拟内存可用获得隔离
目标:一个程序挂了不会影响操作系统或其他程序

默认情况:没有隔离,直接在硬件上写

我们想要某种机制,能够将不同程序之间的内存隔离开来,cat就不会影响到sh。一种实现方式是地址空间(Address Spaces)。

现在当我们运行cat后,他的地址空间从0开始,到某个值结束,而sh的地址也从0开始,到某个值结束。
所以cat越界写入时,os会阻止他。
所以现在的问题就是如何在物理内存上创建不同的地址空间
Q&A:
-
物理内存与虚拟内存大小关系
没有大小关系,虚拟内存可比物理内存大,反之亦然。page table 使用十分灵活
-
太多进程使用虚拟内存,物理内存会耗尽吗?
有可能,如果每个程序都有大的虚拟内存,在某个时间内存就耗尽了。xv6中kalloc返回空余page列表,OS会告知程序是他没有内存了还是整个机器都没有内存了
页表
最常见,硬件支持
由处理器的内存管理单元(MMU)

当应用程序访问地址 10 时,OS会将地址10 放入内存映射寄存器(SATP)中,CPU告诉内存管理单元到哪里吧虚拟地址转换为物理地址。
Q&A:
- MMU只读取内存并转换,不用保存映射
- stap寄存器的值由内核保护
64位的寄存器会有 个内存地址,所以不能对每一个地址分配映射,而是对一个页面