CSAPP 第九章 虚拟内存 知识点总结

CSAPP 第九章 虚拟内存知识点总结

  1. 虚拟内存是对内存的一种抽象,它将主存作为磁盘地址空间的缓存,只在主存中保留有效的部分;它对每个进程提供一个独立的私有地址空间,从而避免进程执行的时候写入其它进程空间导致程序崩溃
  2. CPU访问内存地址时是提供虚拟地址给内存管理单元(MMU),由MMU使用查表将虚拟地址转化为物理地址,并将访问数据通过总线传回CPU

主存作为磁盘缓存

  1. 在将主存当作磁盘的缓存时,实际上根据缓存的使用,磁盘,主存,虚拟内存都需要被划分为若干固定大小的块,虚拟地址划分的块叫虚页,物理地址划分的叫物理页,也叫页框
  2. 虚页在任何时候只有三种情况:
    • 虚页还没有被分配,即这部分虚拟地址没有对应部分,磁盘中也没有
    • 虚页还没有在物理主存中缓存,即虚页已经映射到了磁盘中的一页,但是没有load进主存
    • 虚页已经在物理主存中缓存,已经在主存中
  3. MMU通过访问页表来将虚拟内存翻译为物理内存,页表由页表项构成,简化来看,页表项由valid bit和address bits构成;valid为1,则地址部分即为翻译后得到的物理地址,valid为0,如果地址部分为NULL,则表示还没有被分配,如果不为NULL,则地址指向的磁盘上的虚拟页
  4. Page hit:检查valid,valid有效则根据PTE中地址计算要读的数据物理地址
  5. Page fault:首先是页表中必须存在该虚拟内存的页表项。MMU查表发现,该Page在页表中的PTE valid=0.表示指向的是磁盘地址空间,因此触发Page Fault Exception.这时候会从物理内存中选择一个页表,然后将该页表写回磁盘,并修改页表项内容,然后载入Miss的Page,并修改页表项. 这个过程叫做页交换

内存管理
8. 操作系统为每个进程提供了一个单独的页表,也就是一个独立的虚拟地址空间,,多个虚拟页面可以映射到同一个共享物理页面上。
9. 每个进程可以共享同一种内存地址形式,不需要关心实际的物理地址,简化链接
10. 进程执行是不需要在内存中加载所有可执行文件或者共享对象文件,只需要在页表中对应PTE的valid置为0,然后让地址指向磁盘中目标文件的适当位置。这些页在CPU取指令或者引用内存地址时会自动加载到物理内存中
11. 独立地址空间为操作系统提供了一个管理用户进程和操作系统自身之间共享的一致机制。一般而言,每个进程都有自己私有的代码、数据、堆以及栈区域,是不和其他进程共享的。在这种情况中,操作系统创建页表,将相应的虚拟页映射到不连续的物理页面。在一些情况中,还是需要进程来共享代码和数据。例如,每个进程必须调用相同的操作系统内核代码,而每个 C 程序都会调用 C 标准库中的程序,比如 printf。操作系统通过将不同进程中适当的虚拟页面映射到相同的物理页面,从而安排多个进程共享这部分代码的一个副本,而不是在每个进程中都包括单独的内核和 C 标准库的副本。
12. 虚拟内存为向用户进程提供一个简单的分配额外内存的机制。当一个运行在用户进程中的程序要求额外的堆空间时(如调用 malloc 的结果),操作系统分配一个适当数字(例如 k)个连续的虚拟内存页面,并且将它们映射到物理内存中任意位置的 k 个任意的物理页面。由于页表工作的方式,操作系统没有必要分配 k 个连续的物理内存页面。页面可以随机地分散在物理内存中


内存保护
13. 通过在每个PTE中额外加入权限位,来限制内存的读写操作。现代操作系统中,用户进程不被允许读或者写内核的代码和数据,不允许其它进程的私有内存,不允许修改和其它进程共享的内存页。


地址翻译
14. CPU中页表基地址寄存器指向当前页表的起始地址,n 位的虚拟地址包含两个部分:一个 p 位的虚拟页面偏移(Virtual Page Offset,VPO)和一个位的虚拟页号(Virtual Page Number,VPN)。MMU 利用 VPN 来选择适当的 PTE。例如,VPN 0 选择 PTE 0,VPN 1 选择 PTE 1,以此类推。将页表条目中物理页号(Physical Page Number,PPN)和虚拟地址中的 VP。串联起来,就得到相应的物理地址。注意,因为物理和虚拟页面都是 P 字节的,所以物理页面偏移(Physical Page Offset,PPO)和 VPO 是相同的。
CSAPP 第九章 虚拟内存 知识点总结_第1张图片

  1. 步骤:
    第 1 步:处理器生成一个虚拟地址,并把它传送给 MMU。
    第 2 步:MMU 生成 PTE 地址,并从高速缓存/主存请求得到它。
    第 3 步:高速缓存/主存向 MMU 返回 PTE。
    第 4 步:MMU 构造物理地址,并把它传送给高速缓存/主存。
    第 5 步:高速缓存/主存返回所请求的数据字给处理器。
    如果出现异常,则第三步得到的PTE 中的有效位是零,所以 MMU 触发了一次异常,传递 CPU 中的控制到操作系统内核中的缺页异常处理程序。缺页处理程序确定出物理内存中的牺牲页,如果这个页面已经被修改了,则把它换出到磁盘。缺页处理程序页面调入新的页面,并更新内存中的 PTE。缺页处理程序返回到原来的进程,再次执行导致缺页的指令。CPU 将引起缺页的虚拟地址重新发送给 MMU。因为虚拟页面现在缓存在物理内存中,所以就会命中,在 MMU 执行了图 9-13b 中的步骤之后,主存就会将所请求字返回给处理器

  2. 多级页表其实是类似的,就是存在页目录,页目录PTE存放的是下一级页目录的起始地址,然后连接地址中划分的下一个片(作为偏移量)得到下一个页表的起始地址
    CSAPP 第九章 虚拟内存 知识点总结_第2张图片

  3. 内核虚拟内存包含内核中的代码和数据结构。内核虚拟内存的某些区域被映射到所有进程共享的物理页面。例如,每个进程共享内核的代码和全局数据结构。有趣的是,Linux 也将一组连续的虚拟页面(大小等于系统中 DRAM 的总量)映射到相应的一组连续的物理页面。这就为内核提供了一种便利的方法来访问物理内存中任何特定的位置,例如,当它需要访问页表,或在一些设备上执行内存映射的 IO操作,而这些设备被映射到特定的物理内存位置时。内核虚拟内存的其他区域包含每个进程都不相同的数据。比如说,页表、内核在进程的上下文中执行代码时使用的栈,以及记录虚拟地址空间当前组织的各种数据结构
    CSAPP 第九章 虚拟内存 知识点总结_第3张图片

你可能感兴趣的:(csapp,java,linux,网络)