📄 00000004.htm
字号:
<HTML><HEAD> <TITLE>BBS水木清华站∶精华区</TITLE></HEAD><BODY><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER>发信人: coolzhang (coolzhang), 信区: Linux <BR>标 题: linux bible 第三章 存储管理 <BR>发信站: BBS 水木清华站 (Mon Oct 25 17:46:28 1999) <BR> <BR>发信人: coolzhang (coolzhang), 信区: UNIX <BR>标 题: linux bible 第三章 存储管理 <BR>发信站: 武汉白云黄鹤站 (Mon Oct 25 14:24:45 1999), 站内信件 <BR>第三章 存储管理 <BR>存储管理子系统时操作系统中最重要的组成部分之一。在早期计算时代,由于人们 <BR>所需要的内存数目远远大于物理内存,人们设计出了各种各样的策略来解决此问题, <BR>其中最成功的是虚拟内存技术。它使得系统中为有限物理内存竞争的进程所需内存 <BR>空间得到满足。 <BR>虚拟内存技术不仅仅可让我们可以使用更多的内存,它还提供了以下功能: <BR>巨大的寻址空间 <BR>操作系统让系统看上去有比实际内存大得多的内存空间。虚拟内存可以是系统中实 <BR>际物理空间的许多倍。每个进程运行在其独立的虚拟地址空间中。这些虚拟空间相 <BR>互之间都完全隔离开来,所以进程间不会互相影响。同时,硬件虚拟内存机构可以 <BR>将内存的某些区域设置成不可写。这样可以保护代码与数据不会受恶意程序的干扰。 <BR>内存映射 <BR>内存映射技术可以将映象文件和数据文件直接映射到进程的地址空间。在内存映射 <BR>中,文件的内容被直接连接到进程虚拟地址空间上。 <BR>公平的物理内存分配 <BR>内存管理子系统允许系统中每个运行的进程公平地共享系统中的物理内存。 <BR>共享虚拟内存 <BR>尽管虚拟内存允许进程有其独立的虚拟地址空间,但有时也需要在进程之间共享内 <BR>存。例如有可能系统中有几个进程同时运行BASH命令外壳程序。为了避免在每个进 <BR>程的虚拟内存空间内都存在BASH程序的拷贝,较好的解决办法是系统物理内存中只 <BR>存在一份BASH的拷贝并在多个进程间共享。动态库则是另外一种进程间共享执行代 <BR>码的方式。共享内存可用来作为进程间通讯(IPC)的手段,多个进程通过共享内存 <BR>来交换信息。Linux支持SYSTEM V的共享内存IPC机制。 <BR>3.1 虚拟内存的抽象模型 <BR>在讨论Linux是如何具体实现对虚拟内存的支持前,有必要看一下更简单的抽象模型。 <BR>在处理器执行程序时需要将其从内存中读出再进行指令解码。在指令解码之前它必须 <BR>向内存中某个位置取出或者存入某个值。然后执行此指令并指向程序中下一条指令。 <BR>在此过程中处理器必须频繁访问内存,要么取指取数,要么存储数据。 <BR>虚拟内存系统中的所有地址都是虚拟地址而不是物理地址。通过操作系统所维护的一 <BR>系列表格由处理器实现由虚拟地址到物理地址的转换。 <BR>为了使转换更加简单,虚拟内存与物理内存都以页面来组织。不同系统中页面的大小 <BR>可以相同,也可以不同,这样将带来管理的不便。Alpha AXP处理器上运行的Linux <BR>页面大小为8KB,而IntelX86系统上使用4KB页面。每个页面通过一个叫页面框号的 <BR>数字来标示(PFN)。 <BR>页面模式下的虚拟地址由两部分构成:页面框号和页面内偏移值。如果页面大小为4KB, <BR> <BR>则虚拟地址的11:0位表示虚拟地址偏移值,12位以上表示虚拟页面框号。处理器处理 <BR>虚拟地址时必须完成地址分离工作。在页表的帮助下,它将虚拟页面框号转换成物理页 <BR> <BR>面框号,然后访问物理页面中相应偏移处。 <BR>X和Y的虚拟地址空间,它们拥有各自的页表。这些页表将各个进程的虚拟页面映射到 <BR>内存中的物理页面。在图中,进程X的虚拟页面框号0被映射到了物理页面框号4。理论 <BR>上每个页表入口应包含以下内容: <BR> 有效标记,表示此页表入口是有效的 <BR> 页表入口描叙的物理页面框号 <BR> 访问控制信息。用来描叙此页可以进行哪些操作,是否可写?是否包含执行代码? <BR> <BR>虚拟页面框号是为页表中的偏移。虚拟页面框号5对应表中的第6个单元(0是第一个)。 <BR> <BR>为了将虚拟地址转换为物理地址,处理器首先必须得到虚拟地址页面框号及页内偏移。 <BR> <BR>一般将页面大小设为2的次幂。将图3.1中的页面大小设为0x2000字节(十进制为8192) <BR> <BR>并且在进程Y的虚拟地址空间中某个地址为0x2194,则处理器将其转换为虚拟页面框号1 <BR> <BR>及页内偏移0x194。 <BR>处理器使用虚拟页面框号为索引来访问处理器页表,检索页表入口。如果在此位置的页 <BR> <BR>表入口有效,则处理器将从此入口中得到物理页面框号。如果此入口无效,则意味着处 <BR> <BR>理器存取的是虚拟内存中一个不存在的区域。在这种情况下,处理器是不能进行地址转 <BR> <BR>换的,它必须将控制传递给操作系统来完成这个工作。 <BR>某个进程试图访问处理器无法进行有效地址转换的虚拟地址时,处理器如何将控制传递 <BR> <BR>到操作系统依赖于具体的处理器。通常的做法是:处理器引发一个页面失效错而陷入操 <BR> <BR>作系统核心,这样操作系统将得到有关无效虚拟地址的信息以及发生页面错误的原因。 <BR> <BR>再以图3.1为例,进程Y的虚拟页面框号1被映射到系统物理页面框号4,则再物理内存中 <BR> <BR>的起始位置为0x8000(4 * 0x2000)。加上0x194字节偏移则得到最终的物理地址0x8194。 <BR> <BR>通过将虚拟地址映射到物理地址,虚拟内存可以以任何顺序映射到系统物理页面。例如 <BR>, <BR>进程X的虚拟页面框号0被映射到物理页面框号1而虚拟页面框号7被映射到物理页面框号 <BR>0, <BR>虽然后者的虚拟页面框号要高于前者。这样虚拟内存技术带来了有趣的结果:虚拟内存 <BR> <BR>中的页面无须在物理内存保持特定顺序。 <BR>3.1.1 请求换页 <BR>在物理内存比虚拟内存小得多的系统中,操作系统必须提高物理内存的使用效率。节省 <BR> <BR>物理内存的一种方法是仅加载那些正在被执行程序使用的虚拟页面。比如说,某个数据 <BR> <BR>库程序可能要对某个数据库进行查询操作,此时并不是数据库的所有内容都要加载到内 <BR> <BR>存中去,而只加载那些要用的部分。如果此数据库查询是一个搜索查询而无须对数据库 <BR> <BR>进行添加记录操作,则加载添加记录的代码是毫无意义的。这种仅将要访问的虚拟页面 <BR> <BR>载入的技术叫请求换页。 <BR>当进程试图访问当前不在内存中的虚拟地址时,处理器在页表中无法找到所引用地址的 <BR> <BR>入口。对于虚拟页面框号2,进程X的页表中没有入口,这样当进程X试图访问虚拟页面框 <BR> <BR>号2内容时,处理器不能将此地址转换成物理地址。这时处理器通知操作系统有页面错误 <BR> <BR>发生。 <BR>如果发生页面错的虚拟地址是无效的,则表明进程在试图访问一个不存在的虚拟地址。 <BR> <BR>这可能是应用程序出错而引起的,例如它试图对内存进行一个随机的写操作。此时操作 <BR> <BR>系统将终止此应用的运行以保护系统中其他进程不受此出错进程的影响。 <BR>如果出错虚拟地址是有效的,但是它指向的页面当前不在内存中,则操作系统必须将此 <BR> <BR>页面从磁盘映象中读入到内存中来。由于访盘时间较长,进程必须等待一段时间直到页 <BR> <BR>面被取出来。如果系统中还存在其他进程,操作系统就会在读取页面过程中的等待过程 <BR> <BR>中选择其中之一来运行。读取回来的页面将被放在一个空闲的物理页面框中,同时此进 <BR> <BR>程的页表中将添加对应此虚拟页面框号的入口。最后进程将从发生页面错误的地方重新 <BR> <BR>开始运行。此时整个虚拟内存访问过程告一段落,处理器又可以继续进行虚拟地址到物 <BR> <BR>理地址转换,而进程也得以继续运行。 <BR>Linux使用请求换页将可执行映象加载到进程的虚拟内存中。当命令执行时,可执行的命 <BR> <BR>令文件被打开,同时其内容被映射到进程的虚拟内存。这些操作是通过修改描叙进程内 <BR> <BR>存映象的数据结构来完成的,此过程称为内存映射。然而只有映象的起始部分被调入物 <BR> <BR>理内存,其余部分仍然留在磁盘上。当映象执行时,它会产生页面错误,这样Linux将决 <BR> <BR>定将磁盘上哪些部分调入内存继续执行。 <BR>3.1.2 交换 <BR>如果进程需要把一个虚拟页面调入物理内存而正好系统中没有空闲的物理页面,操作系 <BR> <BR>统必须丢弃位于物理内存中的某些页面来为之腾出空间。 <BR>如果那些从物理内存中丢弃出来的页面来自于磁盘上的可执行文件或者数据文件,并且 <BR> <BR>没有修改过则不需要保存那些页面。当进程再次需要此页面时,直接从可执行文件或者 <BR> <BR>数据文件中读出。 <BR>但是如果页面被修改过,则操作系统必须保留页面的内容以备再次访问。这种页面被称 <BR> <BR>为dirty页面,当从内存中移出来时,它们必须保存在叫做交换文件的特殊文件中。相对 <BR> <BR>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -