Linux编程白皮书 第二章 内存管理

发表于:2007-07-04来源:作者:点击数: 标签:
第2章 内 存 管 理 内存管理子系统是操作系统最重要的部分之一。从早期计算开始,系统的内存大小就难以 满足人们的需要。为了解决这个问题,可利用虚拟内存。虚拟内存通过当需要时在竞争的进 程之间共享内存,使系统显得有比实际上更多的内存空间。 第2章 内

第2章 内 存 管 理
    

       内存管理子系统是操作系统最重要的部分之一。从早期计算开始,系统的内存大小就难以
满足人们的需要。为了解决这个问题,可利用虚拟内存。虚拟内存通过当需要时在竞争的进
程之间共享内存,使系统显得有比实际上更多的内存空间。

第2章 内 存 管 理
    

       内存管理子系统是操作系统最重要的部分之一。从早期计算开始,系统的内存大小就难以
满足人们的需要。为了解决这个问题,可利用虚拟内存。虚拟内存通过当需要时在竞争的进
程之间共享内存,使系统显得有比实际上更多的内存空间。
    虚拟内存不仅仅使机器上的内存变多,内存管理子系统还提供以下功能:
     大地址空间 操作系统使系统显得它有比实际上大得多的内存。虚拟内存可以比系统中
     的物理内存大许多倍。
     保护 系统中每个进程有自己的虚拟地址空间。这些虚拟地址空间相互之间完全分离,
     所以运行一个应用的进程不能影响其他的进程。同样,硬件的虚拟内存机制允许内存区
     域被写保护。这样保护了代码和数据不被恶意应用重写。
     内存映射 内存映射用来把映像和数据文件映像到一个进程的地址空间。在内存映射中,
     文件的内容被直接链接到进程的虚拟地址空间。
     公平物理内存分配   内存管理子系统给予系统中运行的每个进程公平的一份系统物理内
     存。
     共享虚拟内存 尽管虚拟内存允许进程拥有分隔的(虚拟)地址空间,有时你会需要进程共
     享内存。例如系统中可能会有几个进程运行命令解释 shell bash。最好是在物理内存中只
     有一份bash拷贝,所有运行bash的进程共享它;而不是有几份 bash拷贝,每个进程虚拟
     空间一个。动态库是另一个常见的几个进程共享执行代码的例子。
    共享内存也可以被用作进程间通信 (IPC)机制,两个或更多进程通过共有的内存交换信息。
Linux支持Unix(tm) System V的共享内存IPC。


2.1 虚拟内存抽象模型
    

       在考察Linux支持虚拟内存所使用的方法之前,考察一下抽象模型会有所帮助。
       当处理器运行一个程序时,它从内存中读取一条指令并解码。在解码该指令过程中它可
能需要取出或存放内存某个位置的内容。处理器然后执行该指令并移动到程序中下一条指令。
这样处理器总是访问内存来取指令或取存数据。
    在虚拟内存系统中以上所有的地址都是虚拟地址而不是物理地址。处理器基于由操作系
统维护的一组表中的信息,将虚拟地址转换成物理地址。
    为了使这种变换容易一些,虚拟内存和物理内存都被分为合适大小的块叫做“页 (page)”。
这些页都有同样的大小。它们可以不具有同样大小,但那样的话系统将很难管理。 Alpha AXP
系统上Linux使用8KB字节大小的页,Intel x86系统上使用4KB字节大小的页。这些页中每一个
都有一个唯一的号码:页帧号(Page Frame Number, PFN)。在这种分页模型中,一个虚拟地址
由两部分组成:一个偏移和一个虚拟页帧号。如果页大小是 4KB字节,虚拟地址的11∶0位包
含偏移,12位及高位是虚拟页帧号。每当处理器面临一个虚拟地址时,它必须析取出偏移和
虚拟页帧号。处理器必须将虚拟页帧号转换成物理的页帧号,然后在该物理页中正确的偏移
位置上进行访问。为了完成这些处理器要使用页表。
    图1-2-1展示了两个进程的虚拟地址空间,进程 X和进程Y,每个都有自己的页表。
此主题相关图片如下:
javascript:window.open(this.src);" style="CURSOR: pointer" onload="return imgzoom(this,550)">screen.width-500)this.style.width=screen.width-500;}}" border="0" />


    这些页表将每个进程的虚拟页映射到内存中的物理页。图 1-2-1显示进程X的虚拟页帧号0
映射到内存中物理页帧号 1,进程Y的虚拟页帧号1映射到物理页帧号4。理论上的页表中每一
项包含下列信息:
     有效标志,用来指示该页表项是否有效。
     本项所描述的物理页帧号。
     访问控制信息。它描述该页可以被怎样使用。它是否可以被写?是否包含可执行代码?
    页表用虚拟页帧号作为偏移来访问。虚拟页帧号 5将是表中第6个元素(0是第1个)。
    为了将一个虚拟地址转换成物理地址,处理器首先必须得到虚拟地址页帧号和在该虚拟
页中的偏移。通过选取页大小为 2的幂,这可以很容易地屏蔽和移位得到。再看一下图 1-2-1,
设页大小是0x2000字节(即十进制8192),Y进程虚拟地址空间中一个地址为 0x2194,则处理器
将把该地址转换为虚拟页帧号1的偏移0x194。
    处理器使用虚拟页帧号作为进程页表的索引来检索它的页表项。如果该偏移处页表项有
效,处理器将从该项取出物理页帧号。如果该页表项无效,说明处理器访问了虚拟内存中不
存在的区域。在这种情况下,处理器不能解析该地址,并且必须把控制传给操作系统来解决
问题。
    处理器如何通知操作系统一个正确的进程试图访问一个没有有效转换的虚拟地址,这是
依处理器不同而不同的。无论如何处理器能够处理它,这被称作“页故障 (page fault)”。操作
系统被告知故障的虚拟地址和故障原因。
    如果访问的是有效的页表项,处理器取出物理页帧号,并将它乘以页的大小以得到物理
内存中该页的基地址。最后,处理器将偏移加到所需的指令或数据的地址。
    再以上面的例子为例,进程 Y的虚拟页帧号 1映射到物理页帧号 4,起始于 0x8000(4×
0x2000)。加上0x194字节的偏移,最后得到物理地址 0x8194。


    通过用这种方式映射虚拟地址和物理地址,虚拟内存能够以任何次序被映射到系统物理
页。例如,在图1-2-1中进程X的虚拟页帧号0被映射到物理页帧号1,而虚拟页帧号7被映射到
物理页帧号0,尽管在虚拟内存中它比虚拟页帧号 0要高。这说明了虚拟内存的一个有趣的副
作用:虚拟内存页不必以任何特定次序出现在物理内存中。

下一章:2.1.1 请求调页 近期发布

原文转自:http://www.ltesting.net