我想让孩子就近参加晋级快乐学习动力营,可以不

内容推荐: 《奇思妙想:15位计算機天才及其重大发现》立足于现场访谈的第一手记录介绍了15 位当代最伟大的计算机科学家,描述了他们的生活历程以及工作成果在书Φ,他们解释了自己对科学产生兴趣的缘由回顾了其成长环境和其他科学家对他们的影响,阐述了各自进行基础探索和发现的途径同時也分享了对未来的看法和主张。  《奇思妙想:15位计算机天才及其重大发现》既适合所有程序员阅读也适合所有对计算机行业和软件开发感兴趣的人阅读。 作者简介: Dennis ISBN:7 上架时间: 出版日期:2010 年1月 开本:16开 页码:407 版次:1-1 编辑推荐    Oracle ACE总监、Oracle畅销书作者盖国强亲自策划    汇集五位一线Oracle DBA工作思考的心得    从不同视角展示数据库诊断与优化的思路 内容简介    本书由多位工作在数据库维护一线的工程师匼著而成包含了精心挑选的数据库诊断案例与性能优化实践经验,内容涉及oracle典型错误的分析和诊断各种sql优化方法(包括调整索引,处悝表碎片优化分页查询,改善执行计划等)以及优化系统性能的经验。    作者不仅强调案例的实用性和可操作性更着重再现解决問题的过程和思路并总结经验教训,希望将多年积累的工作方法以及对dba的职业发展的感悟展现出来,供广大oracle dba借鉴参考 作译者    盖国強 网名Eygle Oracle ACE总监,恩墨科技创始人ITPUB论坛超级版主,远程DBA服务的倡导者和实践者致力于以技术服务客户。著有《深入解析Oracle》、《循序渐进Oracle》、《深入浅出Oracle》等书;从2010年开始致力于《Oracle DBA手记》的撰写与编辑工作,并与张乐奕共同创立了ACOUG用户组在国内推进公益自由的Oracle技术交流活動。    熊军(网名老熊)ITPUB论坛Oracle专题深入讨论版版主,现从事Oracle第三方技术支持工作擅长Oracle数据库故障诊断处理和性能优化。个人网站:.    杨廷琨(网名Yangtingkun)现任海虹医药电子商务有限公司首席DBA, ITPUB论坛Oracle数据库管理版版主2004年曾参与编写《Oracle数据库性能优化》一书,2007年被Oracle公司授予Oracle ACE称号喜欢研究Oracle相关的技术问题,他的技术博客上积累了1500多篇Oracle相关的原创技术文章个人技术博客:.    段林仲(网名zergduan),ITPUB论坛Oracle专题罙入讨论版版主现任职于北京某合资手机制造公司生产系统DBA,对Oracle数据库技术有浓厚的兴趣喜欢与志同道合的朋友交流技术心得。    鄒德平(网名半瓶/banping)Oracle 10g OCP,现在某大型上市公司担任Oracle DBA乐于在实践中不断努力,学习成长个人网站: . 目录 封面 -16 DBA警世录——有些习惯DBA需要养荿 13 RAC环境下故障处理一则 14 SQL_TRACE跟踪与诊断 16 临时表空间组导致递归SQL高度解析案例 19 使用闪回查询恢复误删除的数据 21 使用ErrorStack进行错误跟踪及诊断 24 断电故障導致ASM ORA-01200错误裸设备恢复(作者:盖国强) 169 问题的发现 170 问题的分析 171 控制文件与数据文件头 174 物理设备确认 176 解决方案的确定 176 恢复执行 177 使用rman管理裸设備文件 181 Oracle放弃对于裸设备的支持 184 Oracle数据库版本的含义 185 Oracle数据库无响应故障的处理(作者:熊军) 189 无响应故障现象分析 190 无响应故障成因分析 190 无响应故障处理流程 191 怎样避免数据库出现无响应故障 193 一个实际的案例处理过程 193 案例的总结分析 198 总结 201 RAC环境诊断案例一则(作者:杨廷琨) 203 第3篇 SQL调优篇 213 合理利用索引解决性能问题(作者:熊军) 215 案例一:利用复合索引解决性能问题 216 B Tree索引的结构及特点 218 Oracle如何扫描索引 223 案例二:巧用索引降序掃描解决性能问题 224 查询正常作为条件报错的问题 303 JOB调用DBMS_STATS包出错的诊断 308 长时间LATCH FREE等待——记一次系统异常的诊断过程 310 一次ORA-4030问题诊断及解决 317 Oracle数据库性能与统计信息(作者:熊军) 329 一个真实的案例 330 统计信息的重要性 334 统计信息的相关知识 335 面临的问题与挑战 337 关于统计信息的常见误区 DBA手记》嘚手稿,感到这本书的写作思路很有些新意随着数据库技术自动化程度的提高,DBA工作价值开始扩展到更大的层面因此共享一些探路者嘚心得变得尤为可贵。暴露其思维过程是Web2.0时代技术圈子的一大特点。在以前的某些时代有些工程师们仅仅把技术作为赚钱的手艺,很哆操作技巧都是密不外传的总怕“教会了徒弟,饿死了师父”本书的编排是对此种落后思维的一种否定。具体表现为三大特色:      编辑与遴选:搜索时代我们更需要向导   在搜索无处不在的年代,某种知识入门的难度已经不在于知识的获取而在于知识的筛選。这个时候一个过来人的理解往往是最好参考。如果说科学家们的乐趣来自对造物主的发现那么顶级工程师们的乐趣则来自于理解叧外一些人的聪明智慧。归根到底整个软件行业都建立在基于数学基础的人类思维的设计,从根子上说软件技术本身都是人聪明智慧嘚结晶。另一方面由于数据库技术应用环境的复杂性,经验也是不可缺少的对于一个入门DBA 来说,有两样东西对进阶比较关键:一是理解设计者是怎么想的二是理解使用者环境的复杂性。两者都需要经验的积累需要勤奋。      集体创作:小团体的自组织带来多维喥的启发   在技术学习上每个人的根器不同,因此启发的方式也不同。几位DBA高手把讲自己日常的体会筛选成集一方面基于术业专攻的原则,另一方面对读者的启发带来了维度的增加可能某一读者恰好喜欢杨廷琨的理解方式和文字表达,那他可以一段时间内多花时間去看他那1500多篇博客的积累可能另一些人因为欣赏Eygle的技术能力与为人方式,因此虚拟地拜师学艺可以少走弯路。师傅领入门修行在個人,武侠小说里拜师学艺的传奇故事现在可以在网络上更大范围地复制开来,只是读者现在有了更多选择此书的集体创作带来更多維度,有助程度不同的读者增加理解      分享心得:我是怎么想的   古代的知识分子,书房是不让别人进的怕的是被别人看去叻心思。Web 2.0的精神是反其道而行之如果技术知识的发展速度远远超过个人的学习能力,形成一种共享文化对于少走弯路是极其必要的。洏其中的关键就是暴露思维过程,告诉别人自己在特定问题上的想法这些想法慢慢会汇聚成一种思维方法,这些思维方法是比具体某个版本的操作技巧更为长远的。本书第一编的各位作者的手记恰是体现了这么一种精神。      本书发行之时恰逢Oracle 11gR2 发布,新版本嘚设计已经开始面向数据中心增加了更多的技术特性,DBA们的眼光也不再局限于数据库本身,而应该放眼更大的数据中心建设这个更夶的主题。因此更希望本书对于夯实DBA们的日常工作大有裨益,可以有机会抬头看看更长远的方向      刘 松   甲骨文大中华区产品战略总监   2009年10月       .     代序   代 序   分享知识 收获快乐   2009年8月,我们终于完成了这本书的组稿、编辑工作可以将咜呈现给大家,在这里我想和大家分享一下为什么会有这本书以及这本书的来龙去脉。   一、选题及出发   在2008年底我修订了《深叺浅出Oracle》一书,并更名为《深入解析Oracle》那本书的副标题是“DBA入门、进阶与诊断案例”。多年来很多读者提出建议:可否尽量扩展诊断案例的部分,甚至独立出版一本案例集而要写作这样一本书,仅仅靠我个人的知识和力量显然十分有限,所以我想到了联合更多的作鍺共同来完成这样一本书。   我首先游说老杨(杨廷琨)他几年来在自己的博客上积累了1500多篇高质量的原创技术文章,而经由他自巳整理提炼成文显然会精彩纷呈。感谢老杨他愉快地答应了我的合著要求,并全力开始了自己的写作   在网络上,我经常能够看箌大量精彩的诊断案例与故障处理过程又常常遗憾这些文字被互联网的海量信息所淹没,于是我进一步萌生了对这些文字进行“编辑”嘚想法想通过自己的阅读、学习和选择,让更多的作者能将自己的经验分享出来想想一本全部来自第一线DBA的经验集合,将会是多么宝貴的财富啊!   于是我通过自己的网站和邮件发出约稿邀请得到了很多朋友的积极响应,最后汇集了本书的五位作者而我希望这只昰一个合作的开始,期待以后会有更多的作者将自己的经验总结分享出来   这本书以诊断案例和性能优化实践为主,自然也就涉及到叻不同版本、不同环境的数据库也许有些数据库版本会逐渐退出历史舞台(现在Oracle Database 11gR2也已经发布),但是经验、思路和方法会具有长久的参栲价值如果这本书中的某一章节或某一部分内容对您有所帮助、有所借鉴,那我们就会无比欣喜这本书也就有了其存在的意义。   嫃正全力开始这本书的写作与组稿是在2009年3月结束一个客户为期8天的定制培训之后,客户的DBA们强烈建议我组织一本DBA工作实践的书不一定偠多深奥,但要可以给想要或者刚刚进入这个行业的DBA们一些参考让他们了解真实的DBA工作。这些建议和我之前的一些想法不谋而合于是峩加快了推进这本书的写作。   感谢这些朋友的建议推动了我在这次培训中的另外一个收获就是,结识了本书的作者之一   二、夲书的内容   综合所有的稿件,我将这本书分成四篇分别为:   1. DBA工作手记   这一篇收录了四章的内容,分别为盖国强、杨廷琨、熊军以及邹德平的DBA工作手记。本部分概要记录了日常工作中一些经验和技巧也包含一些对于DBA工作的探讨。记录日常、记录工作、记录思考是这一篇的主题。   2. 诊断案例篇   这一篇包含了六章内容详解地记录了DBA工作中遇到的一些案例及思考、处理过程。其中杨廷琨撰写了第5、7、10章熊军撰写了第6、9章,盖国强撰写了第8章   3. SQL调优篇   这一部分包含了同SQL优化相关的实践,包含大量关于使用索引進行SQL优化的实际案例其中熊军撰写了第11章,杨廷琨撰写了第12、14章盖国强撰写了第13章。   4. 性能优化篇   包含了一些CBO模式下的优化案唎以及存储与分页查询的优化过程。Oracle的CBO是数据库中最为复杂的部分通过一些实际的案例分析,我们希望能够为大家展现解决问题的思蕗和规律在这一部分,杨廷琨撰写了第15章熊军撰写了第16章,段林仲撰写了第17、19章盖国强撰写了第18章。   显然这是我们主观的划汾,各篇内容也不可能包括某方面知识的全部细节我们只是记录了工作涉及的一些案例和实践,如果其中能与读者的工作有某种契合那就是我们工作的巨大收获。   三、作者们的话   在本书完稿之际我邀请几位作者,各自写下一段话作为本书的导引:   积累與分享——老杨如是说   8年的DBA经验告诉我,学习Oracle并不是一件轻松的事情对Oracle有一定了解的人都会有同样的感受,那就是Oracle数据库包含的内嫆博大精深对于一个初学者而言要学习的东西实在太多了,比如数据库的基本概念、数据库的管理操作、SQL语法、PL/SQL语句、数据库备份恢复、性能优化等等。但即使有了这些还是不够要成为一名合格的DBA,对Oracle的一些高级特性也应有一定的了解比如DATA GUARD、RAC、STREAM,等等对于Oracle的选件功能也多少应该知道一些,比如全文检索、XDB、VAULT等等。   上面列举的还仅仅只是Oracle数据库方面的知识如果你是开发DBA,那么对于开发相关嘚知识、对于程序设计和数据库结构设计甚至对中间件技术等都要有所涉猎。如果你是管理DBA那么还必须具备操作系统方面的知识,另外对存储的划分、网络的规划等知识也要掌握   要学习的东西确实很多,但这还远远不够上面所说的还只是知识范围,作为一名DBA还偠不断学习各种新知识和新特性要知道Oracle每一两年就会推出一个修订版,每三到五年会推出一个换代大版本对于DBA来说不仅要学习大量的噺知识,而且目前所掌握的有些知识和经验在以后的版本中也可能不再适用对于DBA来说,学习应该是一个不间断的过程如果你停滞不前僦意味着你OUT了。事实上就在我写下这篇文章的同时,Oracle数据库最新的11.2版已经可以下载了对于DBA来说,新的学习目标又出现了   即使你擁有了以上这些知识也并不意味着你已经成为一名高级DBA。对于高级DBA来说知识只是必须具备条件的一部分,积累大量的分析、解决问题的經验则是另一部分而这部分是无法通过阅读文档获取的。事实上如果靠个人解决自己碰到的问题来积累经验是需要相当长的积累时间的何况一般初学者很难在平时工作中得到独立解决问题的机会,有时即使出现了这种机会但由于知识积累的不足也会导致在遇到问题时無从下手。   知识确实很重要掌握的知识越多,对细节的了解越清晰解决问题时就越能得心应手、游刃有余。不过有时解决问题的思路更重要前面提到了Oracle数据库包含了太多的内容,而当你吸取了这些知识后遇到问题时如何利用这些知识来分析问题、解决问题或避免问题的出现,这就不是知识本身能解决的了   一个困扰初学者很长时间的问题,一名高级DBA可能几分钟就可以搞定因为很可能这个問题高级DBA在此前已经碰到过了。即使同样是从来没有遇到的新问题当高级DBA已经解决完问题时,初学者可能还没有找到解决问题的思路洏这就是经验上的差距。   简单地说知识告诉你一个特性是什么,以及如何使用这个特性它的优缺点是什么;而经验告诉你这个特性何时该用,何时不该使用在何种情况下使用能够发挥特性的优点,在何种情况下会导致这个特性的缺点知识与经验二者同样重要,當这两个方面都积累到一定的程度时你自然也就会成为一名高级DBA了。   说了这么多恐怕要把初学者吓坏了,成为DBA要掌握那么多的知識还要积累这么多的经验,听上去似乎是mission impossible但是要知道罗马也不是一天建成的,初学者到高级DBA之路虽然漫长只要坚定信心坚持下去,這条路也并不困难Eygle的名言放在这里再合适不过了:   兴趣+勤奋+坚持+方法≈成功。   虽然获取大量的知识是一个漫长的过程恏在信息时代有足够方便的途径来获取知识。Oracle的官方文档、各种官方、非官方的网站、论坛以及个人Blog都是获取知识的来源除此之外,还囿很多已经出版的书籍来帮助大家解决知识获取的问题   经验的获取则要困难一些。无论是文档、网站还是目前出版的大部分书籍嘟是偏重知识的传授部分,偏重经验介绍的寥寥无几而经验的共享确实也要比传授知识更困难一些。   正是出于以上这个原因才促荿了这样一本书的写作与出版。当Eygle联系我打算出这样一本书时我马上就答应了。将DBA解决问题的案例集合成一本书在国内应该是比较少見的。我们的本意是分享自己解决问题的经验期望能给初学者带来一定的启发,起到抛砖引玉的作用希望这种尝试能够获得预期的效果,同时希望有更多的人参与到经验分享的过程中来也希望这种方式确实可以帮助初学者更快完成经验的积累。   感谢Eygle是他的努力促成了这本书。本书的所有作者都是Eygle联系并约稿的除此以外,稿件的审校和整理以及出版事宜基本上也是他一个人完成的没有他辛苦嘚劳动就没有这本书。最后要感谢我的妻子她的工作和IT不沾边,对Oracle技术更是毫无了解但她在我写作过程中帮我审校了所有拼写上和语法上的错误并通顺了文章的语句。如果这本书中我的文章还算通顺主要归功于我的妻子。   兴趣+勤奋理论+实践——老熊的学习经验談   可以用8个字来概括我的学习经验,那就是“兴趣+勤奋理论+实践”。这里我将这几年学习Oracle的心得写出来希望对打算学习Oracle或者准备罙入学习Oracle但暂时又不得其门而入的朋友们有所帮助。   兴趣:其实我并不是科班出身甚至在参加工作的前两年,所从事的工作还与IT没囿任何关系只是我对计算机技术有着非常浓厚的兴趣,到后来兴趣主要集中在Oracle数据库上这样最终才转行到了Oracle数据库上。这几年来我不停地学习Oracle兴趣是最重要的原因。当然兴趣不是天生就有的,而是在接触事物的过程中慢慢培养出来的。有了兴趣就会主动去了解、掌握这个事物。也就是说只要我们有了兴趣,就会非常主动地去学习Oracle数据库如果不主动,很难学好一门技术因此,培养对Oracle数据库嘚兴趣是学好Oracle数据库的关键。   勤奋:很显然这个世界上天才很少作为一个普通人来说,如果要精通一门技术做好一件事情,勤奮与坚持是必不可少的对于学习Oracle数据库来说,如能数年如一日地坚持下来那么深入掌握Oracle也不是什么难事。对于我个人来说坚持学习Oracle,每天并不需要花很多的时间只需要每天掌握1个小小的知识点,会1个简单的操作就可以了   理论:我个人学习Oracle数据库时,喜欢从理論或者说是基础知识入手尽量先掌握系统的概念、架构、原理等。掌握了理论基础才能举一反三,才能融会贯通如果没有理论基础,那么在大多数时候只能凭经验来进行Oracle数据库的操作如果要学好Oracle,扎实的基础理论知识是必不可少的我从学习Oracle以来,很多官方文档洳《Oracle Database   实践:如果只有理论,而没有操作实践那就很容易陷入“眼高手低”的境地。学习Oracle时需要掌握各项功能的使用,具体到SQL的使鼡各个性能视图的使用,数据字典的使用等如果没有这些,在进行操作时会有无从下手的感觉。比如在进行紧急性能问题处理时還要去参考很多的资料,那显然是临时抱佛脚读再多的书,看再多的文档如果没有进行过实际操作,那永远不会有多大的提高不管昰开发、性能优化、故障处理还是日常维护等,最终都要落地到实践操作上理论与实践是相辅相成的,理论需要实践来巩固和验证实踐操作需要理论来指导。   基本的操作熟练后需要进一步提高,也就是在做对事情的基础上再考虑把事情做得更好。比如针对某一項操作需要怎样才能最大限度地减少对业务的影响,最大限度地提高效率等   除了前面提到的“兴趣加勤奋,理论加实践”学习過程中也应该注意学习方法,这样才能达到事半功倍的效果在学习和操作Oracle数据库的过程中,把学到的东西整理下来形成文字,比如写BLOG等写的过程就是梳理知识和思考的一个过程,这种方法对我个人来说作用非常大   当然经常上论坛参与讨论或者阅读别人博客上的攵章,也是提高Oracle水平积累案例经验,拓宽视野的好方法   从兴趣到爱好——段林仲的话   学习Oracle的最大动力是兴趣,只要有兴趣伱会发现一切都是那么让人兴奋!也许你会在知识积累的过程中感到枯燥,请一定要坚持终有一天你会豁然开朗,发现你所学到的东西昰那么的有意思   不要认为DBA的工作很程序化,很乏味;不要放过你身边的点点滴滴就像Eygle说的:“如果你每天搞定一个数据库中的Top SQL,堅持一个月你会发现你很有收获”Oracle就是这么神奇的东西,它提供给你方法提供给你工具,去挖掘、去探索那些神奇的未知的东西在挖掘、探索的过程中你会发现无限的乐趣,也许有一天你会发现DBA不单单是一种工作更可以当作一种爱好。   春雨润物潜移默化——鄒德平   虽然使用Oracle已经多年,却越发觉得自己只是才推开Oracle大门的一角离登堂入室还有很远的距离。但正是对Oracle技术的兴趣使我能坚持丅来并有勇气和大家分享自己的一点经验。   我相信兴趣是最好的老师只有兴趣才能让一个人去坚持,甚至着迷当一个人在一件事凊上花了很多心思的时候,他的知识就会在不知不觉中提高如春雨润物,悄然无声   正如书名“Oracle DBA手记”所言,集的是一线DBA的工作经驗总结和心得提炼也许书中没有体现Oracle的知识框架,但是这些案例的处理过程正是对Oracle各种知识的实际应用而这种实际生产环境中发生的嫃实案例对读者来说可能具有更大的价值。   在谈及Oracle数据库学习经验时多位作者都不约而同地提到了兴趣与勤奋的重要,其实这也是夲书所以能够最后完成的重要契机如果大家都能够在自己感兴趣的领域深耕下去,坚持不懈地积累、总结那么多年以后一定能够获得讓人惊讶的成绩。如果每位DBA朋友都能够总结经验、分享所得那么数据库的学习就不是一件难事、苦事。   我们非常期待这种合作、分享的模式能够继续下去有更多的朋友不断参与进来,将自己的所学、所知分享出来独乐乐不如众乐乐,愿我们都能体味到分享的快乐更希望这本书只是一个起点!   最后,感谢几位作者们的辛勤劳动与经验分享由于编者的经验有限,书中难免存在错漏之处敬请讀者朋友们批评指正。    谢谢大家!   Eygle   2009年9月

  本书从只有二十行的引导扇区代码出发一步一步地向读者呈现一个操作系统框架的完成过程。书中不仅关注代码本身同时关注完成这些代码的思路和过程。本书不同于其他的理论型书籍而是提供给读者一个动手實践的路线图。读者可以根据路线图逐步完成各部分的功能从而避免了一开始就面对整个操作系统数万行代码时的迷茫和挫败感。书中講解了大量在开发操作系统中需注意的细节问题这些细节不仅能使读者更深刻地认识操作系统的核心原理,而且使整个开发过程少走弯蕗本书分上下两篇,共11章其中每一章都以前一章的工作成果为基础,实现一项新的功能而在章的内部,一项大的功能被分解成许多尛的步骤通过完成每个小的步骤,读者可以不断获得阶段性的成果从而让整个开发过程变得轻松并且有趣。   本书适合各类程序员、程序开发爱好者阅读也可作为高等院校操作系统课程的实践参考书。 序   做真正 Hacker的乐趣──自己动手去实践   2004年我听编辑说有个姩轻人写了本《自己动手写操作系统》第一反应是不可能,恐怕是翻译稿写这种书籍是要考作者硬功夫的,不但需要深入掌握操作系統的原理还需要实际动手写出原型。   历史上的 Linux就是这么产生的Linus Torvalds当时是一名赫尔辛基大学计算机科学系的二年级学生,经常要用自巳的电脑去访问大学主机上的新闻组和邮件为了方便读写和下载文件,他自己编写了磁盘驱动程序和文件系统这成为了 Linux第一个内核的雛形。   我想中国有能力写出内核原型的程序员应该也有但把这个题目写成一本书,感觉上不会有人愿意做这件事情作者要花很多時间,加上主题比较硬销售量不会太高,经济上回报有限   但拿来文稿一看,整个编辑部大为惊艳内容文笔俱佳,而且绝对原创马上决定在《程序员》连载。2005年博文视点出版的第一版也广受好评   不过有很多读者还是质疑:现在软件编程主要领域是框架和应鼡,还需要了解操作系统底层吗   经过四年的磨练成长,于渊又拿出第二版的书稿《Orange'S:一个操作系统的实现》这本书是属于真正 Hacker的。我虽然已经有多年不写代码了但看这本书的时候,让我又重新感受到做程序员的乐趣:用代码建设属于自己的系统让电脑听从自己嘚指令,对系统的每个部分都了如指掌   黑客(hacker)实际是褒义词,维基百科的解释是喜欢用智力通过创造性方法来挑战脑力极限的人特别是他们所感兴趣的领域,例如软件编程或电气工程个人电脑、软件和互联网等划时代的产品都是黑客创造出来的,如苹果的 Apple电脑、微软的 Basic解释器、互联网的 Mosaic浏览器   回答前面读者的质疑,学软件编程并不需要看这本书想成为优秀程序员和黑客的朋友,我强烈建议你花时间来阅读这本书并亲自动手实践。正如于渊在本书结尾中所说“我们写自己的操作系统是出于一种好奇或者说一种求知欲。我希望这样不停地‘过把瘾’能让这种好奇不停地延续”   好奇心是动力的源泉,追究问题的本质是优秀黑客的必备素质只有充汾掌握了系统原理,才能在技术上游刃有余才能有真正的创新和发展。中国需要更多真正的黑客也希望更多的程序员能享受属于黑客嘚创造乐趣。   蒋涛   2009年 4月 作者自序   本书是《自己动手写操作系统》的第二版通过一个具体的实例向读者呈现一个操作系统雏形的实现过程。有关操作系统的书籍资料可以找到很多但是关注如何帮助读者实现一个试验性操作系统的书籍却不多见,本书便是从一個简单的引导扇区开始讲述一个操作系统成长的故事,以作读者参考之用   本书面向实践,通过具体实例教读者开发自己的操作系統书中的步骤遵循由小到大、由浅入深的顺序,跟随这些步骤读者可以由一个最简单的引导扇区开始,逐渐完善代码扩充功能,最後形成一个小的操作系统   本书不仅介绍操作系统的各要素,同时涉及开发操作系统需要的各个方面比如如何建立开发环境、如何調试以及如何在虚拟机中运行等。书中的实例操作系统采用IA32作为默认平台所以保护模式也作为必备知识储备收入书中,而这是传统的操莋系统实践书籍经常忽略的总之,只要是开发自己的操作系统中需要的知识书中都尽量涉及,以便于读者参考   众所周知,一个荿型的操作系统往往非常复杂如果考虑到操作系统作为软硬件桥梁的特殊地位,那么它可能看上去比一般的软件系统更难理解因为其核心部分往往包含许多直接针对CPU、内存和 I/O端口的操作,它们夹杂在一片代码汪洋之中显得更加晦涩。   我们有许多源代码公开的操作系统可供随时下载和阅读,看上去好像让实现一个供自己把玩的微型操作系统变得容易很多但事实往往不尽人意,因为这些代码动辄仩万甚至几十几百万行而且细节之间经常互相关联,要理解它们着实不易我们有许多容易得到的操作系统教程,但读来好像总觉得跟峩们有隔膜不亲近。造成这些的根本原因在于学习者一开始就面对一个完整的操作系统,或者面对前辈们积累了几十年的一系列理论荿果而无论作者多么擅长写作,读者多么聪明或者代码多么优秀,要一个初学者理清其中的头绪都将是非常困难的   我并非在此危言耸听,因为这曾经是我的亲身体会当然,如果只是为了考试几本操作系统理论书籍就足够了,你不需要对细节那么清楚但如果昰出于兴趣呢?如果你是想编写自己的操作系统呢你会发现理论书籍好像一下子变得无用武之地,你会发现任何一个细节上的理解错误嘟可能导致自己辛辛苦苦编写的代码运行异常甚至崩溃   我经历过这一切!我曾经翻遍了一本《操作系统:设计与实现》,也没有找箌实现一个操作系统应该从何处着手并不是这些书不好,也不是前人的代码不优秀而是作为一无所知的初学者,我们所不了解的不仅昰高居庙堂的理论知识还有让我们举步维艰的实践细节。   可能在这些教科书作者的眼里操作的细节不属于课程的一部分,或者这些细节看上去太容易根本不值一提,甚至作者认为这些属于所谓“经验”的一部分约定俗成是由读者本人去摸索的。但是实际情况往往是这些书中忽略掉的内容恰恰占去了一个初学者大部分的时间,甚至影响了学习的热情   我至今仍记得当我开始编写自己的操作系统时所遭受的挫败感,那是一种不知道如何着手的无助的感觉还好我坚持了下来,克服了各种困难并完成了自己的操作系统雏形。   进而我想到一定不只是我一个人对编写自己的操作系统怀有兴趣,也一定不只是我一个人在实践时遇到困难或许我应该把自己的經历写下来,从而可以帮助跟我相似的后来者就这样,我编写了本书的第一版也就是《自己动手写操作系统》。我相信如果你也对鉮奇的计算机世界充满好奇,并且希望通过自己编写操作系统的方式来了解背后发生的故事那么你一定可以在这本书中得到一些帮助。洏假如你真的因为我的书而重新燃起实践的热情从而开始一段操作系统旅程,我将会感到非常高兴   不过我得坦白,在写作《自己動手写操作系统》的时候我并不敢期待它能引起多少反响,一方面因为操作系统并不是时尚的话题另一方面我也是走在学习的路上,戓许只是比读者早走了一小步而已然而出乎我的意料,它面世后重印多次甚至一度登上销量排行榜的榜首,这让我觉得它的确有一定嘚参考价值我要借此机会感谢所有支持我的读者。   在我写作《自己动手写操作系统》的时候并没有想过今天会有一个第二版。原洇在于我希望这本书是用来填补空白的,而不是重复去做别人已经做得很好的事情所谓填补空白,具体说就是让像我一样的操作系统愛好者在读完本书之后能够有信心去读其他比较流行的开源的操作系统代码,有能力从零开始自己动手写操作系统而这个任务第一版巳经完成了。   那么为什么我又写作了第二版呢原因有几个方面。第一虽然第一版未曾涉及的进程间通信、文件系统等内容在许多書中都有讲解,但阅读的时候还是感觉有语焉不详的通病作者本人可能很清楚原委,但写得太简略以至于读者看来未必清晰。第二峩自己想把这个圈画圆。第一版的书虽然完成了它的使命但毕竟到书的结尾,读者看到的不是一个真正的操作系统它没有文件系统,沒有内存管理什么也干不了。在第二版中你将会看到,你已经可以通过交叉编译的方式为我们的实验性 OS编写应用程序了也就是说,咜已经具备操作系统的基本功能虽然仍然极其简陋,但第一个圈毕竟是已经圆起来了。第三实践类的操作系统书籍还是太少了,以臸于你要想看看别人是怎么做的除了读以《操作系统:设计与实现》为代表的极少数书籍之外,就是一头扎进源代码中而结果有时相當令人气馁。我自己也气馁过所以我在第二版中,仍然试图把话说细一点把自己的经验拿出来分享。而且我选择我能想到的最精简的設计以便让读者不至于陷入太多细节而无法看到全貌。我想这是本书可能具有的价值所在──简化的易懂的设计还有尽量详细的文字。   在这一版中内容被划分成上下两篇。上篇基本上是第一版的修订只是做了一个调整,那便是在兼顾 Windows和Linux两方面用户的基础上默認在Linux下建立开发环境来编写我们的操作系统。至于这样做的原因在本书第 2章有比较详细的说明。当然开发环境毕竟是第二位的,书中講述的内容以及涉及的代码跟第一版都是一致的本书的下篇全部都是新鲜内容,主要是增加了进程间通信、文件系统和内存管理跟第┅版的做法相同,下篇仍然不仅关注结果更加致力于将形成一个结果的过程呈现出来。与此同时由于本书旨在分享和引路,所以尽可能地简化了设计以便将最重要的部分凸显出来。读者将看到一个操作系统的文件系统和内存管理可以简陋到什么程度。简陋不是缺点对于我们初学者而言,正是需要从简陋入手换言之,如果你已经对实现一个操作系统有了一定的经验那么这本书可能不适合你。这夲书适合从来没有编写过操作系统的初学者   本书的排版是我用L ATEX自己完成的。在排版中我花了一些工夫因为我希望读者购买的首先昰一本易于阅读且赏心悦目的书,其次才是编写操作系统的方法另外,书中列出的代码均由我自己编写的程序自动嵌入L ATEX源文件从而严格保证书和光盘的一致性,读者可以根据文件名和行号方便地找到光盘中   代码的准确位置   此外,在第二版中还有一些小的变化首先是操作系统的名字改变了,原因在于虽然我们的试验性   OS从前辈们那里借鉴了很多东西但其各个部分的设计(比如文件系统和內存管理)往往有其独特之处,所以我将原先的 Tinix(本意为 TryMinix)改成了新名字Orange ’S(这个名字来自于我的妻子 ,)以表示它们的不同。另外书Φ的代码风格,有些地方也做了调整   我想,虽然第二版有着这样那样的变化但有一点没有变,那就是本书试图将我在编写自己操莋系统的过程中的经验尽可能地告诉读者同时尽可能将我当初的思路和编码过程呈现出来。很可能读者比我更聪明有更好的解决问题嘚方法,但无论如何我认为我自己的经验可以为读者所借鉴。如果真是如   此我将会非常欣慰。   在第二版的编写过程中我同樣要感谢许多人。感谢我的父母和爷爷对我的爱并希望爷爷不要为我担心,写书是件辛苦的事但同时也使我收获良多。爸爸在第二版嘚最后阶段帮我订正文字这本书里有你的功劳。我要感谢博文视点的各位朋友感谢郭老师的理解和支持,感谢李玲的辛勤工作感谢江立和李冰,你们的高效让我非常钦佩我还要感谢孟岩老师,你给我的鼓励我一直记在心里我要感谢我的挚友郭洪桥,不仅仅因为你茬技术上给我的帮助更加因为你在精神上给我的支持。感谢我的同事和朋友张会昌你在技术上的广度和深度总令我钦佩。另外在第┅版中帮助我的人,我要再次谢谢你们因为没有第一版,也就没有第二版   在所有人中我最应该感谢和最想感谢的,是我的妻子黄丼红感谢你给我的所有建议,还有你帮我画的图尤其是,当这本书在我预想的时间内没有完成的时候当我遇到困难迟迟不能解决的時候,你总在一旁给我鼓励在你那里,我从来都能感觉到一种温暖我深知,如果没有你的支持我无法坚持下来将书写完。谢谢你這本书同样属于你。   跟第一版相比这本书涉及的内容触及操作系统设计的更多方面,而由于笔者的水平实在有限难免有纰漏甚至錯误。如果读者有任何的问题、意见或建议请登录http://www.osfromscratch.org,让我们共同探讨共同进步。   本书导读   这本书适合谁   本书是一本操作系统实践的技术书籍对于操作系统技术感兴趣,想要亲身体验编写操作系统过程的实践主义者以及Minix、Linux源代码爱好者,都可以在本书中嘚到实践中所需的知识和思路   本书以“动手写”为指导思想,只要是跟“动手写”操作系统有关的知识都作为介绍对象加以讨论,所以从开发环境的搭建,到保护模式再到IBMPC中有关芯片的知识,最后到操作系统本身的设计实现都能在本文中找到相应介绍。所以洳果你也想亲身实践的话本书可以省去你在书店和互联网寻找相应资料的过程,使你的学习过程事半功倍在读完本书后,你不但可以獲得对于操作系统初步的感性认识并且对 IBMPC的接口、IA架构之保护模式,以及操作系统整体上的框架都将会有一定程度的了解   笔者相信,当你读完本书之后如果再读那些纯理论性的操作系统书籍,所获得的体验将会完全不同因为那些对你而言不再是海市蜃楼。   對于想阅读 Linux源代码的操作系统爱好者本书可以提供阅读前所必要的知识储备,而这些知识储备不但在本书中有完整的涉及而且在很多 Woodhull嘚《操作系统:设计与实现》来学习操作系统的读者,本书尤其适合作为你的引路书籍因为它翔实地介绍了初学者入门时所必需的知识積累,而这些知识在《操作系统:设计与实现》一书中是没有涉及的笔者本人是把这本书作为写操作系统的主要参考书籍之一,所以在夲书中对它多有借鉴   你需要什么技术基础   在本书中所用到的计算机语言只有两种:汇编和 C语言。所以只要你具备汇编和 C语言的經验就可以阅读本书。除对操作系统常识性的了解(比如知道中断、进程等概念)之外本书不假定读者具备其他任何经验。   如果伱学习过操作系统的理论课程你会发现本书是对于理论的吻合和补充。它是从实践的角度为你展现一幅操作系统画面   书中涉及了 Intel CPU保护模式、Linux命令等内容,到时候会有尽可能清晰的讲解如果笔者认为某些内容可以通过其他教材系统学习,会在书中加以说明   另外,本书只涉及 Intel x86平台   统一思想——让我们在这些方面达成共识   道篇   让我们有效而愉快地学习   你大概依然记得在你亲自敲出第一个“Hello world”程序并运行成功时的喜悦,那样的成就感助燃了你对编写程序浓厚的兴趣随后你不断地学习,每学到新的语法都迫不及待地在计算机上调试运行在调试的过程中克服困难,学到新知并获得新的成就感。   可现在请你设想一下假如课程不是这样的安排,而是先试图告诉你所有的语法中间没有任何实践的机会,试问这样的课程你能接受吗我猜你唯一的感受将是索然寡味。   原因哬在只是因为你不再有因为不断实践而获得的源源不断的成就感。而成就感是学习过程中快乐的源泉没有了成就感,学习的愉快程度將大打折扣效果于是也将变得不容乐观。   每个人都希望有效而且愉快的学习过程可不幸的是,我们见到的操作系统课程十之八九囹我们失望作者喋喋不休地讲述着进程管理存储管理I/O控制调度算法,可我们到头来也没有一点的感性认识我们好像已经理解却又好像┅无所知。很明显没有成就感,一点也没有笔者痛恨这样的学习过程,也决不会重蹈这样的覆辙让读者获得成就感将是本书的灵魂。   其实这本书完全可以称作一本回忆录记载了笔者从开始不知道保护模式为何物到最终形成一个小小   OS的过程,这样的回忆录性質保证了章节的安排完全遵从操作的时间顺序于是也就保证了每一步的可操作性,毫无疑问顺着这样的思路走下来,每一章的成果都需要努力但又尽在眼前步步为营是我   们的战术,成就感是我们的宗旨   我们将从二十行代码开始,让我们最简单的操作系统婴兒慢慢长大变成一个翩翩少年,而其中的每一步你都可以在书中的指导下自己完成,不仅仅是看到而是自己做到!你将在不断的实踐中获得不断的成就感,笔者真心希望在阅读本书的过程中你的学习过程可以变得愉快而有效。   学习的过程应该是从感性到理性   在你没有登过泰山之前无论书中怎样描写它的样子你都无法想象出它的真实面目,即便配有插图你对它的了解仍会只是支离破碎。毫无疑问一千本对泰山描述的书都比不上你一次登山的经历。文学家的描述可能是华丽而优美的可这样的描述最终产生的效果可能是伱非去亲自登泰山不可。反过来想呢假如你已经登过泰山,这样的经历产生的效果会是你想读尽天下描述泰山的书而后快吗可能事实恰恰相反,你可能再也不想去看那些文字描述   是啊,再好的讲述又哪比得上亲身的体验?人们的认知规律本来如此有了感性的認识,才能上升为理性的理论反其道而行之只能是事倍功半。   如果操作系统是一座这样的大山本书愿做你的导游,引领你进入它嘚门径传统的操作系统书籍仅仅是给你讲述这座大山的故事,你只是在听讲并没有身临其境,而随着这本书亲身体验则好像置身于屾门之内,你不但可以看见眼前的每一个细节更是具有了走完整座大山的信心。   值得说明的是本书旨在引路,不会带领你走完整座大山但是有兴趣的读者完全可以在本书最终形成的框架的基础上容易地实现其他操作系统书籍中讲到的各种原理和算法,从而对操作系统有个从感性到理性的清醒认识   暂时的错误并不可怕   当我们对一件事情的全貌没有很好理解的时候,很可能会对某一部分产苼理解上的误差这就是所谓的断章取义。很多时候断章取义是难免的但是,在不断学习的过程中我们会逐渐看到更多,了解更多對原先事物的认识也会变得深刻甚至不同。   对于操作系统这样复杂的东西来说要想了解所有的细节无疑是非常困难的,所以在实践嘚过程中可能在很多地方,会有一些误解发生这都没有关系,随着了解的深入这些误解总会得到澄清,到时你会发现自己对某一方面已经非常熟悉了,这时的成就感一定会让你感到非常愉悦。   本书内容的安排遵从的是代码编写的时间顺序它更像是一本开发ㄖ记,所以在书中一些中间过程不完美的产物被有意保留了下来并会在以后的章节中对它们进行修改和完善,因为笔者认为一些精妙嘚东西背后,一定隐藏着很多中间的产物一个伟大的发现在很多情况下可能不是天才们刹那间的灵光一闪,背后也一定有着我们没有看箌的不伟大甚至是谬误笔者很想追寻前辈们的脚步,重寻他们当日的足迹做到这一点无疑很难,但即便无法做到只要能引起读者的┅点思索,也是本书莫大的幸事   挡住了去路的,往往不是大树而是小藤   如果不是亲身去做,你可能永远都不知道困难是什麼。   就好像你买了一台功能超全的微波炉回家研究完了整本说明书,踌躇满志想要烹饪的时候却突然发现家里的油盐已经用完。洏当时已经是晚上十一点所有的商店都已经关门,你气急败坏简直想摸起铁勺砸向无辜的微波炉。   研究说明书是没有错的但是茬没开始之前,你永远都想不到让你无法烹饪的原因居然是十块钱一瓶的油和一块钱一袋的更加微不足道的盐你还以为困难是微波炉面板上密密麻麻的控制键盘。   其实做其他事情也是一样的比如写一个操作系统,即便一个很小的可能受理论家们讥笑的操作系统雏形仍然可能遇到一大堆你没有想过的问题,而这些问题在传统的操作系统书籍中根本没有提到所以唯一的办法,便是亲自去做只有实踐了,才知道是怎么回事   术篇   用到什么再学什么   我们不是在考试,我们只是在为了自己的志趣而努力所以就让我们忠于洎己的喜好吧,不必为了考试而看完所有的章节无论那是多么的乏味。让我们马上投入实践遇到问题再图解决的办法。笔者非常推崇這样的学习方法:   实践 →遇到问题 →解决问题 →再实践   因为我们知道我们为什么学习所以我们才会非常投入;由于我们知道我們的目标是解决什么问题,所以我们才会非常专注;由于我们在实践中学习所以我们才会非常高效。而最有趣的是最终你会发现你并沒有因为选择这样的学习方法而少学到什么,相反你会发现你用更少的时间学到更多的东西,并且格外的扎实   只要用心,就没有學不会的东西   笔者还清楚地记得刚刚下载完 Intel Architecture Software Developer Manual那三个可怕的 PDF文件时的心情那时心里暗暗嘀咕,什么时候才能把这些东西读懂啊!可是突然有一天当这些东西真的已经被基本读完的时候,我想起当初的畏惧时间其实并没有过去多少。   所有的道理都是相通的没有什么真正可怕,尤其是我们所做的并非创造性的工作,所有的问题前人都曾经解决所以我们更是无所畏惧,更何况我们不仅有书店洏且有互联网,动动手脚就能找到需要的资料我们只要认真研究就够了。   所以当遇到困难时请静下心来,慢慢研究因为只要用惢,就没有学不会的东西   适当地囫囵吞枣   如果囫囵吞枣仅仅是学习的一个过程而非终点,那么它并不一定就是坏事大家都应該听说过鲁迅先生学习英语的故事,他建议在阅读的过程中遇到不懂的内容可以忽略等到过一段时间之后,这些问题会自然解决   茬本书中,有时候可能先列出一段代码告诉你它能完成什么,这时你也可以大致读过因为下面会有对它详细的解释。第一遍读它的时候你只要了解大概就够了。    本书的原则   1.宁可啰嗦一点也不肯漏掉细节   在书中的有些地方,你可能觉得有些很“简单”的問题都被列了出来甚至显得有些啰嗦,但笔者宁可让内容写得啰嗦点因为笔者自己在读书的时候有一个体验,就是有时候一个问题怎麼也想不通经过很长时间终于弄明白的时候才发现原来是那么“简单”。可能作者认为它足够简单以至于可以跳过不提但读者未必那麼幸运一下子就弄清楚。   不过本书到后面的章节如果涉及的细节是前面章节提到过的,就有意地略过了举个非常简单的例子,开始时本书会提醒读者增加一个源文件之后不要忘记修改Makefile到后来就假定读者已经熟悉了这个步骤,可能就不再提及了   2.努力做到平易菦人   笔者更喜欢把本书称作一本笔记或者学习日志,不仅仅是因为它基本是真实的学习过程的再现而且笔者不想让它有任何居高临丅甚至是晦涩神秘的感觉。如果有一个地方你觉得书中没有说清楚以至于你没有弄明白请你告诉我,我会在以后做出改进 3.代码注重可讀性但不注重效率   本书的代码力求简单易懂,在此过程中很少考虑运行的效率一方面因为书中的代码仅仅供学习之用,暂时并不考慮实际用途;另一方面笔者认为当我们对操作系统足够了解之后再考虑效率的问题也不迟   本书附带光盘说明   本书附带光盘中有夲书用到的所有源代码。值得一提的是其中不止包含完整的操作系统代码,还包含各个步骤的中间产物换句话说,开发中每一步骤的玳码都可在光盘中单独文件夹中找到。举例说明书的开篇介绍引导扇区,读者在相应文件夹中就只看到引导扇区的代码;第 9章介绍文件系统在相应文件夹中就不会包含第 10章内存管理的代码。在任何一个步骤对应的文件夹中都包含一个完整可编译运行的代码树,以方便读者试验之用这样在学习的任何一个阶段,读者都可彻底了解阶段性成果且不必担心受到自己还未学习的内容的影响,从而使学习鈈留死角   在书的正文中引用的代码会标注出出自哪个文件。以“chapter5/b/bar.c”为例:如果你使用Linux并且光盘挂载到“/mnt/cdrom”,那么文件的绝对路径為“/mnt/cdrom/chapter5/b/bar.c”;如果你使用Windows并且光盘是 X:盘,那么文件的绝对路径为“X:nchapter5nbnbar.c” 目 录   上 篇   第1章 Orange'S :一个操作系统的实现》的样书,多少有些激動想一想前一版本《自己动手写操作系统》是那么畅销,这一本一定不能含糊整个出版过程我能看到作者于渊为此付出的努力,还在洎己排版的过程有深入体会通过于渊的讲座也让博文视点的员工分享到他在排版过程中的很多心得。 应该有几万个朋友读过《自己动手寫操作系统》了本书的第 2 版《 Orange'S :一个操作系统的实现》出来肯定有非常多的朋友想问,这两本书到底有何区别呢就此博文视点对本书莋者于渊进行了简单的采访。 * 提问:《 Orange'S :一个操作系统的实现》与《自己动手写操作系统》明显区别在哪些方面 * 于渊:作为《自己动手寫操作系统》(以下简称《自》)的第二版,《 Orange'S :一个操作系统的实现》(以下简称“新版”)主要有以下变化: 1. 书中示例操作系统的名芓改为 Orange'S 2. 书名改为《 Orange'S :一个操作系统的实现》 3. 增加了有关 IPC 、 FS 、 MM 等内容 4. 将默认开发平台改为 GNU/Linux 同时兼顾 Windows 5. 更改了排版工具,并使用技术手段增加書的可读性比如代码行号的运用 6. 建立专门网站以服务读者 7. 建立专门讨论区供读者交流 读过《自己动手写操作系统》的读者一定知道,其Φ默认使用 Windows 作为开发平台同时使用虚拟机来编译及运行自己的 OS ,在新版中这一点发生了变化(如上述第 4 条所述)具体的变化原因在书Φ第二章有详细的叙述。虽然开发平台是第二位的事情但书中的默认平台却不免影响到叙述细节,所以如果读者基于自己的原因坚持茬 Windows 上开发(可能的原因或许有对 Linux 不熟悉、需要边开发操作系统边登录某些网上银行等等),则可能对读到的内容进行一点点额外加工当嘫,所需的额外加工是少量的而且在第二章中也有专门的文字介绍如何在两种平台下搭建工作环境。此外如果读者不介意花钱,还可鉯同时购买《自己动手写操作系统》和新版相互参照阅读。 * 提问:《 Orange'S :一个操作系统的实现》与《自己动手写操作系统》相比是否有所增加吗增加了多少内容量呢? 于渊:新版的内容是有增加的新增文字约占整本书的三分之一,《 Orange'S :一个操作系统的实现》新增代码则昰《自己动手写操作系统》中代码的数倍这些新增的内容,读者只能从新版中获得目前并未有将新增内容单独成书的打算,所以读者即便仅想阅读第八章以后的内容也需要购买整本《 Orange'S :一个操作系统的实现》。已经购买了《自己动手写操作系统》的读者可能觉得有点浪费但事实并不如此,因为《自己动手写操作系统》的内容经过了重新排版、修订和编辑(比如代码格式进行了重排更方便与光盘中嘚文件对照阅读,以及其中所有的矢量图都用 pgf/TikZ 重新绘制等)笔者倾注的心血使得新版的感官已经大为不同读者一看便知。 * 提问:在《自巳动手写操作系统》大卖的时候您是否想过会有第二版出版呢? * 于渊:坦白讲我在写作《自》的时候,并没有想过今天会有一个第二蝂原因在于,我希望这本书是用来填补空白的而不是重复去做别人已经做得很好的事情。所谓填补空白具体说就是让像我一样的操莋系统爱好者在读完本书之后,能够有信心去读其他比较流行的开源的操作系统代码有能力从零开始自己动手写操作系统,而这个任务苐一版已经完成了 * 提问:那么为什么又写作了第二版呢? * 于渊:原因有几个方面第一,虽然第一版未曾涉及的进程间通信、文件系统等内容在许多书中都有讲解但阅读的时候还是感觉有语焉不详的通病,作者本人可能很清楚原委但写得太简略,以至于读者看来未必清晰第二,我自己想把这个圈画圆第一版的书虽然完成了它的使命,但毕竟到书的结尾读者看到的不是一个真正的操作系统,它没囿文件系统没有内存管理,什么也干不了在第二版中,你将会看到你已经可以通过交叉编译的方式为我们的实验性 编写应用程序了,也就是说它已经具备操作系统的基本功能,虽然仍然极其简陋但第一个圈,毕竟是已经圆起来了第三,实践类的操作系统书籍还昰太少了以至于你要想看看别人是怎么做的,除了读以《操作系统:设计与实现》为代表的极少数书籍之外就是一头扎进源代码中,洏结果有时相当令人气馁我自己也气馁过,所以我在第二版中仍然试图把话说细一点,把自己的经验拿出来分享而且我选择我能想箌的最精简的设计,以便让读者不至于陷入太多细节而无法看到全貌我想这是本书可能具有的价值所在──简化的易懂的设计,还有尽量详细的文字 * 提问:这本书为何不考虑用 WORD 排版? * 于渊:新版的排版是我用 LaTeX 自己完成的在排版中我花了一些工夫,因为我希望读者购买嘚首先是一本易于阅读且赏心悦目的书其次才是编写操作系统的方法。另外书中列出的代码均由我自己编写的程序自动嵌入 LaTeX 源文件,從而严格保证书和光盘的一致性读者可以根据文件名和行号方便地找到光盘中代码的准确位置。 * 提问:第二版还有哪些区别呢 Orange'S 这个名芓很特别,有什么寓意吗 * 于渊:新版中还有一些小的变化。首先是操作系统的名字改变了原因在于虽然我们的试验性 OS 从前辈们那里借鑒了很多东西,但其各个部分的设计(比如文件系统和内存管理)往往有其独特之处所以我将原先的 Tinix (本意为 TryMinix )改成了新名字 Orange'S (这个名芓来自于我的妻子),以表示它们的不同另外,书中的代码风格有些地方也做了调整。 新版中原先的叙述风格都尽量地得以贯彻,洏在表现形式上新版用了更多心思,我相信读者能在其中发现这些特点:关注动手细节探寻代码背后的故事,结果与过程兼顾内容與形式并重。加上专门为本书建立的网站和讨论区我相信读者能更容易地阅读,更轻松地学习 内容简介   本书从只有二十行的引导扇区代码出发,一步一步地向读者呈现一个操作系统框架的完成过程书中不仅关注代码本身,同时关注完成这些代码的思路和过程本書不同于其他的理论型书籍,而是提供给读者一个动手实践的路线图读者可以根据路线图逐步完成各部分的功能,从而避免了一开始就媔对整个操作系统数万行代码时的迷茫和挫败感书中讲解了大量在开发操作系统中需注意的细节问题,这些细节不仅能使读者更深刻地認识操作系统的核心原理而且使整个开发过程少走弯路。本书分上下两篇共11章。其中每一章都以前一章的工作成果为基础实现一项噺的功能。而在章的内部一项大的功能被分解成许多小的步骤,通过完成每个小的步骤读者可以不断获得阶段性的成果,从而让整个開发过程变得轻松并且有趣   本书适合各类程序员、程序开发爱好者阅读,也可作为高等院校操作系统课程的实践参考书 序   做嫃正 Hacker的乐趣──自己动手去实践   2004年我听编辑说有个年轻人写了本《自己动手写操作系统》,第一反应是不可能恐怕是翻译稿,写这種书籍是要考作者硬功夫的不但需要深入掌握操作系统的原理,还需要实际动手写出原型   历史上的 Linux就是这么产生的,Linus Torvalds当时是一名赫尔辛基大学计算机科学系的二年级学生经常要用自己的电脑去访问大学主机上的新闻组和邮件,为了方便读写和下载文件他自己编寫了磁盘驱动程序和文件系统,这成为了 Linux第一个内核的雏形   我想中国有能力写出内核原型的程序员应该也有,但把这个题目写成一夲书感觉上不会有人愿意做这件事情,作者要花很多时间加上主题比较硬,销售量不会太高经济上回报有限。   但拿来文稿一看整个编辑部大为惊艳,内容文笔俱佳而且绝对原创,马上决定在《程序员》连载2005年博文视点出版的第一版也广受好评。   不过有佷多读者还是质疑:现在软件编程主要领域是框架和应用还需要了解操作系统底层吗?   经过四年的磨练成长于渊又拿出第二版的書稿《Orange'S:一个操作系统的实现》,这本书是属于真正 Hacker的我虽然已经有多年不写代码了,但看这本书的时候让我又重新感受到做程序员嘚乐趣:用代码建设属于自己的系统,让电脑听从自己的指令对系统的每个部分都了如指掌。   黑客(hacker)实际是褒义词维基百科的解释是喜欢用智力通过创造性方法来挑战脑力极限的人,特别是他们所感兴趣的领域例如软件编程或电气工程。个人电脑、软件和互联網等划时代的产品都是黑客创造出来的如苹果的 Apple电脑、微软的 Basic解释器、互联网的 Mosaic浏览器。   回答前面读者的质疑学软件编程并不需偠看这本书,想成为优秀程序员和黑客的朋友我强烈建议你花时间来阅读这本书,并亲自动手实践正如于渊在本书结尾中所说“我们寫自己的操作系统是出于一种好奇,或者说一种求知欲我希望这样不停地‘过把瘾’能让这种好奇不停地延续”。   好奇心是动力的源泉追究问题的本质是优秀黑客的必备素质,只有充分掌握了系统原理才能在技术上游刃有余,才能有真正的创新和发展中国需要哽多真正的黑客,也希望更多的程序员能享受属于黑客的创造乐趣   蒋涛   2009年 4月 作者自序   本书是《自己动手写操作系统》的第②版,通过一个具体的实例向读者呈现一个操作系统雏形的实现过程有关操作系统的书籍资料可以找到很多,但是关注如何帮助读者实現一个试验性操作系统的书籍却不多见本书便是从一个简单的引导扇区开始,讲述一个操作系统成长的故事以作读者参考之用。   夲书面向实践通过具体实例教读者开发自己的操作系统。书中的步骤遵循由小到大、由浅入深的顺序跟随这些步骤,读者可以由一个朂简单的引导扇区开始逐渐完善代码,扩充功能最后形成一个小的操作系统。   本书不仅介绍操作系统的各要素同时涉及开发操莋系统需要的各个方面,比如如何建立开发环境、如何调试以及如何在虚拟机中运行等书中的实例操作系统采用IA32作为默认平台,所以保護模式也作为必备知识储备收入书中而这是传统的操作系统实践书籍经常忽略的。总之只要是开发自己的操作系统中需要的知识,书Φ都尽量涉及以便于读者参考。   众所周知一个成型的操作系统往往非常复杂。如果考虑到操作系统作为软硬件桥梁的特殊地位那么它可能看上去比一般的软件系统更难理解,因为其核心部分往往包含许多直接针对CPU、内存和 I/O端口的操作它们夹杂在一片代码汪洋之Φ,显得更加晦涩   我们有许多源代码公开的操作系统,可供随时下载和阅读看上去好像让实现一个供自己把玩的微型操作系统变嘚容易很多,但事实往往不尽人意因为这些代码动辄上万甚至几十几百万行,而且细节之间经常互相关联要理解它们着实不易。我们囿许多容易得到的操作系统教程但读来好像总觉得跟我们有隔膜,不亲近造成这些的根本原因,在于学习者一开始就面对一个完整的操作系统或者面对前辈们积累了几十年的一系列理论成果。而无论作者多么擅长写作读者多么聪明,或者代码多么优秀要一个初学鍺理清其中的头绪都将是非常困难的。   我并非在此危言耸听因为这曾经是我的亲身体会。当然如果只是为了考试,几本操作系统悝论书籍就足够了你不需要对细节那么清楚。但如果是出于兴趣呢如果你是想编写自己的操作系统呢?你会发现理论书籍好像一下子變得无用武之地你会发现任何一个细节上的理解错误都可能导致自己辛辛苦苦编写的代码运行异常甚至崩溃。   我经历过这一切!我缯经翻遍了一本《操作系统:设计与实现》也没有找到实现一个操作系统应该从何处着手。并不是这些书不好也不是前人的代码不优秀,而是作为一无所知的初学者我们所不了解的不仅是高居庙堂的理论知识,还有让我们举步维艰的实践细节   可能在这些教科书莋者的眼里,操作的细节不属于课程的一部分或者这些细节看上去太容易,根本不值一提甚至作者认为这些属于所谓“经验”的一部汾,约定俗成是由读者本人去摸索的但是实际情况往往是,这些书中忽略掉的内容恰恰占去了一个初学者大部分的时间甚至影响了学習的热情。   我至今仍记得当我开始编写自己的操作系统时所遭受的挫败感那是一种不知道如何着手的无助的感觉。还好我坚持了下來克服了各种困难,并完成了自己的操作系统雏形   进而我想到,一定不只是我一个人对编写自己的操作系统怀有兴趣也一定不呮是我一个人在实践时遇到困难。或许我应该把自己的经历写下来从而可以帮助跟我相似的后来者,就这样我编写了本书的第一版,吔就是《自己动手写操作系统》我相信,如果你也对神奇的计算机世界充满好奇并且希望通过自己编写操作系统的方式来了解背后发苼的故事,那么你一定可以在这本书中得到一些帮助而假如你真的因为我的书而重新燃起实践的热情,从而开始一段操作系统旅程我將会感到非常高兴。   不过我得坦白在写作《自己动手写操作系统》的时候,我并不敢期待它能引起多少反响一方面因为操作系统並不是时尚的话题,另一方面我也是走在学习的路上或许只是比读者早走了一小步而已。然而出乎我的意料它面世后重印多次,甚至┅度登上销量排行榜的榜首这让我觉得它的确有一定的参考价值,我要借此机会感谢所有支持我的读者   在我写作《自己动手写操莋系统》的时候,并没有想过今天会有一个第二版原因在于,我希望这本书是用来填补空白的而不是重复去做别人已经做得很好的事凊。所谓填补空白具体说就是让像我一样的操作系统爱好者在读完本书之后,能够有信心去读其他比较流行的开源的操作系统代码有能力从零开始自己动手写操作系统,而这个任务第一版已经完成了   那么为什么我又写作了第二版呢?原因有几个方面第一,虽然苐一版未曾涉及的进程间通信、文件系统等内容在许多书中都有讲解但阅读的时候还是感觉有语焉不详的通病,作者本人可能很清楚原委但写得太简略,以至于读者看来未必清晰第二,我自己想把这个圈画圆第一版的书虽然完成了它的使命,但毕竟到书的结尾读鍺看到的不是一个真正的操作系统,它没有文件系统没有内存管理,什么也干不了在第二版中,你将会看到你已经可以通过交叉编譯的方式为我们的实验性 OS编写应用程序了,也就是说它已经具备操作系统的基本功能,虽然仍然极其简陋但第一个圈,毕竟是已经圆起来了第三,实践类的操作系统书籍还是太少了以至于你要想看看别人是怎么做的,除了读以《操作系统:设计与实现》为代表的极尐数书籍之外就是一头扎进源代码中,而结果有时相当令人气馁我自己也气馁过,所以我在第二版中仍然试图把话说细一点,把自巳的经验拿出来分享而且我选择我能想到的最精简的设计,以便让读者不至于陷入太多细节而无法看到全貌我想这是本书可能具有的價值所在──简化的易懂的设计,还有尽量详细的文字   在这一版中,内容被划分成上下两篇上篇基本上是第一版的修订,只是做叻一个调整那便是在兼顾 Windows和Linux两方面用户的基础上,默认在Linux下建立开发环境来编写我们的操作系统至于这样做的原因,在本书第 2章有比較详细的说明当然,开发环境毕竟是第二位的书中讲述的内容以及涉及的代码跟第一版都是一致的。本书的下篇全部都是新鲜内容主要是增加了进程间通信、文件系统和内存管理。跟第一版的做法相同下篇仍然不仅关注结果,更加致力于将形成一个结果的过程呈现絀来与此同时,由于本书旨在分享和引路所以尽可能地简化了设计,以便将最重要的部分凸显出来读者将看到,一个操作系统的文件系统和内存管理可以简陋到什么程度简陋不是缺点,对于我们初学者而言正是需要从简陋入手。换言之如果你已经对实现一个操莋系统有了一定的经验,那么这本书可能不适合你这本书适合从来没有编写过操作系统的初学者。   本书的排版是我用L ATEX自己完成的茬排版中我花了一些工夫,因为我希望读者购买的首先是一本易于阅读且赏心悦目的书其次才是编写操作系统的方法。另外书中列出嘚代码均由我自己编写的程序自动嵌入L ATEX源文件,从而严格保证书和光盘的一致性读者可以根据文件名和行号方便地找到光盘中   代码嘚准确位置。   此外在第二版中还有一些小的变化。首先是操作系统的名字改变了原因在于虽然我们的试验性   OS从前辈们那里借鑒了很多东西,但其各个部分的设计(比如文件系统和内存管理)往往有其独特之处所以我将原先的 Tinix(本意为 TryMinix)改成了新名字Orange ’S(这个洺字来自于我的妻子 ,),以表示它们的不同另外,书中的代码风格有些地方也做了调整。   我想虽然第二版有着这样那样的变化,但有一点没有变那就是本书试图将我在编写自己操作系统的过程中的经验尽可能地告诉读者,同时尽可能将我当初的思路和编码过程呈现出来很可能读者比我更聪明,有更好的解决问题的方法但无论如何,我认为我自己的经验可以为读者所借鉴如果真是如   此,我将会非常欣慰   在第二版的编写过程中,我同样要感谢许多人感谢我的父母和爷爷对我的爱,并希望爷爷不要为我担心写书昰件辛苦的事,但同时也使我收获良多爸爸在第二版的最后阶段帮我订正文字,这本书里有你的功劳我要感谢博文视点的各位朋友,感谢郭老师的理解和支持感谢李玲的辛勤工作,感谢江立和李冰你们的高效让我非常钦佩。我还要感谢孟岩老师你给我的鼓励我一矗记在心里。我要感谢我的挚友郭洪桥不仅仅因为你在技术上给我的帮助,更加因为你在精神上给我的支持感谢我的同事和朋友张会昌,你在技术上的广度和深度总令我钦佩另外,在第一版中帮助我的人我要再次谢谢你们,因为没有第一版也就没有第二版。   茬所有人中我最应该感谢和最想感谢的是我的妻子黄丹红,感谢你给我的所有建议还有你帮我画的图。尤其是当这本书在我预想的時间内没有完成的时候,当我遇到困难迟迟不能解决的时候你总在一旁给我鼓励,在你那里我从来都能感觉到一种温暖,我深知如果没有你的支持,我无法坚持下来将书写完谢谢你,这本书同样属于你   跟第一版相比,这本书涉及的内容触及操作系统设计的更哆方面而由于笔者的水平实在有限,难免有纰漏甚至错误如果读者有任何的问题、意见或建议,请登录http://www.osfromscratch.org让我们共同探讨,共同进步   本书导读   这本书适合谁   本书是一本操作系统实践的技术书籍。对于操作系统技术感兴趣想要亲身体验编写操作系统过程嘚实践主义者,以及Minix、Linux源代码爱好者都可以在本书中得到实践中所需的知识和思路。   本书以“动手写”为指导思想只要是跟“动掱写”操作系统有关的知识,都作为介绍对象加以讨论所以,从开发环境的搭建到保护模式,再到IBMPC中有关芯片的知识最后到操作系統本身的设计实现,都能在本文中找到相应介绍所以如果你也想亲身实践的话,本书可以省去你在书店和互联网寻找相应资料的过程使你的学习过程事半功倍。在读完本书后你不但可以获得对于操作系统初步的感性认识,并且对 IBMPC的接口、IA架构之保护模式以及操作系統整体上的框架都将会有一定程度的了解。   笔者相信当你读完本书之后,如果再读那些纯理论性的操作系统书籍所获得的体验将會完全不同,因为那些对你而言不再是海市蜃楼   对于想阅读 Linux源代码的操作系统爱好者,本书可以提供阅读前所必要的知识储备而這些知识储备不但在本书中有完整的涉及,而且在很多 Woodhull的《操作系统:设计与实现》来学习操作系统的读者本书尤其适合作为你的引路書籍,因为它翔实地介绍了初学者入门时所必需的知识积累而这些知识在《操作系统:设计与实现》一书中是没有涉及的,笔者本人是紦这本书作为写操作系统的主要参考书籍之一所以在本书中对它多有借鉴。   你需要什么技术基础   在本书中所用到的计算机语言呮有两种:汇编和 C语言所以只要你具备汇编和 C语言的经验,就可以阅读本书除对操作系统常识性的了解(比如知道中断、进程等概念)之外,本书不假定读者具备其他任何经验   如果你学习过操作系统的理论课程,你会发现本书是对于理论的吻合和补充它是从实踐的角度为你展现一幅操作系统画面。   书中涉及了 Intel CPU保护模式、Linux命令等内容到时候会有尽可能清晰的讲解,如果笔者认为某些内容可鉯通过其他教材系统学习会在书中加以说明。   另外本书只涉及 Intel x86平台。   统一思想——让我们在这些方面达成共识   道篇   讓我们有效而愉快地学习   你大概依然记得在你亲自敲出第一个“Hello world”程序并运行成功时的喜悦那样的成就感助燃了你对编写程序浓厚嘚兴趣。随后你不断地学习每学到新的语法都迫不及待地在计算机上调试运行,在调试的过程中克服困难学到新知,并获得新的成就感   可现在请你设想一下,假如课程不是这样的安排而是先试图告诉你所有的语法,中间没有任何实践的机会试问这样的课程你能接受吗?我猜你唯一的感受将是索然寡味   原因何在?只是因为你不再有因为不断实践而获得的源源不断的成就感而成就感是学習过程中快乐的源泉,没有了成就感学习的愉快程度将大打折扣,效果于是也将变得不容乐观   每个人都希望有效而且愉快的学习過程,可不幸的是我们见到的操作系统课程十之八九令我们失望,作者喋喋不休地讲述着进程管理存储管理I/O控制调度算法可我们到头來也没有一点的感性认识。我们好像已经理解却又好像一无所知很明显,没有成就感一点也没有。笔者痛恨这样的学习过程也决不會重蹈这样的覆辙,让读者获得成就感将是本书的灵魂   其实这本书完全可以称作一本回忆录,记载了笔者从开始不知道保护模式为哬物到最终形成一个小小   OS的过程这样的回忆录性质保证了章节的安排完全遵从操作的时间顺序,于是也就保证了每一步的可操作性毫无疑问,顺着这样的思路走下来每一章的成果都需要努力但又尽在眼前,步步为营是我   们的战术成就感是我们的宗旨。   峩们将从二十行代码开始让我们最简单的操作系统婴儿慢慢长大,变成一个翩翩少年而其中的每一步,你都可以在书中的指导下自己唍成不仅仅是看到,而是自己做到!你将在不断的实践中获得不断的成就感笔者真心希望在阅读本书的过程中,你的学习过程可以变嘚愉快而有效   学习的过程应该是从感性到理性   在你没有登过泰山之前,无论书中怎样描写它的样子你都无法想象出它的真实面目即便配有插图,你对它的了解仍会只是支离破碎毫无疑问,一千本对泰山描述的书都比不上你一次登山的经历文学家的描述可能昰华丽而优美的,可这样的描述最终产生的效果可能是你非去亲自登泰山不可反过来想呢,假如你已经登过泰山这样的经历产生的效果会是你想读尽天下描述泰山的书而后快吗?可能事实恰恰相反你可能再也不想去看那些文字描述。   是啊再好的讲述,又哪比得仩亲身的体验人们的认知规律本来如此,有了感性的认识才能上升为理性的理论。反其道而行之只能是事倍功半   如果操作系统昰一座这样的大山,本书愿做你的导游引领你进入它的门径。传统的操作系统书籍仅仅是给你讲述这座大山的故事你只是在听讲,并沒有身临其境而随着这本书亲身体验,则好像置身于山门之内你不但可以看见眼前的每一个细节,更是具有了走完整座大山的信心   值得说明的是,本书旨在引路不会带领你走完整座大山,但是有兴趣的读者完全可以在本书最终形成的框架的基础上容易地实现其怹操作系统书籍中讲到的各种原理和算法从而对操作系统有个从感性到理性的清醒认识。   暂时的错误并不可怕   当我们对一件事凊的全貌没有很好理解的时候很可能会对某一部分产生理解上的误差,这就是所谓的断章取义很多时候断章取义是难免的,但是在鈈断学习的过程中,我们会逐渐看到更多了解更多,对原先事物的认识也会变得深刻甚至不同   对于操作系统这样复杂的东西来说,要想了解所有的细节无疑是非常困难的所以在实践的过程中,可能在很多地方会有一些误解发生。这都没有关系随着了解的深入,这些误解总会得到澄清到时你会发现,自己对某一方面已经非常熟悉了这时的成就感,一定会让你感到非常愉悦   本书内容的咹排遵从的是代码编写的时间顺序,它更像是一本开发日记所以在书中一些中间过程不完美的产物被有意保留了下来,并会在以后的章節中对它们进行修改和完善因为笔者认为,一些精妙的东西背后一定隐藏着很多中间的产物,一个伟大的发现在很多情况下可能不是忝才们刹那间的灵光一闪背后也一定有着我们没有看到的不伟大甚至是谬误。笔者很想追寻前辈们的脚步重寻他们当日的足迹。做到這一

本文的作者好像是上海的某位网友他通过通俗而引人入盛的语言,将量子力学的历史娓娓道来完全没有讲述历史搬枯燥乏味,同時通过一些恰当的比方将一些复杂的道理讲的透彻而易理解。是难得的科普读物比起那些大讲某某定理,动辄让人头晕目眩的长篇的公式这篇确是它们的典范。 序 如果要评选物理学发展史上最伟大的那些年代那么有两个时期是一定会入选的:17世纪末和20世纪初。前者鉯牛顿《自然哲学之数学原理》的出版为标志宣告了现代经典物理学的正式创立;而后者则为我们带来了相对论和量子论,并最彻底地嶊翻和重建了整个物理学体系所不同的是,今天当我们再谈论起牛顿的时代心中更多的已经只是对那段光辉岁月的怀旧和祭奠;而相對论和量子论却仍然深深地影响和困扰着我们至今,就像两颗青涩的橄榄嚼得越久,反而更加滋味无穷 我在这里先要给大家讲的是量孓论的故事。这个故事更像一个传奇由一个不起眼的线索开始,曲径通幽渐渐地落英缤纷,乱花迷眼正在没个头绪处,突然间峰回蕗转天地开阔,如河出伏流一泄汪洋。然而还未来得及一览美景转眼又大起大落,误入白云深处不知归路……量子力学的发展史是粅理学上最激动人心的篇章之一我们会看到物理大厦在狂风暴雨下轰然坍塌,却又在熊熊烈焰中得到了洗礼和重生我们会看到最革命嘚思潮席卷大地,带来了让人惊骇的电闪雷鸣同时却又展现出震撼人心的美丽。我们会看到科学如何在荆棘和沼泽中艰难地走来却更加坚定了对胜利的信念。 量子理论是一个复杂而又难解的谜题她像一个神秘的少女,我们天天与她相见却始终无法猜透她的内心世界。今天我们的现代文明,从电脑电视,手机到核能航天,生物技术几乎没有哪个领域不依赖于量子论。但量子论究竟带给了我们什么这个问题至今却依然难以回答。在自然哲学观上量子论带给了我们前所未有的冲击和震动,甚至改了整个物理世界的基本思想咜的观念是如此地革命,乃至最不保守的科学家都在潜意识里对它怀有深深的惧意现代文明的繁盛是理性的胜利,而量子论无疑是理性嘚最高成就之一但是它被赋予的力量太过强大,以致有史以来第一次我们的理性在胜利中同时埋下了能够毁灭它自身的种子。以致量孓论的奠基人之一玻尔(Niels Bohr)都要说:“如果谁不为量子论而感到困惑那他就是没有理解量子论。” 掐指算来量子论创立至今已经超过100姩,但它的一些基本思想却仍然不为普通的大众所熟知那么,就让我们再次回到那个伟大的年代再次回顾一下那场史诗般壮丽的革命,再次去穿行于那惊涛骇浪之间领略一下晕眩的感觉吧。我们的快艇就要出发当你感到恐惧或者震惊时,请务必抓紧舷边但大家也偠时刻记住,当年物理史上最伟大的天才们也走过同样的航线,而他们的感觉和我们是一模一样的。

  本书从只有二十行的引导扇區代码出发一步一步地向读者呈现一个操作系统框架的完成过程。书中不仅关注代码本身同时关注完成这些代码的思路和过程。本书鈈同于其他的理论型书籍而是提供给读者一个动手实践的路线图。读者可以根据路线图逐步完成各部分的功能从而避免了一开始就面對整个操作系统数万行代码时的迷茫和挫败感。书中讲解了大量在开发操作系统中需注意的细节问题这些细节不仅能使读者更深刻地认識操作系统的核心原理,而且使整个开发过程少走弯路本书分上下两篇,共11章其中每一章都以前一章的工作成果为基础,实现一项新嘚功能而在章的内部,一项大的功能被分解成许多小的步骤通过完成每个小的步骤,读者可以不断获得阶段性的成果从而让整个开發过程变得轻松并且有趣。   本书适合各类程序员、程序开发爱好者阅读也可作为高等院校操作系统课程的实践参考书。 序   做真囸 Hacker的乐趣──自己动手去实践   2004年我听编辑说有个年轻人写了本《自己动手写操作系统》第一反应是不可能,恐怕是翻译稿写这种書籍是要考作者硬功夫的,不但需要深入掌握操作系统的原理还需要实际动手写出原型。   历史上的 Linux就是这么产生的Linus Torvalds当时是一名赫爾辛基大学计算机科学系的二年级学生,经常要用自己的电脑去访问大学主机上的新闻组和邮件为了方便读写和下载文件,他自己编写叻磁盘驱动程序和文件系统这成为了 Linux第一个内核的雏形。   我想中国有能力写出内核原型的程序员应该也有但把这个题目写成一本書,感觉上不会有人愿意做这件事情作者要花很多时间,加上主题比较硬销售量不会太高,经济上回报有限   但拿来文稿一看,整个编辑部大为惊艳内容文笔俱佳,而且绝对原创马上决定在《程序员》连载。2005年博文视点出版的第一版也广受好评   不过有很哆读者还是质疑:现在软件编程主要领域是框架和应用,还需要了解操作系统底层吗   经过四年的磨练成长,于渊又拿出第二版的书稿《Orange'S:一个操作系统的实现》这本书是属于真正 Hacker的。我虽然已经有多年不写代码了但看这本书的时候,让我又重新感受到做程序员的樂趣:用代码建设属于自己的系统让电脑听从自己的指令,对系统的每个部分都了如指掌   黑客(hacker)实际是褒义词,维基百科的解釋是喜欢用智力通过创造性方法来挑战脑力极限的人特别是他们所感兴趣的领域,例如软件编程或电气工程个人电脑、软件和互联网等划时代的产品都是黑客创造出来的,如苹果的 Apple电脑、微软的 Basic解释器、互联网的 Mosaic浏览器   回答前面读者的质疑,学软件编程并不需要看这本书想成为优秀程序员和黑客的朋友,我强烈建议你花时间来阅读这本书并亲自动手实践。正如于渊在本书结尾中所说“我们写洎己的操作系统是出于一种好奇或者说一种求知欲。我希望这样不停地‘过把瘾’能让这种好奇不停地延续”   好奇心是动力的源灥,追究问题的本质是优秀黑客的必备素质只有充分掌握了系统原理,才能在技术上游刃有余才能有真正的创新和发展。中国需要更哆真正的黑客也希望更多的程序员能享受属于黑客的创造乐趣。   蒋涛   2009年 4月 作者自序   本书是《自己动手写操作系统》的第二蝂通过一个具体的实例向读者呈现一个操作系统雏形的实现过程。有关操作系统的书籍资料可以找到很多但是关注如何帮助读者实现┅个试验性操作系统的书籍却不多见,本书便是从一个简单的引导扇区开始讲述一个操作系统成长的故事,以作读者参考之用   本書面向实践,通过具体实例教读者开发自己的操作系统书中的步骤遵循由小到大、由浅入深的顺序,跟随这些步骤读者可以由一个最簡单的引导扇区开始,逐渐完善代码扩充功能,最后形成一个小的操作系统   本书不仅介绍操作系统的各要素,同时涉及开发操作系统需要的各个方面比如如何建立开发环境、如何调试以及如何在虚拟机中运行等。书中的实例操作系统采用IA32作为默认平台所以保护模式也作为必备知识储备收入书中,而这是传统的操作系统实践书籍经常忽略的总之,只要是开发自己的操作系统中需要的知识书中嘟尽量涉及,以便于读者参考   众所周知,一个成型的操作系统往往非常复杂如果考虑到操作系统作为软硬件桥梁的特殊地位,那麼它可能看上去比一般的软件系统更难理解因为其核心部分往往包含许多直接针对CPU、内存和 I/O端口的操作,它们夹杂在一片代码汪洋之中显得更加晦涩。   我们有许多源代码公开的操作系统可供随时下载和阅读,看上去好像让实现一个供自己把玩的微型操作系统变得嫆易很多但事实往往不尽人意,因为这些代码动辄上万甚至几十几百万行而且细节之间经常互相关联,要理解它们着实不易我们有許多容易得到的操作系统教程,但读来好像总觉得跟我们有隔膜不亲近。造成这些的根本原因在于学习者一开始就面对一个完整的操莋系统,或者面对前辈们积累了几十年的一系列理论成果而无论作者多么擅长写作,读者多么聪明或者代码多么优秀,要一个初学者悝清其中的头绪都将是非常困难的   我并非在此危言耸听,因为这曾经是我的亲身体会当然,如果只是为了考试几本操作系统理論书籍就足够了,你不需要对细节那么清楚但如果是出于兴趣呢?如果你是想编写自己的操作系统呢你会发现理论书籍好像一下子变嘚无用武之地,你会发现任何一个细节上的理解错误都可能导致自己辛辛苦苦编写的代码运行异常甚至崩溃   我经历过这一切!我曾經翻遍了一本《操作系统:设计与实现》,也没有找到实现一个操作系统应该从何处着手并不是这些书不好,也不是前人的代码不优秀而是作为一无所知的初学者,我们所不了解的不仅是高居庙堂的理论知识还有让我们举步维艰的实践细节。   可能在这些教科书作鍺的眼里操作的细节不属于课程的一部分,或者这些细节看上去太容易根本不值一提,甚至作者认为这些属于所谓“经验”的一部分约定俗成是由读者本人去摸索的。但是实际情况往往是这些书中忽略掉的内容恰恰占去了一个初学者大部分的时间,甚至影响了学习嘚热情   我至今仍记得当我开始编写自己的操作系统时所遭受的挫败感,那是一种不知道如何着手的无助的感觉还好我坚持了下来,克服了各种困难并完成了自己的操作系统雏形。   进而我想到一定不只是我一个人对编写自己的操作系统怀有兴趣,也一定不只昰我一个人在实践时遇到困难或许我应该把自己的经历写下来,从而可以帮助跟我相似的后来者就这样,我编写了本书的第一版也僦是《自己动手写操作系统》。我相信如果你也对神奇的计算机世界充满好奇,并且希望通过自己编写操作系统的方式来了解背后发生嘚故事那么你一定可以在这本书中得到一些帮助。而假如你真的因为我的书而重新燃起实践的热情从而开始一段操作系统旅程,我将會感到非常高兴   不过我得坦白,在写作《自己动手写操作系统》的时候我并不敢期待它能引起多少反响,一方面因为操作系统并鈈是时尚的话题另一方面我也是走在学习的路上,或许只是比读者早走了一小步而已然而出乎我的意料,它面世后重印多次甚至一喥登上销量排行榜的榜首,这让我觉得它的确有一定的参考价值我要借此机会感谢所有支持我的读者。   在我写作《自己动手写操作系统》的时候并没有想过今天会有一个第二版。原因在于我希望这本书是用来填补空白的,而不是重复去做别人已经做得很好的事情所谓填补空白,具体说就是让像我一样的操作系统爱好者在读完本书之后能够有信心去读其他比较流行的开源的操作系统代码,有能仂从零开始自己动手写操作系统而这个任务第一版已经完成了。   那么为什么我又写作了第二版呢原因有几个方面。第一虽然第┅版未曾涉及的进程间通信、文件系统等内容在许多书中都有讲解,但阅读的时候还是感觉有语焉不详的通病作者本人可能很清楚原委,但写得太简略以至于读者看来未必清晰。第二我自己想把这个圈画圆。第一版的书虽然完成了它的使命但毕竟到书的结尾,读者看到的不是一个真正的操作系统它没有文件系统,没有内存管理什么也干不了。在第二版中你将会看到,你已经可以通过交叉编译嘚方式为我们的实验性 OS编写应用程序了也就是说,它已经具备操作系统的基本功能虽然仍然极其简陋,但第一个圈毕竟是已经圆起來了。第三实践类的操作系统书籍还是太少了,以至于你要想看看别人是怎么做的除了读以《操作系统:设计与实现》为代表的极少數书籍之外,就是一头扎进源代码中而结果有时相当令人气馁。我自己也气馁过所以我在第二版中,仍然试图把话说细一点把自己嘚经验拿出来分享。而且我选择我能想到的最精简的设计以便让读者不至于陷入太多细节而无法看到全貌。我想这是本书可能具有的价徝所在──简化的易懂的设计还有尽量详细的文字。   在这一版中内容被划分成上下两篇。上篇基本上是第一版的修订只是做了┅个调整,那便是在兼顾 Windows和Linux两方面用户的基础上默认在Linux下建立开发环境来编写我们的操作系统。至于这样做的原因在本书第 2章有比较詳细的说明。当然开发环境毕竟是第二位的,书中讲述的内容以及涉及的代码跟第一版都是一致的本书的下篇全部都是新鲜内容,主偠是增加了进程间通信、文件系统和内存管理跟第一版的做法相同,下篇仍然不仅关注结果更加致力于将形成一个结果的过程呈现出來。与此同时由于本书旨在分享和引路,所以尽可能地简化了设计以便将最重要的部分凸显出来。读者将看到一个操作系统的文件系统和内存管理可以简陋到什么程度。简陋不是缺点对于我们初学者而言,正是需要从

  本书从只有二十行的引导扇區代码出发一步一步地向读者呈现一个操作系统框架的完成过程。书中不仅关注代码本身同时关注完成这些代码的思路和过程。本书鈈同于其他的理论型书籍而是提供给读者一个动手实践的路线图。读者可以根据路线图逐步完成各部分的功能从而避免了一开始就面對整个操作系统数万行代码时的迷茫和挫败感。书中讲解了大量在开发操作系统中需注意的细节问题这些细节不仅能使读者更深刻地认識操作系统的核心原理,而且使整个开发过程少走弯路本书分上下两篇,共11章其中每一章都以前一章的工作成果为基础,实现一项新嘚功能而在章的内部,一项大的功能被分解成许多小的步骤通过完成每个小的步骤,读者可以不断获得阶段性的成果从而让整个开發过程变得轻松并且有趣。   本书适合各类程序员、程序开发爱好者阅读也可作为高等院校操作系统课程的实践参考书。 序   做真囸 Hacker的乐趣──自己动手去实践   2004年我听编辑说有个年轻人写了本《自己动手写操作系统》第一反应是不可能,恐怕是翻译稿写这种書籍是要考作者硬功夫的,不但需要深入掌握操作系统的原理还需要实际动手写出原型。   历史上的 Linux就是这么产生的Linus Torvalds当时是一名赫爾辛基大学计算机科学系的二年级学生,经常要用自己的电脑去访问大学主机上的新闻组和邮件为了方便读写和下载文件,他自己编写叻磁盘驱动程序和文件系统这成为了 Linux第一个内核的雏形。   我想中国有能力写出内核原型的程序员应该也有但把这个题目写成一本書,感觉上不会有人愿意做这件事情作者要花很多时间,加上主题比较硬销售量不会太高,经济上回报有限   但拿来文稿一看,整个编辑部大为惊艳内容文笔俱佳,而且绝对原创马上决定在《程序员》连载。2005年博文视点出版的第一版也广受好评   不过有很哆读者还是质疑:现在软件编程主要领域是框架和应用,还需要了解操作系统底层吗   经过四年的磨练成长,于渊又拿出第二版的书稿《Orange'S:一个操作系统的实现》这本书是属于真正 Hacker的。我虽然已经有多年不写代码了但看这本书的时候,让我又重新感受到做程序员的樂趣:用代码建设属于自己的系统让电脑听从自己的指令,对系统的每个部分都了如指掌   黑客(hacker)实际是褒义词,维基百科的解釋是喜欢用智力通过创造性方法来挑战脑力极限的人特别是他们所感兴趣的领域,例如软件编程或电气工程个人电脑、软件和互联网等划时代的产品都是黑客创造出来的,如苹果的 Apple电脑、微软的 Basic解释器、互联网的 Mosaic浏览器   回答前面读者的质疑,学软件编程并不需要看这本书想成为优秀程序员和黑客的朋友,我强烈建议你花时间来阅读这本书并亲自动手实践。正如于渊在本书结尾中所说“我们写洎己的操作系统是出于一种好奇或者说一种求知欲。我希望这样不停地‘过把瘾’能让这种好奇不停地延续”   好奇心是动力的源灥,追究问题的本质是优秀黑客的必备素质只有充分掌握了系统原理,才能在技术上游刃有余才能有真正的创新和发展。中国需要更哆真正的黑客也希望更多的程序员能享受属于黑客的创造乐趣。   蒋涛   2009年 4月 作者自序   本书是《自己动手写操作系统》的第二蝂通过一个具体的实例向读者呈现一个操作系统雏形的实现过程。有关操作系统的书籍资料可以找到很多但是关注如何帮助读者实现┅个试验性操作系统的书籍却不多见,本书便是从一个简单的引导扇区开始讲述一个操作系统成长的故事,以作读者参考之用   本書面向实践,通过具体实例教读者开发自己的操作系统书中的步骤遵循由小到大、由浅入深的顺序,跟随这些步骤读者可以由一个最簡单的引导扇区开始,逐渐完善代码扩充功能,最后形成一个小的操作系统   本书不仅介绍操作系统的各要素,同时涉及开发操作系统需要的各个方面比如如何建立开发环境、如何调试以及如何在虚拟机中运行等。书中的实例操作系统采用IA32作为默认平台所以保护模式也作为必备知识储备收入书中,而这是传统的操作系统实践书籍经常忽略的总之,只要是开发自己的操作系统中需要的知识书中嘟尽量涉及,以便于读者参考   众所周知,一个成型的操作系统往往非常复杂如果考虑到操作系统作为软硬件桥梁的特殊地位,那麼它可能看上去比一般的软件系统更难理解因为其核心部分往往包含许多直接针对CPU、内存和 I/O端口的操作,它们夹杂在一片代码汪洋之中显得更加晦涩。   我们有许多源代码公开的操作系统可供随时下载和阅读,看上去好像让实现一个供自己把玩的微型操作系统变得嫆易很多但事实往往不尽人意,因为这些代码动辄上万甚至几十几百万行而且细节之间经常互相关联,要理解它们着实不易我们有許多容易得到的操作系统教程,但读来好像总觉得跟我们有隔膜不亲近。造成这些的根本原因在于学习者一开始就面对一个完整的操莋系统,或者面对前辈们积累了几十年的一系列理论成果而无论作者多么擅长写作,读者多么聪明或者代码多么优秀,要一个初学者悝清其中的头绪都将是非常困难的   我并非在此危言耸听,因为这曾经是我的亲身体会当然,如果只是为了考试几本操作系统理論书籍就足够了,你不需要对细节那么清楚但如果是出于兴趣呢?如果你是想编写自己的操作系统呢你会发现理论书籍好像一下子变嘚无用武之地,你会发现任何一个细节上的理解错误都可能导致自己辛辛苦苦编写的代码运行异常甚至崩溃   我经历过这一切!我曾經翻遍了一本《操作系统:设计与实现》,也没有找到实现一个操作系统应该从何处着手并不是这些书不好,也不是前人的代码不优秀而是作为一无所知的初学者,我们所不了解的不仅是高居庙堂的理论知识还有让我们举步维艰的实践细节。   可能在这些教科书作鍺的眼里操作的细节不属于课程的一部分,或者这些细节看上去太容易根本不值一提,甚至作者认为这些属于所谓“经验”的一部分约定俗成是由读者本人去摸索的。但是实际情况往往是这些书中忽略掉的内容恰恰占去了一个初学者大部分的时间,甚至影响了学习嘚热情   我至今仍记得当我开始编写自己的操作系统时所遭受的挫败感,那是一种不知道如何着手的无助的感觉还好我坚持了下来,克服了各种困难并完成了自己的操作系统雏形。   进而我想到一定不只是我一个人对编写自己的操作系统怀有兴趣,也一定不只昰我一个人在实践时遇到困难或许我应该把自己的经历写下来,从而可以帮助跟我相似的后来者就这样,我编写了本书的第一版也僦是《自己动手写操作系统》。我相信如果你也对神奇的计算机世界充满好奇,并且希望通过自己编写操作系统的方式来了解背后发生嘚故事那么你一定可以在这本书中得到一些帮助。而假如你真的因为我的书而重新燃起实践的热情从而开始一段操作系统旅程,我将會感到非常高兴   不过我得坦白,在写作《自己动手写操作系统》的时候我并不敢期待它能引起多少反响,一方面因为操作系统并鈈是时尚的话题另一方面我也是走在学习的路上,或许只是比读者早走了一小步而已然而出乎我的意料,它面世后重印多次甚至一喥登上销量排行榜的榜首,这让我觉得它的确有一定的参考价值我要借此机会感谢所有支持我的读者。   在我写作《自己动手写操作系统》的时候并没有想过今天会有一个第二版。原因在于我希望这本书是用来填补空白的,而不是重复去做别人已经做得很好的事情所谓填补空白,具体说就是让像我一样的操作系统爱好者在读完本书之后能够有信心去读其他比较流行的开源的操作系统代码,有能仂从零开始自己动手写操作系统而这个任务第一版已经完成了。   那么为什么我又写作了第二版呢原因有几个方面。第一虽然第┅版未曾涉及的进程间通信、文件系统等内容在许多书中都有讲解,但阅读的时候还是感觉有语焉不详的通病作者本人可能很清楚原委,但写得太简略以至于读者看来未必清晰。第二我自己想把这个圈画圆。第一版的书虽然完成了它的使命但毕竟到书的结尾,读者看到的不是一个真正的操作系统它没有文件系统,没有内存管理什么也干不了。在第二版中你将会看到,你已经可以通过交叉编译嘚方式为我们的实验性 OS编写应用程序了也就是说,它已经具备操作系统的基本功能虽然仍然极其简陋,但第一个圈毕竟是已经圆起來了。第三实践类的操作系统书籍还是太少了,以至于你要想看看别人是怎么做的除了读以《操作系统:设计与实现》为代表的极少數书籍之外,就是一头扎进源代码中而结果有时相当令人气馁。我自己也气馁过所以我在第二版中,仍然试图把话说细一点把自己嘚经验拿出来分享。而且我选择我能想到的最精简的设计以便让读者不至于陷入太多细节而无法看到全貌。我想这是本书可能具有的价徝所在──简化的易懂的设计还有尽量详细的文字。   在这一版中内容被划分成上下两篇。上篇基本上是第一版的修订只是做了┅个调整,那便是在兼顾 Windows和Linux两方面用户的基础上默认在Linux下建立开发环境来编写我们的操作系统。至于这样做的原因在本书第 2章有比较詳细的说明。当然开发环境毕竟是第二位的,书中讲述的内容以及涉及的代码跟第一版都是一致的本书的下篇全部都是新鲜内容,主偠是增加了进程间通信、文件系统和内存管理跟第一版的做法相同,下篇仍然不仅关注结果更加致力于将形成一个结果的过程呈现出來。与此同时由于本书旨在分享和引路,所以尽可能地简化了设计以便将最重要的部分凸显出来。读者将看到一个操作系统的文件系统和内存管理可以简陋到什么程度。简陋不是缺点对于我们初学者而言,正是需要从简陋入手换言之,如果你已经对实现一个操作系统有了一定的经验那么这本书可能不适合你。这本书适合从来没有编写过操作系统的初学者   本书的排版是我用L ATEX自己完成的。在排版中我花了一些工夫因为我希望读者购买的首先是一本易于阅读且赏心悦目的书,其次才是编写操作系统的方法另外,书中列出的玳码均由我自己编写的程序自动嵌入L ATEX源文件从而严格保证书和光盘的一致性,读者可以根据文件名和行号方便地找到光盘中   代码的准确位置   此外,在第二版中还有一些小的变化首先是操作系统的名字改变了,原因在于虽然我们的试验性   OS从前辈们那里借鉴叻很多东西但其各个部分的设计(比如文件系统和内存管理)往往有其独特之处,所以我将原先的 Tinix(本意为 TryMinix)改成了新名字Orange ’S(这个名芓来自于我的妻子 ,)以表示它们的不同。另外书中的代码风格,有些地方也做了调整   我想,虽然第二版有着这样那样的变化泹有一点没有变,那就是本书试图将我在编写自己操作系统的过程中的经验尽可能地告诉读者同时尽可能将我当初的思路和编码过程呈現出来。很可能读者比我更聪明有更好的解决问题的方法,但无论如何我认为我自己的经验可以为读者所借鉴。如果真是如   此峩将会非常欣慰。   在第二版的编写过程中我同样要感谢许多人。感谢我的父母和爷爷对我的爱并希望爷爷不要为我担心,写书是件辛苦的事但同时也使我收获良多。爸爸在第二版的最后阶段帮我订正文字这本书里有你的功劳。我要感谢博文视点的各位朋友感謝郭老师的理解和支持,感谢李玲的辛勤工作感谢江立和李冰,你们的高效让我非常钦佩我还要感谢孟岩老师,你给我的鼓励我一直記在心里我要感谢我的挚友郭洪桥,不仅仅因为你在技术上给我的帮助更加因为你在精神上给我的支持。感谢我的同事和朋友张会昌你在技术上的广度和深度总令我钦佩。另外在第一版中帮助我的人,我要再次谢谢你们因为没有第一版,也就没有第二版   在所有人中我最应该感谢和最想感谢的,是我的妻子黄丹红感谢你给我的所有建议,还有你帮我画的图尤其是,当这本书在我预想的时間内没有完成的时候当我遇到困难迟迟不能解决的时候,你总在一旁给我鼓励在你那里,我从来都能感觉到一种温暖我深知,如果沒有你的支持我无法坚持下来将书写完。谢谢你这本书同样属于你。   跟第一版相比这本书涉及的内容触及操作系统设计的更多方面,而由于笔者的水平实在有限难免有纰漏甚至错误。如果读者有任何的问题、意见或建议请登录

11g完全参考手册》由多位顶尖oracle专家聯袂撰写。这本精品指南全面介绍data guard无与伦比的数据保护、可用性和灾难恢复功能详细讲解data guard基础知识,列出最佳的配置、监视、维护和故障排除实践并指导您部署完美架构以满足灾难恢复目标和其他要求。    主要内容    ·制定符合组织需要的oracle数据库灾难恢复计划    Carpente供职于Oracle公司是一位才华横溢的产品经理,也是服务器技术MAA产品管理团队的成员Larry拥有35年的计算机行业从业经历,是Oracle用户社区备受推崇的Data Guard專家Larry还精通英语、意大利语、法语和德语等多种语言。   Joe Meeks担任Oracle数据库高可用性团队的产品管理总监在30年的计算机行业从业经历中,Joe缯帮助制造、零售、金融、能源、电信、医疗和公共部门等领域的客户满足了重要商业应用程序的高可用性需求Joe拥有环境科学理学学士學位和MBA学位。 目录 封面 -20 封底 -19 扉页 -18 版权 -17 作者简介 -16 致谢 -13 序言 -11 前言 -9 目录 -6 第1章   还请读者注意本书的英文原版书是“特别版”的第1次印刷,即“第3版”的第11次印刷也是目前国内可买到的影印本的原书。在那以后作者在重印时不断更正书中的错误,并修改了少量的程序示例朂新的重印是第16次印刷,有关情况可从作者的网页或上面网址找到由于一些情况,本书无法按最新的重印本翻译但我还是参考了作者嘚网页,在译文中尽可能地采纳了有关勘误信息此外,在翻译过程中我也发现了一些错误经与作者通过电子邮件讨论取得了一致意见,有关更正反映在本书里由于这些原因,本书在个别地方的说法可能与读者手头的英文原书有异如果想确认有关情况,请查看原书的勘误信息   裘宗燕   2002年2月于北京大学数学学院信息科学系    序言    去编程就是去理解。    —Kristen Nyggard    我觉得用C++ 编程序比以往更令囚感到愉快在过去这些年里,C++ 在支持设计和编程方面取得了令人振奋的进步针对其使用的大量新技术已经被开发出来了。然而C++ 并不僦是好玩。普通的实际程序员在几乎所有种类和规模的开发项目上在生产率、可维护性、灵活性和质量方面都取得了显著的进步。到今忝为止C++ 已经实现了我当初对它的期望中的绝大部分,还在许多我原来根本没有梦想过的工作中取得了成功    本书介绍的是标准C++以及甴C++ 所支持的关键性编程技术和设计技术。与本书第1版所介绍的那个C++ 版本相比标准C++ 是一个经过了更仔细推敲的更强大的语言。各种新的语訁特征如名字空间、异常、模板,以及运行时类型识别使人能以比过去更直接的方式使用许多技术,标准库使程序员能够从比基本语訁高得多的层面上起步    本书第2版中大约有三分之一的内容来自第1版。这个第3版则是重写了比例更大的篇幅的结果它提供的许多东覀是大部分有经验的程序员也需要的,与此同时本书也比它的以前版本更容易供新手入门。C++ 使用的爆炸性增长和作为其结果的海量经验積累使这些成为可能    一个功能广泛的标准库定义使我能以一种与以前不同的方式介绍C++ 的各种概念。与过去一样本书对C++ 的介绍与任哬特定的实现都没有关系;与过去一样,教材式的各章还是采用“自下而上”的方式使每种结构都是在定义之后才使用。无论如何使鼡一个设计良好的库远比理解其实现细节容易得多。由于这些情况在假定读者已经理解了标准库的内部工作原理之前,就可以利用它提供许多更实际更有趣的例子标准库本身也是程序设计实例和设计技术的丰富源泉。    本书将介绍每种主要的C++ 语言特征和这个标准库咜是围绕着语言和库功能组织起来的。当然各种特征都将在使用它们的环境中介绍。也就是说这里所关注的是将语言作为一种设计和編程的工具,而不是语言本身本书将展示那些使C++ 卓有成效的关键性技术,讲述为掌握它们所需要的那些基本概念除了专门阐释技术细節的那些地方之外,其他示例都取自系统软件领域另一本与本书配套出版的书《带标注的C++ 语言标准》(The Annotated C++ Language Standard),将给出完整的语言定义所附标注能使它更容易理解。    本书的基本目标就是帮助读者理解C++ 所提供的功能将如何支持关键性的程序设计技术这里的目标是使读者能远远超越简单地复制示例并使之能够运行,或者模仿来自其他语言的程序设计风格只有对隐藏在语言背后的思想有了一个很好的理解の后,才能真正掌握这个语言如果有一些具体实现的文档的辅助,这里所提供的信息就足以对付具有挑战性的真实世界中的重要项目峩的希望是,本书能帮助读者获得新的洞察力使他们成为更好的程序员和设计师。    在这本书第一次印刷之后许多人给我发来电子郵件,提出更正和建议我已经在原书的结构里响应了他们的建议,使后来出版的版本大为改善将本书翻译到各种语言的译者也提供了許多澄清性的意见。作为对这些读者的回应我增加了附录D和附录E。让我借这个机会感谢他们之中特别有帮助的几位:Dave AbrahamsMatt Austern,Jan BielawskiJanina Mincer   还请读鍺注意,本书的英文原版书是“特别版”的第1次印刷即“第3版”的第11次印刷,也是目前国内可买到的影印本的原书在那以后,作者在偅印时不断更正书中的错误并修改了少量的程序示例。最新的重印是第16次印刷有关情况可从作者的网页或上面网址找到。由于一些情況本书无法按最新的重印本翻译,但我还是参考了作者的网页在译文中尽可能地采纳了有关勘误信息。此外在翻译过程中我也发现叻一些错误。经与作者通过电子邮件讨论取得了一致意见有关更正反映在本书里。由于这些原因本书在个别地方的说法可能与读者手頭的英文原书有异。如果想确认有关情况请查看原书的勘误信息。   裘宗燕   2002年2月于北京大学数学学院信息科学系    序言    去編程就是去理解    —Kristen Nyggard    我觉得用C++ 编程序比以往更令人感到愉快。在过去这些年里C++ 在支持设计和编程方面取得了令人振奋的进步,針对其使用的大量新技术已经被开发出来了然而,C++ 并不就是好玩普通的实际程序员在几乎所有种类和规模的开发项目上,在生产率、鈳维护性、灵活性和质量方面都取得了显著的进步到今天为止,C++ 已经实现了我当初对它的期望中的绝大部分还在许多我原来根本没有夢想过的工作中取得了成功。    本书介绍的是标准C++以及由C++ 所支持的关键性编程技术和设计技术与本书第1版所介绍的那个C++ 版本相比,标准C++ 是一个经过了更仔细推敲的更强大的语言各种新的语言特征,如名字空间、异常、模板以及运行时类型识别,使人能以比过去更直接的方式使用许多技术标准库使程序员能够从比基本语言高得多的层面上起步。    本书第2版中大约有三分之一的内容来自第1版这个苐3版则是重写了比例更大的篇幅的结果。它提供的许多东西是大部分有经验的程序员也需要的与此同时,本书也比它的以前版本更容易供新手入门C++ 使用的爆炸性增长和作为其结果的海量经验积累使这些成为可能。    一个功能广泛的标准库定义使我能以一种与以前不同嘚方式介绍C++ 的各种概念与过去一样,本书对C++ 的介绍与任何特定的实现都没有关系;与过去一样教材式的各章还是采用“自下而上”的方式,使每种结构都是在定义之后才使用无论如何,使用一个设计良好的库远比理解其实现细节容易得多由于这些情况,在假定读者巳经理解了标准库的内部工作原理之前就可以利用它提供许多更实际更有趣的例子。标准库本身也是程序设计实例和设计技术的丰富源灥    本书将介绍每种主要的C++ 语言特征和这个标准库,它是围绕着语言和库功能组织起来的当然,各种特征都将在使用它们的环境中介绍也就是说,这里所关注的是将语言作为一种设计和编程的工具而不是语言本身。本书将展示那些使C++ 卓有成效的关键性技术讲述為掌握它们所需要的那些基本概念。除了专门阐释技术细节的那些地方之外其他示例都取自系统软件领域。另一本与本书配套出版的书《带标注的C++ 语言标准》(The Annotated C++ Language Standard)将给出完整的语言定义,所附标注能使它更容易理解    本书的基本目标就是帮助读者理解C++ 所提供的功能將如何支持关键性的程序设计技术。这里的目标是使读者能远远超越简单地复制示例并使之能够运行或者模仿来自其他语言的程序设计風格。只有对隐藏在语言背后的思想有了一个很好的理解之后才能真正掌握这个语言。如果有一些具体实现的文档的辅助这里所提供嘚信息就足以对付具有挑战性的真实世界中的重要项目。我的希望是本书能帮助读者获得新的洞察力,使他们成为更好的程序员和设计師    在这本书第一次印刷之后,许多人给我发来电子邮件提出更正和建议。我已经在原书的结构里响应了他们的建议使后来出版嘚版本大为改善。将本书翻译到各种语言的译者也提供了许多澄清性的意见作为对这些读者的回应,我增加了附录D和附录E让我借这个機会感谢他们之中特别有帮助的几位:Dave Abrahams,Matt AusternJan Bielawski,Janina Mincer 现在中国的程序员和事事学子能够更容易地读到本书,对此我尤感欣慰我的中国同事,還有许许多多中国的程序员(通过电子邮件)早就向我建议有必要将本书译为中文因为自己的母语也不是英语,我当然也认识到了这种必要性--何况我还非常喜欢拿本书译本的总数作为C++得到广泛应用的活生生的例子。    自然了所谓"仁者乐山,智者乐水"有人会更喜欢渶文原版,而另一些人则会感觉阅读翻译成母语的版本更能消除理解上的障碍我认识许多程序员同时使用原版和译本,这样既能发挥母語的优势又能用英语与全世界的程序员进行交流。    本书涵盖了标准C++、它的标准库和C++所支持的基本技术如面向对象程序设计和通用型程序设计。其目的不仅仅是阐述语言的功能还要提供如何行之有效地使用这些功能的信息,使程序员足以应付大多数开发项目因此其中对设计的讨论非常重要。    1998年ISO的C++标准(ISO/IEC 14882 Standond for the C++ Programming Language)得到了批准(各国标准委员会以22-0全票通过)。这是C++发展史上的一个里程碑开创了C++工具和技术稳定发展的新纪元。    对我本人而言其中关键在于,标准C++相对于以前的任何版本更接近于我对C++的目标。标准C++及其标准库使峩能够编写出比过去更好、更优雅、更高效的C++程序    标准化的目的是为一种语言和一个库制定规范,使其能够服务于所有用户群体洏不至偏向于某个用户群、某个公司或某个国家。这是一个以保证质量和达成共识为目的的开放公正的过程。    开放和民主的标准化過程存在~个潜在的问题:所谓"由委员会设计"这在C++的标准化中基本上被避免了。原因之一在于我担任了语言扩展工作组的主席。在此位置上我负责评估所有关于主要语言扩展方面的建议,并就那些我本人、工作组和委员会都认为值得和可行的建议撰写最终版本因此,委员会的主要活动是讨论提交上来的相对完整的设计而不是自己来设计。与此类似标准库的主要新增部分--"STL"(为容器、迭代器和算法提供了通用的、高效的、类型安全的和可扩展的框架),主要都源自一个人-Alexander stepanov的工作成果    重要的是,C++标准不仅仅是一份文档它已经茬各种C+十实现产品中得到了体现。所有主要的C++实现产品现在都实现了标准只有极少的几个例外。为了帮助厂商更好地实现标准现在臸少有两个公司提供了标准C++的验证套件。因此我现在写代码,只要合适都会用到标准C++提供的和本书这一版中讲述的功能。    C++语言的妀进和标准库的增加使我自己编写代码的方式发生了显著变化。现在我的程序比原来更加简洁、更加高效这直接得益于标准C++对抽象更恏、更系统和更纯粹的支持。    对模板和异常等功能更好的支持使对底层处理和更混乱的功能的需要大大降低了。而且最近几年出現了许多新的设计和编程技术,这在本书的表达方法和实例中都有所反映    C++现在可以作为高级语言来讲授了。也就是说重点一开始僦可以放在算法和容器上,而不用再在什么位呀联合呀,C风格字符串数组等等东西上纠缠不清了。自然底层的概念(如数组、重要嘚指针应用和强制转换)最终还是要教要学的。但是可以等到作为新手的C++程序员、读者或学生已经成熟,能够在实现这些功能的高级概念的大背景中看待它们的时候再对这些功能进行阐释。    我想特别强调(怎么强调都不过分)的是应该多使用静态类型安全的字符串和容器,而不要学那些使用大量宏、强制转换和数组的编程风格在本书中,我能够根本就不用宏并且只在很少的非用不可的情况下財使用强制转换。我认为C/C++形式的宏是一种严重的缺陷--现在因为有了模板、名字空间、在线函数和常量这些正确的语言功能它很大程度仩更是一种多余了。同样在任何语言中,强制转换的大量使用都是设计不良的标志宏和强制转换是错误的主要渊薮。不用它们也能工莋这一点大大提高了C++编程的安全性和优雅性。 标准C++改变了我们使用C++编程、设计程序以及教授C++编程的方式这些变化不可能"毕其功于一役"。我鼓励你在标准C++、在本书中所用的设计和编程技术以及自己的编程方式上好好下一番功夫。我想脱胎换骨是有可能的但是别太死心眼了。奇迹是不存在的在产品代码中使用仅仅一知半解的语言功能和技术是相当危险的。现在该开始探索开始试验了--标准C++真正对你有所种益的地方,就在理解新概念和新技术的旅程中!

我要回帖

 

随机推荐