|
深入理解Linux虚拟内存管理(未排版之中文版部分章节)
[复制链接]
深入理解Linux虚拟内存管理(未排版之中文版部分章节)内容简介 VM 的行为影响着 Linux 内核的每个子系统,并动态地改变整体性能。但直至目前,理解VM 的惟一途径便是:逐行学习文档极少的源代码。而现在有了更简单快捷的可选方案。本书史无前例地详细描述了 VM,不仅包括理论基础,而且还包括逐行的代码注释。它同样系统地涵盖了从物理内存描述到内存溢出管理的每个方面: 1.Linux VM 2.4 体系结构的层次,附图表和调用图 2.物理内存描述、页表、地址空间和内存分配 3.高端内存、交换、共享内存和更多的内容 4.专家级地指导如何分析开源项目 5.每个章节中有 Linux 2.6 内核的新特性 《深入理解 Linux 虚拟内存管理》将成为每个内核程序员和研究人员不可或缺的案头宝典。 www.mbtrend.com译者序 这是我心仪已久的一本书,相信很多读者也会有同样的感受。 Linux在国内的普及还不成熟,而关于内核方面的中文资料却又都偏向大而全,细节部分描述得相当不够。这些书籍往往由于篇幅问题而仅仅选择性地讲解内核源代码,不少读者无法真正吃透内核的实际实现方式,存在看不下去或不能理解等问题。还有的书籍代码注释较为粗略,省去了很多内核实现细节,初中级水平的读者阅读起来也有困难。而另有一部分内核书籍由于时代久远,很多系统调用方面,特别是与硬件相关的代码使读者产生不少疑问,对于中高级内核开发人员以及在较新内核版本下进行开发的人员就略显不足了。 一次较为偶然的机会我在网络上发现这一至宝,在它还是草稿版的时候就得到Linux网站的关注。但由于种种原因一直没有和大家见面。后来痛定思痛,觉得这样一本好书不能为中国众多Linux爱好者学习实为可惜,终于克服种种困难翻译该书完整正式版,希望能给大家带来一定的帮助。 在众多Linux内核分析的书籍中,本书的特点非常鲜明: (1 ) 本书问世以前,基本上没有一套关于Linux 虚拟内存的完整文档。文档的匮乏 直接导致VM只能被很少一部分内核开发人员所完全理解。极少或根本没有 何信息对这种实现的理论基础进行描述。 (2 ) 本书试图弥补内存管理理论和在Linux中具体实现之间的差距,并且将两个部分 结合起来。是当今最能够充分理解Linux VM的运行机制以及将理论和实现联系 在一起的书籍。本书不是一本以讲述理论为目标的书,而是先讲述理论,再 合Linux的实现深入剖析其细节。 (3 ) 本书以相对独立于硬件的角度阐述Linux VM。 (4 ) 函数调用图和系统架构图一目了然,思路清晰,读者可以快速地掌握系统总体 架构。 (5 ) 在附录里面包含了对VM的详细注释。读者能够更简单地弄清楚VM的实现过 程,对VM系统的运行机制更加得心应手。 (6 ) 在剖析2.4内核的基础上还分析2.6内核中VM的新特性。紧跟世界Linux内核发展 进度。 本书内容涵盖物理内存,页表管理,进程地址空间,引导内存分配器,物理页面分配,非连续内存分配,Slab分配器,高端内存管理,页面帧回收,交换管理,共享内存虚拟文件系统等部分。 本书的翻译工作主要由白洛,李俊奎,刘森林完成。参与少量翻译工作的还有黄静嵽,张伸,贺虎,查志勇,吕志华,夏玉,倪晓雷,vbar,newface,hs_guanqi。黄忠霖教授完成了本书的审校工作。 翻译过程中,我的家人,朋友和同学给了我莫大的支持和鼓励。感谢我的家人,朋友和同学。感谢黄忠霖教授的谆谆指导和辛勤工作。感谢我的责任编辑胡晓柏,他的认真负责给 www.mbtrend.com予我很大的帮助。感谢LinuxCN的热心网友们。感谢所有关心和热爱Linux的人们。 由于本人才疏学浅,翻译中不免有少量错误和遗漏,望各位读者批评指正。共同学习,共同进步。 本书读者主要针对高等院校师生、研究机构科研人员、Linux 内核开发人员、应用开发人员及系统管理人员,以及任何对 VM 或内核子系统运行机制感兴趣的爱好者。 不要错过这本书,你会发现它有多神奇。 白 洛 华科大喻家山 前言 Linux 的发展侧重于实践而非纸上谈兵。当建议在已有的应用当中使用一种新算法或变更时,人们通常要求编码与理论一致。虚拟内存系统中使用的许多算法都是由理论学家提出的,但实现它们的方法基本上已经和原来的理论相脱离。狭义上,Linux 确实遵循了传统意义上从设计到实现的开发周期,但是随着系统在真实世界中的运转而进行的变更以及开发者直觉性的决定是很普遍的事情。 这意味着 VM 在实践中表现良好。然而,除了少量网站上未完成的部分框架和这些网站上早期的草稿以外,基本上没有一套完好无缺 VM 文档。文档的匮乏直接导致 VM 只能被很少一部分内核开发人员所完全理解。新的开发人员在了 VM 的运行机制时总是被告之去阅读源码。极少或根本没有任何信息对这种实现的理论基础进行描述。这就导致一个只想了解概要的人不得不投入大量的时间阅读源码和学习内存管理。 这本书讲述了 Linux 内核 2.4.22 下 VM 的实现细节,同时给出了内核 2.6 下 VM 变更情况的简介。在讨论实现的同时,也会详细介绍 Linux VM 的理论基础。这本书并不是为成为一本内存管理的书而设计的,而是为了在了解理论基础的情况下,理解 VM 为什么要以如此独特而简单的方式实现。 为完善讲述内容,在附录里面包含了对 VM 中重要部分的代码注释。这极大减小了开发者或研究人员在理解 Linux VM 的工作方式时所需投入的时间,这是因为即使 Linux 的版本不同,其 VM 也是按照类似的代码组织方式实现的。也就是说,只要我们深入理解内核 2.4的 VM,其后的 2.5 开发版以及 2.6 的最终发布版中的 VM 我们也能在几周之内掌握清楚。 针对的读者 任何对 VM 以及内核子系统的运行机制感兴趣的读者,在本书中都将找到满意的答案。比起其它的子系统,VM 对操作系统的整体性能具有重要的影响。VM 也是 Linux 中最难理解、文档最糟糕的一个子系统,部分原因就在于其相关文档资料的欠缺。如果事先对整个VM 没有一个清晰的概念模型,要想分离出并理解 VM 的代码相当困难。本书就是为了给那些即将阅读源码的读者一个细节性的描述。 本书对那些需要改进 VM 以满足自身需要的开发人员和需要降低理 VM 难度的读者来说非常有益。同时,对于需要与 VM 打交道的子系统开发人员以及想清晰理解现代操作系统内存管理实现方式的研究人员来说,也是获益匪浅。甚至是对一些只想更多了解该子系统的其他人员而言,他们无需阅读源码就能轻易的了 VM 中涵盖所有细节的函数功能。 尽管如此,读者在翻阅本书之前,至少应当阅读一本有关通用操作系统方面,或是介绍通用 Linux 内核的书,并且掌握 C 语言的一般知识。尽管作者竭尽全力以使本书通俗易懂但前提是读者必须提前了解通用操作系统的相关知识。 本书概要 www.mbtrend.com 在第一章,详细介绍如何分析,浏览以及管理源代码。本书介绍了三种工具,其中的主要工具是 Linux 交叉引用器(LXR),我们可以使用它来以网页或 CodeViz 的形式阅读源码,其中 CodeViz 是在研究本书的同时为产生调用图而开发的。最后一个工具就 PatchSet,它用来管理内核和应用程序补丁。手工的使用补丁比较耗时,而且使用诸如 CVS(并发版本控制系统)(http://www.cvshome.org/)或者 BitKeeper(http://www.bitmover.com)等类似的版本控制软件也不是一个好的选择。通过 PatchSet,一个简单的规范文件就解决了使用哪些源码、哪些补丁以及内核如何配置等问题。 在其后的几个章节,我们将详细讨论 Linux 中 VM 实现的各个部分,比如,如何以与体系结构无关的方式描述内存,处理器怎样管理内存以及具体的分配器如何分配内存等问题。每一章都涉及描述 Linux 行为的源码,以及实现过程中用到的函数和调用图,以使读者对代码的组织结构有清晰的认识。每章均以“哪些新特性”作为最后一节结束用于介绍 VM 在2.6 版本内核中的新特性。 附录包含了 VM 中大部分代码的注释,对其中一些比较复杂的部分也进行了逐句解释。即使是在两个不同的内核发布版本间,VM 的风格也是基本一致的,因而深入理解内核 2.4中的 VM 对于理解即将发布的内核 2.6 具有重要意义。 2.6 中有哪些新特性 在编写本书时,2.6.0-test4 已经发布,因而 2.6.0 的最终版本将指日可待。幸好 2.6 中的VM 与 2.4 比较起来,大部分都相似。但是 2.6 中依然有些新的方法和概念,忽略它们是非常可惜的。因此本书在“2.6 中有哪些新特性”这一小节中将分别介绍。从一定程度上表述,阅读这些章节的前提是你已经阅读了本书的其他几个部分,因而如果你是第一次阅读本书,可以仅浏览这些章节。“2.6 中有哪些新特性”小节中的内容对于理解 2.5 和 2.6 的 VM 代码具有很强的辅助作用。这些小节基于 2.6.0-test4 的内核版本,在 2.6 正式版本发布前,不会有太大的改变。但是,它们依然容易发生改动,所以可以将这些小节的内容看作指导方针,却不能当成既定的事实。 附带光盘 本书附带有一张光盘。强烈推荐使用光盘以方便读者更加熟悉本书,尤其是对于想通过本书获得长足进步或者需要查看附录中代码注释的读者。推荐在 GNU/Linux 系统中使用CD,但并不要求。
|
|