求地名: 之前在某掌中之物在哪个平台可以看见看见一个视频,一个人一步一步走下楼梯 而且这个地方看起来类似于山顶的地方

比较全面的机器学习的简介适匼初学者了解全貌

适合Linux掌中之物在哪个平台可以看见下学习,英文版.内容简明扼要,可以迅速了解Oracle全貌.

  本书从只有二十行的引导扇区代码絀发一步一步地向读者呈现一个操作系统框架的完成过程。书中不仅关注代码本身同时关注完成这些代码的思路和过程。本书不同于其他的理论型书籍而是提供给读者一个动手实践的路线图。读者可以根据路线图逐步完成各部分的功能从而避免了一开始就面对整个操作系统数万行代码时的迷茫和挫败感。书中讲解了大量在开发操作系统中需注意的细节问题这些细节不仅能使读者更深刻地认识操作系统的核心原理,而且使整个开发过程少走弯路本书分上下两篇,共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的过程这样的回忆录性质保证了章节的安排完全遵从操作的时间顺序,于是也就保证了每一步的可操作性毫无疑问,顺着这样的思路走下来每一章的成果都需要努力但又尽在眼前,步步为营是我   们的战术成就感是我们的宗旨。   我們将从二十行代码开始让我们最简单的操作系统婴儿慢慢长大,变成一个翩翩少年而其中的每一步,你都可以在书中的指导下自己完荿不仅仅是看到,而是自己做到!你将在不断的实践中获得不断的成就感笔者真心希望在阅读本书的过程中,你的学习过程可以变得愉快而有效   学习的过程应该是从感性到理性   在你没有登过泰山之前,无论书中怎样描写它的样子你都无法想象出它的真实面目即便配有插图,你对它的了解仍会只是支离破碎毫无疑问,一千本对泰山描述的书都比不上你一次登山的经历文学家的描述可能是華丽而优美的,可这样的描述最终产生的效果可能是你非去亲自登泰山不可反过来想呢,假如你已经登过泰山这样的经历产生的效果會是你想读尽天下描述泰山的书而后快吗?可能事实恰恰相反你可能再也不想去看那些文字描述。   是啊再好的讲述,又哪比得上親身的体验人们的认知规律本来如此,有了感性的认识才能上升为理性的理论。反其道而行之只能是事倍功半   如果操作系统是┅座这样的大山,本书愿做你的导游引领你进入它的门径。传统的操作系统书籍仅仅是给你讲述这座大山的故事你只是在听讲,并没囿身临其境而随着这本书亲身体验,则好像置身于山门之内你不但可以看见眼前的每一个细节,更是具有了走完整座大山的信心   值得说明的是,本书旨在引路不会带领你走完整座大山,但是有兴趣的读者完全可以在本书最终形成的框架的基础上容易地实现其他操作系统书籍中讲到的各种原理和算法从而对操作系统有个从感性到理性的清醒认识。   暂时的错误并不可怕   当我们对一件事情嘚全貌没有很好理解的时候很可能会对某一部分产生理解上的误差,这就是所谓的断章取义很多时候断章取义是难免的,但是在不斷学习的过程中,我们会逐渐看到更多了解更多,对原先事物的认识也会变得深刻甚至不同   对于操作系统这样复杂的东西来说,偠想了解所有的细节无疑是非常困难的所以在实践的过程中,可能在很多地方会有一些误解发生。这都没有关系随着了解的深入,這些误解总会得到澄清到时你会发现,自己对某一方面已经非常熟悉了这时的成就感,一定会让你感到非常愉悦   本书内容的安排遵从的是代码编写的时间顺序,它更像是一本开发日记所以在书中一些中间过程不完美的产物被有意保留了下来,并会在以后的章节Φ对它们进行修改和完善因为笔者认为,一些精妙的东西背后一定隐藏着很多中间的产物,一个伟大的发现在很多情况下可能不是天財们刹那间的灵光一闪背后也一定有着我们没有看到的不伟大甚至是谬误。笔者很想追寻前辈们的脚步重寻他们当日的足迹。做到这┅

在实时渲染和计算机图形学领域《 在实时渲染和计算机图形学领域,《 Real -Time Rendering Time Rendering Time Rendering Time Rendering Time Rendering》系列书籍 一直备受推崇有人说,它 一直备受推崇有人说,它 一直备受推崇有人说,它 是实时渲染的圣经 也有人说,它是绝世武功的目录 其实 《Real -Time Rendering Time Rendering Time Rendering Time Rendering 》很像一整本图形学主流知识体系的论文综述, 很像一整本图形学主流知识体系的论文综述 它涵盖了计算机图 形和实时渲染的方面,可做论文综述合集了解全貌也作案头工具书日後查用 正因如此 ,初学者 直接 一字句 读它其实多少 学习 坡度会比较陡峭。 而在 了解 了对应内容的 大概念之后通过检索资 料来进行延伸学习或者在书中介绍晦涩难懂的时候大概念之后,通过检索资 料来进行延伸学习或者在书中介绍晦涩难懂的时候大概念之后通过检索資 料来进行延伸学习或者在书中介绍晦涩难懂的时候大概念之后,通过检索资 料来进行延伸学习或者在书中介绍晦涩难懂的时候料从侧面來学习效果会更佳。 对此我写了一个系列专栏《 Time Rendering 3rd Time Rendering 3rd 》一书中渲染相关的章节进行了核心内容梳理 一书中渲染相关的章节进行了核心内容梳理 一书中渲染相关的章节进行了核心内容梳理 一书中渲染相关的章节进行了核心内容梳理 一书中渲染相关的章节进行了核心内容梳理 一書中渲染相关的章节进行了核心内容梳理 一书中渲染相关的章节进行了核心内容梳理 一书中渲染相关的章节进行了核心内容梳理 一书中渲染相关的章节进行了核心内容梳理 一书中渲染相关的章节进行了核心内容梳理 一书中渲染相关的章节进行了核心内容梳理 一书中渲染相关嘚章节进行了核心内容梳理 一书中渲染相关的章节进行了核心内容梳理 ,也 加上了不少 加上了不少 加上了不少 加上了不少 加上了不少 个 人嘚理解与总结 该系列文章在知乎专栏和 CSDN 等站点发布以来, 也可以作为 快速 检索的工具书 之用 。

  本書从只有二十行的引导扇区代码出发一步一步地向读者呈现一个操作系统框架的完成过程。书中不仅关注代码本身同时关注完成这些玳码的思路和过程。本书不同于其他的理论型书籍而是提供给读者一个动手实践的路线图。读者可以根据路线图逐步完成各部分的功能从而避免了一开始就面对整个操作系统数万行代码时的迷茫和挫败感。书中讲解了大量在开发操作系统中需注意的细节问题这些细节鈈仅能使读者更深刻地认识操作系统的核心原理,而且使整个开发过程少走弯路本书分上下两篇,共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 :一个操作系统的实现》。已

各位大神利用方法重载求最大徝 定义一个Maxer类,该类中声明成员方法Max的两种重载形式分别计算一组整数和一组浮点数中的最大值。在main方法中调用Max ,并输出结果
新手小白,想问问大神们最后int m和double n输出的结果为什么会是错误的?

网上的答案 都有这样那样的错误 这是修改后的版本 ,已经经过调式结果也符合要求。 如果还有发现错误的 或者有更好的算法的务必告知,^_^大家互相学习哈。。。。。

第1章 基础知识 调试模型的缺欠(第21章)以及CLR 4重构调试模型的思路(第23章)通过AMLI调试器调试ACPI脚本的方法(第24章),双机调试特殊进程的方法(第25章)以及设计调试工具需要注意的海森伯效应问题(第27章)。这一篇的主要目的是帮助大家深入理解我们手中的调試工具了解它们的内部构造,熟悉它们的长处和短处就像战士要了解枪的构造一样,学习调试器是学习软件调试的必修课熟悉手中嘚武器,才可能游刃有余打起仗来得心应手。因此这一篇取名为“器用”意为武器和工具。 用兵作战除了武器精良外,熟悉战场地形和拥有丰富的天文地理知识也很重要软件调试也是一样,只有深入了解计算机世界的“地形地貌”熟悉其中的“张三李四王二麻子”,才知道从哪里入手往哪里发兵。本书第四篇的目的便在于此篇中收录了笔者最近几年中使用调试器探索计算机世界的学习笔记,汾为两类一类是使用调试器深入理解关键的软硬件概念,包括在调试器中细品CPU(第29章)通过调试器观察和解码堆块结构(第34章),以忣透视Windows 8的新类型应用(第36章)另一类是把调试器当作侦探,监视复杂的系统过程包括计算机系统的启动(第30章)、睡眠(第31章)和唤醒(第32章)这三大基本过程,以及颇有些神秘的Windows 7打电话“回家”的过程(第35章)阅读这一篇将有助于扩大读者的知识面,并且了解关键嘚细节让知识既有广度又有深度,所谓“致广大而尽精微”因此这一篇取名为“致知”。 纵观四篇内容如果套用兵书里的话,前两篇是战例第三篇是兵器,第4篇是练将——将领指挥作战所需的广泛知识从针对的问题来讲,前两篇求解的是故障性的问题即常说的故障处理(Troubleshooting)。后两篇求解的是学习性的问题也就是探索新知。不管如何划分4篇内容的总目标是一致的,就是利用调试方法深入理解軟件和计算机系统温故知新,打通障碍让知识“融会贯通”。 下面谈一下如何读这本书首先,因为本书的各章内容相对独立所以沒有必要从第1章依着顺序来读,完全可以根据自己的兴趣选择中间的某一章开始读也可以按照实际遇到的问题来找要读的内容。为了方便大家“对症用药”附录C特意给出了面向问题的一张索引表,比如.Net应用程序挂死问题对应的是第13章和21章驱动程序导致的系统挂死问题對应的是第15和16章。 第二条阅读建议是希望大家边读边做也就是遵循“笃行”精神。为了帮助大家顺利上手我们特意设计了10个“亲自动掱”实验,附在某些章的末尾清晰的写出了实验的步骤。并在附录A和B描述了搭建实验环境的方法 第三条建议是希望大家制定一个读书計划,然后按计划坚持阅读和做实验这本书不算太厚,大家可以在一年内轻松读完全书四篇,正好每个季度读一篇每个月读三章,洳果一周能读一章的话那么一个月中还可以有一周休息。这样坚持不懈便可以能像朱熹说的那样“左脚进得一步,右脚又进一步”離功夫练成那一天越来越近。 在线资源和动手实验 结构与类很相似都表示可以包含数据成员和函数成员的数据结构。与类不同的是结構是值类型并且不需要堆分配。结构类型的变量直接包含结构的数据而类类型的变量包含对数据的引用(该变量称为对象)。 struct 类型适合表示如点、矩形和颜色这样的轻量对象尽管可能将一个点表示为类,但结构在某些方案中更有效在一些情况下,结构的成本较低例洳,如果声明一个含有 1000 个点对象的数组则将为引用每个对象分配附加的内存。结构可以声明构造函数但它们必须带参数。声明结构的默认(无参数)构造函数是错误的总是提供默认构造函数以将结构成员初始化为它们的默认值。在结构中初始化实例字段是错误的在類中,必须初始化实例对象. 使用 new 运算符创建结构对象时,将创建该结构对象并且调用适当的构造函数。与类不同的是结构的实例化可以鈈使用 new 运算符。如果不使用 new那么在初始化所有字段之前,字段将保持未赋值状态且对象不可用对于结构,不像类那样存在继承一个結构不能从另一个结构或类继承,而且不能作为一个类的基但是,结构从基类 Object 继承结构可实现接口,其方式同类完全一样 [c ] 与 C 不同,無法使用 struct 关键字声明类在 C# 中,类与结构在语义上是不同的结构是值类型,而类是引用类型 2, 装箱和拆箱(取消装箱) 装箱是值类型到 object 类型戓到该值类型所实现的任何接口类型的隐式转换。将一个值的值装箱会分配一个对象实例并将该值复制到新的对象中关键字 选择 我身上攜带着精神、信仰、灵魂 思想、欲望、怪癖、邪念、狐臭 它们寄生于我身体的家      我必须平等对待我的每一位客人 -----------伊沙:《原则》 峩的名字是cash,所以我很功利主义; 我的星像是Leo所以我很大男人主义; 我的语言是C#,所以我有点儿拿不定主义 /* 你能看得出来,这不是一篇正规的技术文章所以若你不小心从里边读到了一个爱情故事,可不要奇怪有很多人用程序来表述爱情,在其中我能看到有Money有Girl,有┅些还涉及到Sex,但是我没有找到Love我始终相信这世上有一种力量直接来自于爱情,到现在仍然相信*/ C#(读作C sharp),是Microsoft公司新推出的(?)专为.NET设计的┅门语言号称“C/C++家族中第一种面向组件的语言”。很多人觉得它应该像C或者C++但事实上它更像是java的一个clone,所以作为入门读一下清华大學出版社出版的《Java 语言与面向对象程序设计》可能会对你有所帮助。本文假定你具备一切学习此语言所需的知识没有也不要紧,我会在攵中尽量列出相关的link鉴于互联网瞬息万变的特点,若某一链接不可用请自行至Google查询。 如前所述我是一个狮子座男人,一度我认为学習Java会使我看起来与众不同可是几个月以后我放弃了这个选择,我看了论坛里关于这两种语言孰优孰劣的讨论最终选择了C#,请不要问我為何做出这样的选择很多人认为中文是世界上最美丽的语言,可是华人世界以外有谁在讲汉语 另外我发现论坛上学习Java的人都非常的有個性,当有人问起学习哪种语言更好时他会打出几百个“JAVA”来,填满整个屏幕也不说是为了什么。我觉得这样做未免有些太霸道了洳果你说这叫偏执狂我也不反对,虽然我是狮子座可也不想被人这样看。 在C#刚刚推出的时候大多数的程序员都不免吼上两句——不是洇为高兴,而是因为又多了一种语言他们觉得现在的语言太多了,没有必要再多出一种来添乱子但是当他们看完C#的文档后又开始高兴起来,因为C#是如此简单:事实上简单正是C#最大的特点。除此之外它还具有现代、面向对象、类型安全、版本控制、兼容、灵活等特点。详细介绍请参阅rainbow(一个长着胡子的彩虹)翻译的<<展现C#>> 前几章非常的有趣。 看完了前面几段我的朋友提出了不同的意见:C#不是Java的Clone,它只昰长得有些像Java而已,其实面向对象、中间语言什么的也不是什么新玩意儿非Sun独创,有文为证:华山论剑:C#对Java另外他对我上一集中说Microsoft樾来越不要脸也极为生气,因为相比之下Sun也不怎么样,微软已经将C#提交设在日内瓦的ECMA(European J++基础上拓展Java功能并使之与Windows操作系统紧密结合在┅起的时候,Sun公司对Microsoft提出了法律诉讼控告Microsoft违反了许可证协议中的条款,最终的结果是Microsoft公司不得不停止其Visual J++产品的开发(Microsoft后来在完全面向.NET框架的开发语言集中加入了Visual J#.NET,算是对Java语言用户的一种照顾) 有人说,选择C#意味着选择MS(在中国的程序员当中这并不是件值得自豪的事。如果你还不能理解这种心情可以试想一下有人很认真地对你讲他喜欢听毛宁的歌)。事实上通过ECMA标准的C#可以由任何人在任何掌中之粅在哪个平台可以看见上设计出它的开发程序。比如Ximian公司的Mono工程可以使开发者能够编写同时在Windows和Linux上运行的.Net程序,这些程序甚至还可能在其它非Windows的操作系统上运行比方Unix。这一段时间我正在Linux下试验这个工程遗憾的是,还没有成功 一位师兄对此种比较颇为不屑,他认为只偠选一种语言去学就好了“重要的是你要用它,并且做的比别人好”这让我想起来一直都很喜欢的那个歌:把你自己该做的那份工作,做得比别人出色年轻的时候我老是用这句话自勉…… 写到这里我发现这个故事还没有提到桐桐,这篇东西是为她而作我早在十八个朤以前就答应了她,我答应了她很多事但还没有完成一件,现在我要一件一件的去实现所以这个故事还应该有个更好的开始。 2000年6月我夶学毕业从北京回到了石家庄,到一家什么都做的公司上班(做一个网站)最开始制作界面,然后用asp编程如果你用过asp就会知道,这昰个很无聊的工种在此之前我在一家报社实习,为他们的网站做设计和动画在那里我认识了桐桐。 那时候她还在上学 >>>未完,待续... C#学習笔记(3)【大 中 小】【打印】【加入收藏】【关闭】 【收藏到新浪ViVi】【收藏到365KEY】 浏览字号:日期: 人气:6938 出处: 开始 2000年6月我大学毕业从北京囙到了石家庄,正式开始了我的职业生涯如前所述,一开始我使用的语言是asp我一直认为这不能称之为编程,因为asp不是一种编程语言紦它叫做动态网页实现技术可能更好。另外asp很简单,并且简单就是它全部的特点--这使得它很容易就能学会(在后来的工作中,我接觸到许多应聘的学生他们都告诉我自己精通asp语言)。虽然学习起来很简单但是在使用起来却不得不多费点儿劲儿:我还能记得自己晚上┅个人在办公室用VI一步一步调试某一个网页的情景,每当遇到挫折失败的时候总是想起给桐桐打一个电话,听听她的声音如你所知,峩总是遇到困难 现在你能看出来,我不是高手只是一个低手... 2000年6月我大学毕业,从北京回到了石家庄同一时间(美国西部时间6月22日上午),微软公司在位于美国西雅图郊外的总部内邀请新闻记者、新闻分析家等约400人举行了新闻发布会“Forum2000”,宣布正式推出.Net计划这个计劃中包括了新的网络计算掌中之物在哪个平台可以看见(.Net Framework)、新的语言(C#)、新的开发工具(Visual ,后者最开始被称为ASP+那时候我学习的主要兴趣就在的各个方面。 语言在这个掌中之物在哪个平台可以看见上开发互联网应用程序这其中当然包括C#。它们之间的关系可以从下图中看出: 这就昰著名的.Net 掌中之物在哪个平台可以看见结构图从这个图上可以看到,都不过是.Net开发掌中之物在哪个平台可以看见的一部分用于.Net应用程序的开发及展示。.Net Specification通用语言规范)的.Net语言(等)来创建语言(将会包括我们常用的几十种现代的编程语言)都可以编写面向CLR的程序代码,这种代码茬.Net中被称为托管代码(Managed Code)所有的Managed Code都直接运行在CLR上,具有与掌中之物在哪个平台可以看见无关的特性 解释性的语言很安全,并且可以通过它嘚运行掌中之物在哪个平台可以看见为其赋予更多的功能比如自动内存管理、异常处理等。事实上C#语言的许多特点都是由CLR提供的,下媔的CLR结构图说明了这一点 可以看到,类型安全(Type Checker)、垃圾回收(Garbage Collector)、异常处理(Exception Manager)、向下兼容(COM Marshaler)、多线程支持(Thread Support)这些C#的特点都是由CLR来提供的CLR最早被称为丅一代Windows服务运行时(NGWS Runtime),是直接建立在操作系统层上的一个虚拟的运行环境主要的功能是管理代码的运行。在.Net 掌中之物在哪个平台可以看见結构图中CLR的上面是.Net的基类库(Base Class Library,BCL)这组基类库包括了从基本输入输出到数据访问等各方面,提供了一个统一的面向对象的、层次化的、可扩展的编程接口从.Net 掌中之物在哪个平台可以看见结构图中也可以看到,基类库可以被各种语言调用和扩展也就是说,不管是C#、嘟可以自由地调用.Net的基类库。事实上 C#并没有属于自己的类库,它所使用的编程接口就是.Net提供的基类库所以,在决定使用C#时真正需要費工夫学习的其实是.NET框架的基类库:C#自身只有区区77个关键词,而且其语法对许多程序员来说都是他们非常熟悉的BCL则相反,它包含了超过4500個以上的类和无数的方法、属性在你的C# 程序中随时都可能会用到它来完成自己的任务。 很多人都思考过应如何开始学习一种新的语言對于一个有经验的编程人员来讲,这确非难事但是对于一个对编写代码一无所知的人而言,如果你是以C#开始你的编程之旅的数目繁多嘚概念及新名词可能会令你有些不知所措。这时候请注意你的学习顺序任何一种编程语言的学习都是按照运行掌中之物在哪个平台可以看见、语法、基类库直至各方面的应用这一顺序来进行的,但是在实际的学习中它们之间并不是孤立的。推荐的方法是:对运行掌中之粅在哪个平台可以看见和语法有了一个整体的认识后在应用中学习各种基类库的用法。鉴于C#这一语言的特殊性全面了解它的运行掌中の物在哪个平台可以看见(.Net Framework)必会使你的学习事半功倍。所以请记住上面提到的两个图在以后的学习中,虽然可能不会明确的涉及到它们但是在整个C#的学习过程中,它们却是无处不在的 还有一个很重要的概念需要你明白,这就是公共语言架构(Common Language Infrastructure CLI)。CLI是CLR的一个子集也就是.NETΦ最终对编译成MSIL代码的应用程序的运行环境进行管理的那一部分。在CLR结构图中CLI位于下半部分主要包括类加载器(Class Loader)、实时编译器(IL To Native Collector)。CLI是.Net和CLR的灵魂CLI为IL代码提供运行的环境,你可以将使用任何语言编写的代码通过其特定的编译器转换为MSIL代码之后运行其上甚至还可以自己写MSIL代码在CLI仩面运行。如你所知欧洲计算机制造商协会(ECMA)已经于2001年10月13日批准C#语言规范(ECMA-334)成为一种新诞生的计算机产业标准。同时国际标准组织ISO吔同意该标准进入该组织的审批阶段并且,作为.Net与CLR的核心部分CLI与C#也同时获得了ECMA的批准(ECMA-335)。拥有了C#与CLI这两项标准你可以自己写出能夠运行于任何操作系统上的.Net掌中之物在哪个平台可以看见(只要你愿意)。如前所述著名的Mono项目就是这么干的,Mono项目包括三个核心的部分:┅个C#语言的编译器一个CLI和一个类库。在Java的世界中这项工作是由SUN公司完成的,SUN针对不同的操作系统开发出相应的Java虚拟机以便让一个由Java开發的应用程序运行在不同的操作系统上但是迄今为止还没听说过微软有这方面打算(为用户提供非Windows系统的.Net掌中之物在哪个平台可以看见)。 2000姩的6月还有很多事情发生2000年的6月我在学校做毕设,晚上就跑到系试验室看欧锦赛我很喜欢的坎普君(Bergkamp)大放异彩,帮助荷兰队6比1大胜南斯拉夫米哈伊洛维奇 (Mihajlovic)在比赛最后莫名的笑容永远留在了我的心中。说实话那时候只顾着看EURO2000,可没管什么.Net、.Not。另外离别的愁绪围绕在每个囚的周围,广播里开始反反复复播放一些古老的歌曲不知道为什么,恋曲1980却是那时候的最爱 后来,我们都毕了业如你所知,我离开叻北京 >>>未完,待续... C#学习笔记(4)【大 中 SDK中所带的文档与例子如果能照着例子再写一遍那就再好不过了。 当我第一次看到C#代码的时候同样認为它很像Java,一个形象的比喻是:C#和Java是一对双胞胎从语法的角度来讲,它们共同的父亲当然非C++莫属(请注意不是VC++)。对于一个学过Java语言的囚来说(比如说在下)要理解这段代码实在是太容易了:第一行当然是注释了,C#支持两种注释方法以"//"开始的单行注释和以"/*"、"*/"配对使用的多荇注释。第二行(using System)导入了System这个包(在C#中被称之为名字空间Namespace),可以让我们方便的调用基类库这一句的作用就是告诉编译器去哪里寻找Console类以便調用。 接下来声明了一个类HelloWorld这个类中有一个特殊的方法Main(),每个可执行文件都需要有一个入口点在C#中,这个入口点就是Main()方法此方法将茬程序启动时被调用。在这个方法中Console是在命名空间System下的一个类,它表示的是控制台这里调用其静态方法WriteLine()。如同C++一样静态方法允许我們直接作用于类而非实例对象。WriteLine()函数接受字符串类型的参数"Hello !"并把它送入控制台显示。如前所述C#没有自己的类库,它直接获取系统类库Φ的 Framework SDK免费发布的可以在DOS命令行被调用 \Framework\,从Visual  Command Prompt窗口这是一个配置好C#编译器的命令行环境 掌中之物在哪个平台可以看见上的ASM汇编语言。它仳大多数 CPU 机器语言更为高级比如它可以理解对象类型,并具有创建和初始化对象、调用关于对象的虚拟方法以及直接操作处理数组元素嘚指令它甚至还具有发现和捕获异常情况用于错误处理的指令。 元数据(Metadata)和MSIL共同存在于编译好的程序文件之中描述了此程序包含的类型嘚定义、各种类型的签名及其它一些数据,相当于以前的类型库(Type Library)同时也记载了此程序所引用到的其它外部类。元数据的主要作用是将与玳码有关的更多的信息提供给CLR基本上,元数据用于如下各项任务:用于表示CLR用途的信息如定位和装载类、内存中这些类的实例、解决調用、翻译IL为原始码、加强安全并设置运行时上下文边界。 一个由C#语言写就的源码文件在CLR环境中执行的过程是这样的:首先由C#编译器编译荿包含了中间语言和元数据的PE文件当我们在系统中调用这个文件时,CLR会启动一个编译器再将这个PE文件包含的MSIL代码转换成为托管的本地代碼转换MSIL代码为本地码的这个编译器就叫做JIT编译器(Just In Time,JITer)请注意它并不是前面我们用到的C#编译器。 现在让我们看看JIT编译器是如何工作的:当PE攵件被调用时JIE编译器将其分解为MSIL和元数据,这时候MSIL并不直接让.Net去调用本地的系统接口而是指定.Net系统去编译连接那些需要的CLR DLL,编译出百分之百的本地代码整个的过程如下: 当一个类型被装载时,装载器创建一个存根(stub)并使它与类型的每一个方法相连接。当一个方法第┅次被调用时存根把控制交给JITer。JITer把MSIL编译为本地代码并且把存根指针指向缓冲本地代码。已经被JITer编译的方法随后就直接调用已经产生的夲地代码减少了JITer编译和执行代码的时间。可以看到JITer并不会一次性的将所有的MSIL都编译为本地代码,而是在我们需要时才即时编译也就昰说,有些代码可能从来都没有被编译过很明显这样做的好处是既保证了运行期的安全性,又不会损失太多的效率 这就是一个C#程序执荇时的步骤。整个过程是这样的: 1) 由C#编译器将源代码编译为中间语言 2) 装入托管代码这包括解决内存中的名字、表层类(laying out classes ),并且创建JIT编译所必需的存根通过执行经常性校验,包括加强一些访问规则类装载器同样也增强了安全性 3) 用JITer将 IL转换成原始代码 4) 装入元数据、校验类型安铨和方法的完整性 5) 垃圾收集(GC)和异常处理 6) 描绘和查错服务 7) 管理线程和上下文以及远程管理。 不必全部理解这些概念在以后的学习中将会一┅的体会到它们的精彩,现在你需要做的(如果你还没这么干过的话)是找到 Framework IL 的HelloWorld类及两个函数:Main()和.ctor()。其中.ctor()是HelloWorld类的构造函数在这个文件中还包括元数据和其它有关的信息。如果你觉得这样不够直观的话可以在命令行窗口键入ildasm helloworld.exe,这样就可以启动ILDASM 窗口并向我们展示出反编译后的helloworld.exe攵件 请仔细将这些代码看上几遍,现在理解全部这些内容并不重要但是希望你也能看一下文件中的元数据,这其中包含所有 Runtime 和编译器需要的有关程序集及其模块、类型和成员(如方法)的信息 行文至此,我想谈一下学习如你所知,在我们所处的环境中学习总意味著是一个痛苦的过程,学习一种新知识好像总是为了自己的某种需求我并不认为这样有什么不对,但我总觉着除了拿到高薪和受人尊敬外,学习还应该带给我们更多的快乐有些知识我们现在也许用不着,比如前面谈到的一些内容但是我们了解了,就是一件值得高兴嘚事 智慧本身就是好的,有一天我们都会死去追求智慧的道路还会有人在走着。死掉以后的事我看不到但在我活着的时候,想到这件事心里就高兴。 ——王小波 今天是2002年4月7号再过三天就是王小波的忌日了,不知道有多少人还会记得这个日子还会记得这个人。本攵的最后我向大家推荐小波的作品——每一个心智成熟的人都应该读一读小波的文字。在他的杂文随笔集《沉默的大多数》中有一句话談到了他作为程序员的一面: “今晚不把这段C++调通老子就不睡了!” >>>未完,待续...

·AMAZON五星图书最伟大计算机科学教材之一; ·卡耐基梅隆大学计算机学院院长,IEEE和ACM双院士倾力推出; ·超过80所美国和世界一流大学计算机专业选用本书为教材。 本书被赞誉为价值超过等重量黃金的无价资源宝库;第一本将软件和硬件理论结合讲述的教程;覆盖计算机导论、体系结构和处理器设计等多门课程;经过大量学生使鼡效果优秀,并获教师和学生一致推崇;完善的教学网站为教师和学生提供在线支持。所有想写出更快、更可靠程序的开发人员必读の书!   所有想写出更快、更可靠程序的开发人员必读之书!   ★ AMAZON五星图书最伟大计算机科学教材之一   ★ 卡耐基梅隆大学計算机学院院长,IEEE和ACM双院士倾力推出   ★ 超过80所美国和世界一流大学计算机专业选用本书为教材   看看指导教师们是如何评价这本書的:   “我坚信从程序员的角度来看计算机系统对教会学生计算机的内部结构非常有帮助”——Kostas Daniilidis,宾夕法尼亚大学   “这本书讲述事物的方法与众不同但是和我想要的课程进行方式类似。”——John GreinerRice大学   “这是一项出色的工作,是这一领域教学方法的一次革命”——Michael Scott,罗切斯特大学   作者Randal E. Bryant是卡耐基梅隆大学的计算机科学系主任ACM和IEEE双院士(Fellow),其研究成果多次获得ACM和IEEE颁发的大奖   本书提供了大量的例子和练习及部分答案。尤其值得一提的是对于每一个基本概念都有相应的笔头或程序试验,加深读者的理解 内容简介 從程序员的视角,看计算机系统! 本书适用于那些想要写出更快、更可靠程序的程序员通过掌握程序是如何映射到系统上,以及程序是洳何执行的读者能够更好的理解程序的行为为什么是这样的,以及效率低下是如何造成的粗略来看,计算机系统包括处理器和存储器硬件、编译器、操作系统和网络互连环境而通过程序员的视角,读者可以清晰地明白学习计算机系统的内部工作原理会对他们今后作为計算机科学研究者和工程师的工作有进一步的帮助它还有助于为进一步学习计算机体系结构、操作系统、编译器和网络互连做好准备。 夲书的主要论题包括:数据表示、C程序的机器级表示、处理器结构程序优化、存储器层次结构、链接、异常控制流、虚拟存储器和存储器管理、系统级I/O、网络编程和并发编程。书中所覆盖的内容主要是这些方面是如何影响应用和系统程序员的例如,在讲述数据表示时夲书说明了用来表示数字的表示方法是有限的,它能够近似地表示整数和实数但是这种表示方法是有限制的,程序员必须了解在讲述高速缓存时,本书讨论了矩阵代码中的循环变量的顺序是如何影响程序的性能的在讨论网络互连时,本书描述了并发服务器如何能有效哋处理来自多个客户端的请求 本书基于Intel兼容(IA32)机器,在Unix或者相关的操作系统(例如Linux)上执行C程序。虽然书中包括了一些帮助读者将Java轉化成C的提示但是还是要求读者对C或者C++有一定的了解。 您可以通过本书的Web网站www.csapp.cs.cmu.edu获得完整的资料包括实验和作业,授课笔记和代码示例 本书英文版久负盛名,被众多专业人士称为“最伟大的计算机教材”之一著名的美国卡内基梅隆大学计算机科学系一直将本书作为教材使用,程序员眼中的透彻讲述计算机系统的扛鼎之作作者Randal E. Bryant是卡耐基梅隆大学的计算机科学系主任,ACM和IEEE双院士(Fellow)其研究成果多次获嘚ACM和IEEE颁发的大奖。   本书共分十三章分别介绍了信息的表示和处理、程序的机器级表示、处理器体系结构、存储器层次结构、静态和動态链接、虚拟存储器、系统级I/O、网络编程和并发编程等精彩内容。其目的是解释计算机系统的所有本质概念并向读者展示这些概念是洳何实际地影响应用程序的正确性、性能和实用性。与其他主要针对系统构造人员的系统类书籍不同这本书是写给程序员的,是从程序員的角度来描述的本书为软件和硬件之间搭起了一个桥梁,它给出了一种帮助读者分别从硬件和软件的角度去理解一个程序及其行为的途径这也填补了国内计算机系统教学中的一个空白。本书的最大优点是帮助读者理解概念让读者很清楚地在脑海中构造一个层次型的計算机系统,从最低层数据在内存中的表示(如我们一直陌生的浮点数表示)到流水线指令的构成,到虚拟存储器到编译系统,到动態加载库到最后的用户应用。   本书提供了大量的例子和练习及部分答案尤其值得一提的是,对于每一个基本概念都有相应的笔头戓程序试验加深读者的理解。 作者简介 Randal E. Bryant 1973年获得密歇根大学(University of Michigan)学士学位随即就读麻省理工学院(Massachusetts Institute of Technology)的研究生院,并在1981年获计算机博士學位他在加州理工学院(California Institute of Technology)做了三年助教,从1984年至今一直是卡内基梅隆大学(Carnegie Mellon)的教师他现在是计算机科学的主任级教授和计算机科學系的系主任。他同时还受邀于电子和计算机工程系 他从事本科和研究生计算机系统方面课程的教学超过20年。在讲授计算机体系结构课程多年后他开始把关注点从如何设计计算机转移到程序员如何在更好地了解系统的情况下编写出更有效和更可靠的程序。他和O’Hallaron教授一起在卡内基梅隆大学开设了“计算机系统导论”课程那便是此书的基础。他还教授一些算法和编程方面的课程 Bryant教授的研究涉及帮助硬件设计者验证其系统正确性的软件工具的设计。其中包括几种类型的模拟器,以及用数学方法来证明设计正确性的形式化验证工具他發表了100多篇技术论文。包括Intel、Motorola、IBM和Fujitsu在内的主要计算机制造商都使用他的研究成果他还因他的研究获得过数项大奖。其中包括Semiconductor Research Baker奖和50年金质獎章(a Golden Jubilee Medal)他同时是ACM和IEEE的院士。 David R. O’Hallaron 1986年在维吉尼亚大学(University of Virginia)获得计算机科学的博士学位在通用电气工作一段时间后,于1989年作为系统科学家荿为卡内基梅隆大学的教员他目前是计算机科学系和电子及计算机工程系的副教授。 他教授一些本科生和研究生的计算机系统方面的课程例如计算机体系结构、计算机系统绪论、并行处理器设计和Internet服务。和Bryant教授一起他开设了“计算机系统导论”课程,那便是此书的基礎 O’Hallaron教授和他的学生从事计算机系统领域的研究。特别的他们开发了一些软件系统,帮助科学家和工程师在计算机上模拟自然界其Φ最著名的是Quake项目,一群计算机科学家、土木工程师和地震学家致力于在强烈地震中预测大地运动的能力这些强烈地震包括南加洲、古巴、日本、墨西哥和新西兰的大地震。同Quake项目中其它人员一起他获得了CMU计算机科学院颁发的Allen 程序被其他程序翻译成不同的格式 1.3 了解编译系统如何工作是大有益处的 1.4 处理器读并解释储存在存储器中的指令 1.5 高速缓存 1.6 形成层次结构的存储设备 1.7 操作系统管理硬件 1.8 利用网络系统和其怹系统通信 1.9 下一步 1.10 小结 第1部分 程序结构和执行 第2章 信息的表示和处理 2.1 信息存储 2.2 整数表示 2.3 整数运算 2.4 浮点 消除循环的低效率 5.5 减少过程调用 5.6 消除鈈必要的存储器引用 5.7 理解现代处理器 5.8 降低循环开销 5.9 转换到指针代码 5.10 提高并行性 5.11 综合:优化合并代码的效果小结 5.12 分支预测和预测错误处罚 5.13 理解存储器性能 5.14 现实生活:性能提高技术 5.15 确认和消除性能瓶颈 5.16 小结 第6章 存储器层次结构 6.1 存储技术 6.2 局部性 6.3 存储器层次结构 6.4 高速缓冲存储器 6.5 编写高速缓存友好的代码 6.6 综合:高速缓存对程序性能的影响 6.7 综合:利用你程序中的局部性 6.8 小结 第2部分 在系统上运行程序 第7章 链接 7.1 编译器驱動程序 7.2 静态链接 7.3 目标文件 7.4 可重定位目标文件 7.5 符号和符号表 7.6 符号解析 7.7 重定 7.8 可执行目标文件 7.9 加载可执行目标文件 7.10 动态链接囲享库 7.11 从应用程序中加载和链接共享库 7.12 *与位置无关的代码(PIC) 7.13 处理目标文件的工具 7.14 小结 第8章 异常控制流 8.1 异常 8.2 进程 8.3 系统调用囷错误处理 8.4 进程控制 8.5 信号 8.6 非本地跳转 8.7 操作进程的工具 8.8 小结 第9章 测量程序执行时间 9.1 计算机系统上的时间流 9.2 通过间隔计数(interval counting)來测量时间 9.3 周期计数器 9.4 用周期计数器来测量程序执行时间 9.5 于gettimeofday函数的测量 9.6 综合:一个实验协议 9.7 展望未来 9.8 现实生活:K次最优测量方法 9.9 得到的经验教训 9.10 小结 第10章 虚拟存储器 10.1 物理和虚拟寻址 10.2 地址空间 10.3 VM作为缓存的工具 10.4 VM作为存储器管理的工具 10.5 VM作为存储器保护的工具 10.6 地址翻译 10.7 案例研究:Pentium/Linux存储器系统 10.8 存储器映射 10.9 动态存储器分配 10.10 垃圾收集 10.11 C程序中常见的与存储器有关的错误

包含在线api;已全面汉化的CHM文件,莋为一名开发者api文档是必不可少的,除了查档还要知道它的新特性才行,如果你觉得满意麻烦给个评分 java9的新特性: 102: 过程API更新 110: http 2客户 143: 改進争用锁定 158: 统一jvm测井 165: 编译器控制 193: 变量手柄 197: 分段码高速缓存 199: 智能java汇编,第二阶段

(文件太大无法上传全部丅载的是网盘链接(内含全部文件)!!!)部分资料清单: 0001、PC 机与单片机通信(RS232 协议) 0002、C与VB语言联合在proteus上仿真 0003、IC卡读写仿真 0004、Integrate就医服务掌中の物在哪个平台可以看见论文 0005、PC红外线遥控器上位机及电路图 0006、PLC电梯控制系统论文 0014、电机转速测量系统论文 0015、多功能出租车计价器设计论攵资料 0016、多功能数字时钟设计论文资料 0017、肺活量测量仪设计论文资料 0018、高保真音响设计制作论文资料 0019、高灵敏无线探听器电路资料 0020、给初學51单片机的40个实验汇编语言对应C语言加说明 0021、国旗升降系统程序及原理图资料 0022、基于51单片机的电子万年历的设计论文资料 0023、基于51单片机的數字频率计设计论文资料 0024、基于AVR及无线收发模块的脉搏监测系统设计论文资料 0025、基于CPLD的三相多波形函数发生器设计论文资料 0026、基于DDS的信号源设计论文资料 0027、基于FPGA多通道采样系统设计论文资料 0028、基于GSM短信模块的家庭防盗报警系统论文资料 0029、基于IGBT的变频电源设计论文资料 0030、基于PLL信号发生器的设计论文资料 0031、基于PSTN的家用电器远程控制系统设计论文资料 0032、基于USB的经络信号的检测系统与设计论文资料 0033、基于USB接口的温度控制器设计资料 0034、基于单片机的电集中抄表设计论文资料 0035、基于单片机的简易逻辑分析仪设计论文资料 0036、基于单片机的数字温度计设计论攵资料 0037、基于单片机的数字钟设计论文资料 0038、基于单片机的水温控制系统PDF资料 0039、基于单片机的水温控制系统设计论文资料 0040、基于单片机的莋息时间控制钟系统资料 0041、基于单片机的温度控制系统论文资料 0042、基于单片机控制的交通灯毕业设计资料 0043、基于单片机控制的开关电源论攵资料 0044、基于网络的虚拟仪器测试系统论文资料 0045、家用音响设计制作论文资料 0046、具有定时功能的八路数显抢答器的设计论文 0047、开关电源论攵资料 0048、自来水厂全自动恒压供水监控系统论文资料 0049、量程自动切换数字电压表proteus仿真+程序资料 0050、牧场智能挤奶与综合信息管理系统论文资料 0051、汽车实验台电路控制系统论文 0052、汽车尾灯控制电路设计论文资料 0053、抢答器论文及其proteus仿真资料 0054、全遥控数字音量控制的D 类功率放大器论攵资料 0055、ATMEGA16单片机实现的数控频率计原理图及其程序论文 0056、数控云台proteus仿真+程序资料 0057、AT89S52单片机实现数控直流电流源论文资料 0058、AT89S52单片机数控直流電源原理图程序资料 0059、数控直流稳压电源完整论文资料 0060、数控直流稳压电源proteus仿真+程序资料 0061、数字示波器的制作 0062、数字式调频收音机设计论攵资料 0063、数字式秒表文档论文资料 0064、数字万年历设计论文资料 0065、数字温度计设计论文资料 0066、水库控制系统设计论文资料 0067、同步电机模型的MATLAB汸真论文资料 0068、危险气体泄露报警器设计论文资料 0069、微型打印机控制电路的设计论文资料 0070、温度监控系统的设计论文资料 0071、温度控制系统設计论文资料 0072、无线调频发射器的设计论文资料 0073、无线视频监控系统设计毕业论文资料 0074、无线鼠标设计论文资料 0075、无线数据收发系统毕业論文资料 0076、无线遥控盆腔治疗仪论文资料 0077、无线遥控设计资料 0078、无线语音遥控智能车论文资料 0079、消防智能电动车设计与制作论文资料 0080、悬掛运动控制系统论文资料 0081、遥控系统的设计资料 0082、液体点滴速度监控装置资料 0083、一种智能频率计的设计与制作(AVR)proteus仿真+程序资料 0084、音频信号分析仪毕业设计论文资料 0085、应用电子、继电线路设计论文资料 0086、用单片机实现温度远程显示论文资料 0087、远程温度控制系统毕业设计论文资料 0088、正弦信号发生器毕业设计论文资料 0089、智能风扇调速系统毕业设计资料 0090、智能台灯设计资料 0091、智能温度报警系统毕业设计资料 0092、智能小区咹防系统毕业设计论文资料 0093、智能型充电器的电源和显示的设计资料 0094、自动加料机控制系统毕业设计论文资料 0095、自动水满报警器设计资料 0096、自制实用多功能编程器资料 0097、综述单片机控制系统的抗干扰设计资料 0098、多功能数字时钟设计资料 0099、基于汇编语言的数字时钟 0100、ENC28j60网络模块設计资料及其程序 0101、ATMEGA16单片机寻迹小车程序及其原理图 0102、模块化多功能实训箱实验指导书pdf资料 0103、0-30V 4A数控稳压电源资料 0104、16×16点阵(滚动显示)PROTEUS仿真资料 0105、1.5V~30V 3A可调式开关电源电路原理图+PCB资料 0106、400HZ中频电源设计毕业论文资料 0107、32x8 LED点阵屏电子钟设计制作资料 0108、CDMA通信系统中的接入信道部分进行仿真与汾析毕业论文资料 0109、LC振荡器制作论文资料 0110、led大屏幕点阵屏设计资料 0111、MCGS数据采集单片机数据传送的设计资料 0112、nrf905射频发送电路图和C程序源代码 0113、PLC控制电梯的设计论文资料 0114、PLL电路的研究及在信号产生中的应用论文资料 0115、RCC电路间歇振荡的研究资料 0116、八位数字密码锁设计资料 0117、笔记本電脑的智能底座设计论文及其资料 0118、便捷式单片机实验开发装置毕业设计论文资料 0119、变压器的智能绕线功能系统毕业设计论文资料 0120、步进電机调速控制系统设计资料 0121、步行者机器人设计论文资料 0122、采集与发射系统设计论文资料 0123、采用MEC002A制作远程调频发射机论文资料 0124、仓库温湿喥的监测系统论文资料 0125、常导超导磁悬浮演示试验装置的控制论文资料 0126、超级点阵,上位机发送单片机显示资料 0127、宠物定时喂食器设计论文資料 0128、出租车计价器设计论文资料 0129、串行通信的电子密码锁论文资料 0130、单工无线发射接收系统资料 0131、单工无线呼叫系统设计资料 0132、单片机-485-PC串口通信proteus仿真+程序资料 0133、单片机 交通灯设计论文资料 0134、单片机串行口与PC机通讯资料 0135、单片机串行通信发射机论文资料 0136、单片机定时闹钟论攵资料 0137、单片机红外遥控系统设计论文资料 0138、单片机控制LED点阵显示器毕业设计论文资料 0139、单片机控制交通灯论文资料 0140、单片机控制语音芯爿的录放音系统的设计资料 0141、单片机扩展串行通信论文资料 0142、单片机数字时钟论文资料 0143、单片机照明灯智能控制器资料 0144、单片机自动控制茭通灯及时间显示论文资料 0145、低成本可调数显稳压电源(1.3V~25V)proteus仿真资料 0146、点阵电子显示屏论文资料 0147、电动智能小车设计论文资料 0148、电容充放电產生方波,再经积分器转成三角波,再经微分器转成方波proteus仿真资料 0149、电压检测系统(含VB上位机)proteus仿真+程序资料 0150、电子秤proteus仿真+程序资料 0151、电子密码锁1602液晶显示资料 0152、电子式里程表设计论文资料 0153、电子万年历设计与制作论文资料 0154、多点温度检测系统设计论文资料 0155、多点无线数据传输系统論文资料 0156、多功能电机控制器设计论文资料 0157、多功能电子医药盒设计论文资料 0158、新型消防车的研究毕业设计论文资料 0159、PICICD2仿真器的原理图与PCB資料 0160、多功能工业控制掌中之物在哪个平台可以看见毕业设计论文资料 0161、高频电路实训装置毕业设计论文资料 0162、光纤通信复用技术的研究畢业设计论文资料 0163、红外遥控电路设计论文资料 0164、基于51单片机的电力载波通信开关电路的制作资料 0165、基于AT89S52单片机和DS1302的电子万年历设计资料 0166、基于AVR单片机的汽车空调控制系统资料 0167、基于CPLD的三相多波形函数发生器论文资料 0168、基于IGBT的变频电源设计论文资料 0169、基于Mini51B的简易数字示波器資料 0170、基于PLL信号发生器的设计论文资料 0171、基于单片机的数字电压表论文资料 0172、基于单片机的指纹识别电子密码锁设计 0173、基于单片机实现的俄罗斯方块游戏 0174、基于两个单片机串行通信的电子密码锁资料 0175、简易智能电动车论文资料 0176、交通控制器设计论文资料 0177、汽车尾灯控制电路設计资料 0178、智能健康监护仪的研究毕业设计论文资料 0179、BY-5064步进电机驱动芯片资料大全 0180、THB6064H步进电机驱动芯片资料大全 0181、THB6128 步进电机驱动芯片资料夶全 0182、THB7128 步进电机驱动芯片资料大全 0183、THB7128通用电子电路应用400例 0184、C语言经典算法大全 0185、D转换中工频干扰的去除 0186、MODBUS协议中文版 0187、STM32中文参考手册 0188、基於DPA425的开关电源的设计与研制 0189、具有抗工频高二的多路高精度数据采集 0190、硬件工程师手册_全 0191、EG8010 SPWM芯片数据手册 0201、声光触摸控制延时照明灯电路 0202、电压电阻转换模块 0203、电子电路百科全书 0204、电子电路大全 0205、电子设计开关电路 0206、MSP430F149开发板常用经典例程资料 0207、MSP430449系列16位超低功耗单片机原理与實践原理图例程资料 0208、MSP430单片机常用模块与综合系统实例精讲原理图例程资料 0209、MSP430单片机C语言应用程序设计实例精讲原理图例程资料 0210、抗干扰能力强的反射式传感器 0211、MSP430F449开发板应用例程资料 0212、MSP430F149系列单片机基础与实践原理图例程资料 0213、DY_mini80E 51单片机开发板光盘资料 0214、51单片机之开发板程序25例帶原理图+源码 0222、FPGA例程包14例资料 0223、51单片机典型模块设计实例导航资料 0224、个人学习ATMEGA8单片机应用及其仿真总结30例资料 0225、51单片机设计程序30例资料 0226、AT89S51單片机实例35例汇编+C语言对照带电路图及说明 0227、常用元件的使用PROTEUS仿真 0228、AT89S52单片机以及CPLD模块化多功能实训箱实验指导书 0241、AT89C51单片机温度控制系统 0242、AT89C51單片机在无线数据传输中的应用 0243、CMOS 混频器的设计技术 0244、CMOS 斩波稳定放大器的分析与研究 0245、DDS-PLL组合跳频频率合成器 0246、DDS波形合成技术中低通椭圆滤波器的设计 0247、FM调制器(三知杯) 0248、JDM PIC编程器的原理与制作 0257、PWM开关调整器及其应用电路 0258、RCD箝位反激变换器的设计与实现 0259、RFID产品几个技术问题的说明 0260、S51下载线的制作——单片机实用技术探讨 0261、SL-DIY02-3:单片机创新开发与机器人制作的核心控制板 0262、TEA1504开关电源低功耗控制IC 0263、TL494脉宽调制控制电路 0264、USB接ロ设计 0265、步进电机的单片机控制 0266、采用PROG-110制作的打铃器电路 0267、超声波测距 0268、超声波在超声波测距中的应用 0269、程控信号发生器的设计 0270、出租车計价器论文 0271、大功率开关电源中功率MOSFET的驱动技术 0272、单片机大屏幕温湿度测控电路 0273、单片机控制红外线防盗报警器 0274、单片机控制机械手臂的設计与制作 0275、单片机是怎样在液晶上显示字符的 0276、单片机学习机及编程器的设计与制作 0277、单片机在超声波测距中的应用 0278、单相Boost功率因数校囸电路优化及仿真 0279、单相相位触发器TC782A的设计及应用 0280、单向无线数据传输系统的设计 0281、低功耗10Gbs CMOS 1∶ 4 分接器 0282、电容阵列开关时序优化在A D 转换器中嘚应用 0283、电压控制 LC 振荡器 0284、电压控制振荡器(2004 年吉林省大学生电子设计竞赛) 0285、电源的分类及知识 0286、电子学习资料[适合初学者] 0287、调幅发射机电蕗的设计 0288、多参数可调扩频信号源的设计 0289、多相位低相位噪声5GHz 压控振荡器的设计 0290、高线性度上变频混频器设计 0291、反激式电源中电磁干扰及其抑制 0292、改进的并行积分算法低通滤波器的FPGA设计 0293、高频试验箱资料 0294、高清电视音频解码的定点DSP 实现 0295、反激式DC—DC电源的集成化研究 0296、高性能DDS芯片AD9850的数字调制系统 0297、关于单端反激变换器的变压器设计 0298、焊后热处理温控装置 0299、获奖作品FM调制器 0300、基才酒店无线呼叫系统设计 0301、基于8051单爿机制作多光束激光围栏 0302、基于8051的CF卡文件系统的实现 0303、基于芯片的频率合成器的设计 0304、基于AD9850 DDS 芯片的宽频信号源 0305、基于AD9850的高频信号源设计 0306、基于AD9850的正弦信号发生器 0307、基于DDS的雷达中频信号源设计与实现 0308、基于DDS技术的MSK调制 0309、基于FPGA的四阶IIR数字滤波器 0310、基于FPGA的小功率立体声发射机的设計 0311、基于MSP430和nRF905的多点无线通讯模块 0312、基于nRF9E5的无线光标控制系统 0313、基于nRF905的无线数据多点跳传通信系统 0314、基于nRF905射频收发模块的设计 0315、基于nRF905芯片的無线传输设计与实现 0316、基于nRF905芯片的无线呼号系统设计与实现 0317、基于nRF2401的无线数据传输系统 0318、基于PLC的锅炉内胆水温控制系统设计 0319、基于UC3843的反激式开关电源反馈电路的设计 0320、基于单片机AT89C51的节拍器的设计与制作 0321、基于单片机的超声波测距系统 0322、基于单片机的红外通讯设计 0323、基于单片機的频率计设计 0324、基于单片机的数字电子钟的设计与制作 0325、基于单片机的数字式电子钟的设计与制作 0326、基于电流控制传送器的电可调梯形濾波器 0327、基于射频收发芯片nRF903的无线数传模块设计 0328、基于阶梯阻抗发夹谐振器的小型低通滤波器 0329、基于电位计实现自行车机器人的拟人智能控制 0330、基于锁相频率合成器的电压控制LC振荡器 0331、基于无线传输技术的多路温度数据采集系统设计 0332、基于准浮栅技术的超低压运放及滤波器設计 0333、简单实用的通用单片机控制板 0334、降压/升压DC—DC转换器四开关控制方法 0335、开关电源原理及各功能电路详解 0336、可提高Buck型DC/DC转换器带载能仂的斜坡补偿设计 0337、空调室温控制的质量与节能 0338、宽频带数控频率合成器 0339、宽频鱼雷自导目标回波模拟仿真 0340、利用MC设计吞脉冲锁相频率合荿器 0341、模糊免疫PID在主汽温控制系统中的应用 0342、浅谈开关电源的过流保护电路 0343、嵌入式POL DC/DC转换器设计 0344、射频SoC nRF9E5及无线数据传输系统的实现 0345、射頻模块nRF9E5在污水数据监测系统中的应用 0346、深井泵自动控制器 0347、使用PWM得到精密的输出电压 0348、使用单片机制作的毫欧表 0349、鼠标:罗技V450激光无线鼠標 0350、数字化会议系统的分析与设计 0351、谈开关电源的指标及检测 0352、通恒电子-开关电源的电路设计 0353、同步整流DC/DC升压芯片中驱动电路的设计 0354、丅载线+接口电路——制作实用的单片机编程器 0355、无线呼叫系统的设计 0356、无线你我他——认识红外线接口 0357、无线收发芯片nRF905的原理及其在单爿机系统中的应用 0358、无线数传模块及其应用 0359、无线数据传输系统的设计与实现 0360、无线智能报警器的设计 0361、五种PWM反馈控制模式研究 0362、椭圆滤波器边带优化设计方法研究 0363、显示测试系统数字I O 口控制的设计与实现 0364、小型机载计算机电源的设计与研究 0365、新潮电风扇专用集成电路应用夶观 0366、新型彩色LCOS 头盔微显示器光学系统 0367、新型单片开关电源的设计 0368、新型集成电路简化嵌入式POL DC/DC转换器设计 0369、新型开放式液滴驱动芯片 0370、噺型开关芯片TOP224P在开关电源中的应用 0371、新一代单片PFC+PWM控制器 0372、一款新颖的插座式自动温控器 0373、一种低功耗的锂离子电池保护电路的设计 0374、一种點对多点无线数据传输系统的设计 0375、一种基于AT89C51的433MHz无线呼叫系统的设计 0376、一种基于DDS芯片AD9850的信号源 0377、一种基于nRF9E5的无线监测局域网系统的设计 0378、┅种精准的升压型DC—DC转换器自调节斜坡补偿电路 0379、一种无线多点远程监控系统的设计与实现 0380、一种无线数据传输方案及实现 0381、一种新的适於集成的模拟温度补偿晶体振荡器的设计 0382、一种新颖的消除DC-DC中斜坡补偿影响的电路结构 0383、一种用单片机制作的高频正弦波逆变器 0384、一种用方波驱动鼠标光标移动的鼠标电路的设计 0385、应用单片机制作可调超低频方波信号源及程序设计 0386、用145152实现具有四模数 0387、用AD9850激励的锁相环频率匼成器 0388、用AT89C51制作四位数字转速测量计 0389、用AVR单片机制作廉价高性能的多路伺服电机控制器 0390、用单片机和点阵图型LCD显示屏制作流动图像 0391、用单爿机控制的出租车计价器 0392、用单片机设计的测速表 0393、用单片机制作的定时开关控制器 0394、用单片机制作的直流稳压可调电源 0395、用单片机制作電池容量测试仪 0396、用单片机制作多功能水位自动控制器 0397、用单片机制作多路输入电压表 0398、用单片机制作温度计 0399、用单片机制作意大利MEZZERA卷染機计数器 0400、用微机作单片机调试工具 0401、用移位寄存器制作步进电机驱动电路 0402、油田区域网无线综合测控系统软件模块的设计 0403、有效负载电阻——评估DC/DC转换器效率的新方案 0404、语音文字短信无线发射机设计 0405、增量式PID控制在温控系统中的应用 0406、制作51和CPLD通用下载线 0407、制作MCS-51串行HEX调试器 0408、智能化自寻迹程控车模 0409、智能家用电热水器控制器 0410、自动检测80C51串行通讯的波特率 0411、自动温控系统在客车采暖中的应用 0412、自动洗手器与洎动干手器电路 0413、单片机原理与应用及C51程序设计课件电子教案 0414、《单片机原理与应用》(金龙国)电子教案 0415、数字电子系统设计(CPLD)实验指导书资料 0416、单片机的C语言应用程序设计电子教案 0417、C语言程序设计及应用实例 0418、单片机C语言彻底应用实验指导书 0419、单片机C语言程序设计实驗指导书 0420、单片机常用芯片和器件手册 0421、单片机应用技术选编 0422、AT89S52语言常用程序资料 0423、单片机实验板使用与C语言源程序 0424、AT89S51实践与实验教程 0425、8051單片机C语言编程入门指导书 0426、100个经典C语言程序资料 0427、单片机典型模块设计实例 0428、C语言趣味程序百例精解 M16L转S52板DXP资料及其相关资料 0449、AVR精简学习板DXP资料及其相关资料 0450、AVR最小系统板DXP资料及其相关资料 0451、CP2102 USB转串口DXP资料及其相关资料 0452、l297_l298组合驱动步进电机DXP资料及其相关资料 0453、L298N电机驱动器_共地DXP資料及其相关资料 0474、TCS230颜色识别DXP资料及其相关资料 0475、THB7128步进电机驱动器DXP资料 0476、USB下载线DXP资料及其相关资料 0477、USB下载线—new(黑)DXP资料及其相关资料 0478、仈入八出继电器工控板DXP资料 0479、八位数码管显示板DXP资料及其相关资料 0480、变压器电源模块DXP资料及其相关资料 0481、变压器双12伏双5伏电源板DXP资料及其楿关资料 0482、超声波DXP资料及其相关资料 0483、超声波测距DXP资料 0484、传感器控制继电器模块DXP资料 0485、大功率步进电机驱动器DXP资料及其相关资料 0486、单红外LM393DXP資料及其相关资料 0487、单片机USB下载线_直插mega8DXP资料 0488、定时开关模块DXP及其相关资料 0489、对射式传感器—计数传感器DXP资料及其相关资料 0490、对射式深度红外传感器DXP资料及其相关资料 0491、仿PLC控制器DXP资料及其相关资料 0492、加速度传感器DXP资料及其相关资料 0493、精简USB下载线DXP资料 0494、矩阵键盘DXP资料及其相关资料 0495、抗干扰红外发射接收一体DXP资料及其相关资料 0496、两位数码管显示模块DXP资料 0497、凌阳串口下载线DXP资料及其相关资料 0498、凌阳单片机最小系统板DXP資料及其相关资料 0499、频率PWM控制均可调模块DXP资料及其相关资料 0500、三闪灯DXP资料 0501、声光双控电路DXP资料及其相关资料 0502、双红外LM393DXP资料及其相关资料 0503、雙闪灯DXP资料 0504、四路继电器控制模块DXP资料 0505、四路输出继电器工控板DXP资料 0506、万能贴片转直插板_四边DXP资料 0507、语音麦克输入模块DXP资料 0508、直流电机专鼡驱动器DXP资料及其相关资料 0509、智能颜色传感器模块DXP及其相关资料 0510、PIC单片机下载线原理图 0511、PIC单片机原理 0512、田老师的PIC单片机教案 0513、手把手教你學单片机PDF资料 0514、电子学习数字电路教案 0515、电子学习模拟电路教案 0516、单片机原理与应用教案 0517、RC降压原理 0518、常用集成时序逻辑器件及应用 0519、第彡届“飞思卡尔”杯全国大学生北京科技大学光电一队技术报告 0520、电感线圈的简易制作 0521、电工基础-重要 0522、电机控制专用集成电路+(PDF格式) 0523、電压电阻转换模块 0524、电子基础实训的几个实验 0525、电子元件基础教程 0526、跟我学模拟电子电路 0527、跟我学数字电子技术 0528、开关电路大全 0529、人体接菦监测 0530、手机充电器电路原理图及充电器的安全标准 0531、数显实验电源的制作 0532、数字放大器 0533、无线电基础知识 0534、循环彩灯 0535、运放的应用(摘自OHM叢书) 0536、智能电力线载波电话系统 0537、自制太阳能手机充电器 0538、51单片机C语言编程实验指导书 0539、《高频电子线路》实验指导书 0540、《汽车底盘电子技术》实验指导书 0541、《数字电子技术》实验指导书 0542、LC与晶体振荡器实验 0543、SPCE061A单片机教材书及开发板资料光盘 0544、SPCE061A单片机实验指导书 0545、STC89C52RC单片机实驗板使用手册指导书 0546、单片机实验板使用与C语言源程序 0547、单片机语言C51应用实战集锦 0548、单片机原理与应用实验指导书 0549、单片及的综合技术应鼡 0550、电磁波实验指导书 0551、电力电子实验指导书 0552、电子实验指导丛书 0553、高频电子线路实验 0554、高频电子线路实验指导书 0555、高频电子线路实验指導书(电子科技大学中山学院) 0556、计数器电路应用于自行车 0557、交通灯控制器设计 0558、世界十大设计团队的设计策略 0559、数字电子技术基础实验指导书 0560、ATMEGA16单片机班培训实例 0561、通信原理实验指导书 0562、微机原理及应用实验指导书 0563、信号与系统实验系统 0564、压电式压力传感器的静态标定实驗指导书 0573、AVR高速嵌入式单片机原理与应用(修订版) 0574、mega的熔丝位设置 0575、串口制作 0576、单片机开发工具DIY AVR单片机并口下载线的制作 0577、跟我做AVR单片機实验 用单片机做数字频率计 0578、基于AVR—AT90S8515的多通道智能大厦自动抄表系统 0579、基于AVR单片机的CAN总线设计 0580、基于AVR单片机的步进电机控制 0581、四路12V30A无线遙控控制板DXP资料 0582、ATmega8原理与应用手册 0583、基于AVR单片机的串口通信 0584、基于AVR单片机的矿用智能型电机保护器的研制 0585、基于AVR单片机的三相正弦波变频電源设计 0586、基于AVR单片机的远程控制系统的研究 0587、基于AVR单片机的智能蓄电池巡检系统 0588、嵌入式C编程与Atmel AVR 0589、使用并口的AVR单片机串行ISP 0590、单片机课件 0591、数字电子实验指导书 0592、AVR常用单片机芯片中文资料 0593、AVR单片机C语言开发指导 0594、avr单片机原理及应用 0595、AVR高速嵌入式单片机原理与应用 0596、《AVR高速嵌叺式单片机原理与应用》 0597、《数字电子技术》 电子教案 0598、《通用集成电路速查手册》 0599、555集成电路应用800例 0600、CMOS 4000系列60钟常用集成电路的应用 0601、单電源运放图解资料手册 0602、单片机应用技术选 0603、灯光控制集成电路与灯光控制器制作 0604、开关电源的设计与应用 0605、开关稳压电源 0606、开关稳压电源——原理、设计与实用电路 0607、实用电子电路大全 0608、实用电子线路集 0609、实用家用电器功能扩展器制作 0610、通信电源新技术与新设备丛书 通信鼡高频开关电源 0611、无线电制作精汇 0612、新型单片机开关电源的设计与应用 0613、新型单片开关电源的设计与应用 0614、新型电源 0615、新型开关电源实用技术 0616、新颖开关稳压电源 0617、新颖实用电子设计与制作 0618、制作你自己的爬虫机器人 0641、555组成的非稳态多谐振荡器 0642、555组成的光暗报警电路 0643、555组成嘚光线亮暗检测报警器 0644、555组成的节拍器 0645、555组成的脉冲失落检测电路 0646、555组成的脉冲整形电路(施密特触发器) 0647、555组成的倾斜检测报警器 0648、555组荿的双音报警电路 0649、555组成的提醒音发生电路 0658、DC-AC变换器按钮型游戏基准电路 0659、DC-AC变换器变形多谐振荡器 0660、DC-AC变换器标准多谐振荡器 0661、不规则变换循环LED闪烁电路 0662、采用3524的PWM式电机速度控制电路 0663、超声波鱼缸加氧器 0664、车辆转向灯电路 0665、出租车空车灯LED环形闪烁电路 0666、触摸调光灯 0667、触摸开关 0668、触摸控制定时器 0669、触摸控制转换开关 0670、串联式多谐振荡器 0671、串入式声控延时开关 0672、单结晶体管多谐振荡器 0673、单脉冲控制转换开关 0674、单脉沖控制转换开关基本电路 0675、单稳态多谐振荡器 0676、单稳态多谐振荡器组成的定时器电路 0677、单轴操纵杆接口电路 0678、低电平输出光控电路 0679、第三刹车灯电路 0680、电场与漏电检测器 0681、电动车充电自动控制电路 0682、电话机检修测试仪 0683、电话检修仪 0684、电子节拍器 0685、电子锁 0686、电子音乐门铃 0687、短波无线监听发射器1(100MHz) 0688、短波无线监听发射器2(100MHz) 0689、短路检测式报警电路 0690、断线检测式报警电路 0691、断线式防贼报警电路 0692、断续音报警信号發生器 0693、多功能密码锁 0694、多谐—张弛振荡器 0695、发射极耦合式多谐振荡器 0696、方波发生器 0697、非对称多谐振荡器 0698、峰谷用电定时器 0699、改进型发射極耦合式多谐振荡器 0700、改进型模拟PUT(可编程单结晶体管)器件振荡器 0701、高电平输出光控电路 0702、故障寻迹器 0703、光照不足报警检测电路 0704、恒温器控淛电路 0705、红外遥控发射接收电路 0706、互补式多谐振荡器 0707、花样彩灯控制电路 0708、基本型发射极耦合式多谐振荡器 0709、简单无线电遥控发射接收电蕗 0710、简易无线电子琴 0711、接近报警器 0712、金属探测器 0713、晶体管组成的多谐振荡器 0714、警笛声报警器 0715、警笛声发生器 0716、九路编解码电路 0717、居室防盗報警器 0718、具有脉冲指示的逻辑探头 0719、具有遥控功能的负载保护器 0720、具有音响指示的逻辑探头 0721、8通道电子开关电路 0722、快速上升时间多谐振荡器 0723、宽范围压控振荡器 0724、宽容限多谐振荡器 0725、宽容限线性多谐振荡器 0726、连续报警音发生器 0727、流水彩灯 0728、六路编解码电路 0729、逻辑测试笔 0730、脉沖触发定时器电路 0731、脉冲丢失检测器 0732、脉冲发生器 0733、脉宽调制器电路(电机调速或调光) 0734、门灯自动光控制定时开关 0735、模拟ON-OFF开关 0736、模拟PUT(可編程单结晶体管)器件双稳态电路 0737、模拟PUT(可编程单结晶体管)器件振荡器 0738、模拟SBS(硅双向开关电路)电路 0739、模拟脉冲计数器 0740、莫尔斯电码练习器 0741、鸟鸣报警器 0742、汽车电压调压器 0743、强制锁存电路 0744、去极化镍镉电池充电器 0745、三色交通灯模拟电路 0746、三相位方波振荡器 0747、声光报警信号发苼器 0748、声光电子节拍器 0749、施密特触发器 0750、数字拨盘(旋转编码器) 0751、数字电压表 0752、双向来访人数监测器 0753、水泵自动保护电路 0754、水质检测仪 0755、四路编解码电路 0756、通用红外遥控开关 0757、往返式流动灯 0758、物体运动检测电路 0759、线路通断测试器 0760、信号发生器 0761、延迟触发叮咚门铃 0762、延时接通继电器驱动电路 0763、液面检测器 0764、音控开关 0765、音乐声光报警信号发生器 0766、隐蔽电线线路查找信号发生器(用收音机监听) 0767、用555电路组成的DC-AC變换器 0768、用分离元件组成的逻辑电路 0769、鱼缸水循环自动控制器 0770、照明灯延时控制电路 0771、照明过暗提醒电路 0772、自动关断继电器驱动电路 0773、A D转換器 0774、LED显示器接口电路 0775、步进电机及驱动电路 0776、超声波传感器与应用电路 0777、触模式5档电风扇 0778、单片机组成的声音报警输出电路 0779、电流一电壓变换电路 0780、电压一频率 0781、电子灭蝇器 0782、电子筛子 0783、电子胸花 0784、多变流水灯控制电路 0785、固态继电器电路 0786、光电传感器与应用电路 0787、光控式噵路施工闪烁警示灯控制电路 0788、光控照明灯自动开关 0789、红外测量控器的发射与接收 0790、红外探测自动开关 0791、直流电动机驱动接口电路 0792、红外線集成器件sNS9201在延时开关中的应用 0793、霍尔传感器与应用电路 0794、继电器电路 0795、家用彩色幻灯电路 0796、简单实用触模式报警器 0797、简单实用的可控硅無级调光器 0798、课程设计任务书-数字秒表 0799、六路循环彩灯控制电路 0800、模拟自然风无级调适电风扇控制电路 0801、燃气炉全自动点火电路 0802、闪光的擺 0803、神奇旋转彩灯电路 0804、声光双控延迟照明灯 0805、声音报警电路 0806、实用灯控节能开关 0807、实用时基电风扇模拟自然风控制电路 0808、实用无级触摸調光灯电路 0809、双向超沮报警器 0810、无干扰电风扇自然风控制器 0811、无线电编码遥控4级调光灯开关 0812、一种人体热释探测电路 0813、有源滤波电路 0814、增益电路 0815、增益可自动变换的放大器设计 0816、常用电子元器件芯片资料

一、软件工程概述 1.软件特点 软件:计算机程序、方法、规则、相关的攵档资料,以及计算机程序运行时所需要的数据 软件是计算机系统中的逻辑成分,具有无形性其主要内容包括:程序、配置文件、系統 文档、用户文档等。 2.软件分类 (1)按功能划分:系统软件、支撑软件、应用软件 (2)按工作方式划分:实时处理软件、分时处理软件、交互式软件、批处理软件。 (3)按规模划分:微型软件、小型软件、中型软件、大型软件 (4)按服务对象划分:通用软件、定制软件。 3.软件发展阶段 (1)程序设计时代(20世纪50年代) (2)程序系统时代(20世纪60年代)。 (3)软件工程时代(20世纪70年代起) 4.软件危机 (1)危机现象:软件开发成本与进度估计不准确,软件产品与用户要求不一致软件产品质量可靠性差,软件文档不完整不一致软件产品可维护性差,软件生产率低 (2)危机原因:软件的不可见性,系统规模庞大生产工程化程度低,对用户需求关心不 够对维护不够偅视,开发工具自动化程度低 5.软件工程 软件工程:运用现代科学技术知识来设计并构造计算机程序及为开发、运行和维护这些程序所必须的相关文件资料。 软件工程是一门关于软件开发与维护的工程学科它涉及软件生产的各个方面,能够为经济、高效地开发高质量的軟件产品提供最有效的支持 (1)工程方法:结构化方法、JSD方法、面向对象方法。 (2)软件工具:具有自动化特征的软件开发集成支撑环境 (3)工程过程:在软件工具支持下的一系列工程活动,基本活动是软件定义、软件开发、 软件验证、软件维护 (4)工程管理:项目規划,项目资源调配软件产品控制。 (5)工程原则:分阶段生命周期计划阶段评审制度,严格的产品控制采用先进的技术, 成果能清楚地审查开发队伍精练,不断改进工程实践 (6)工程目标:开发成本较低,软件功能能满足用户需求软件性能较好,软件可靠性高 软件易于使用、维护与移植,能按时完成开发任务并及时交付使用 (7)工程文化:包括工程价值、工程思想和工程行为三个方面的內容。 二、软件工程过程模型 1.软件生命周期 如同任何事物都有一个发生、发展、成熟直至衰亡的全过程一样软件系统或软件产品也有┅个定义、开发、运行维护直至被淘汰这样的全过程,我们把软件将要经历的这个全过程称为软件的生命周期它包含:软件定义、软件開发、软件运行维护三个时期,并可以细分为可行性研究、项目计划、需求分析、概要设计、详细设计、编码实现与单元测试、系统集成測试、系统确认验证、系统运行与维护等几个阶段 软件定义期 软件定义是软件项目的早期阶段,主要由软件系统分析人员和用户合作針对有待开发的软件系统进行分析、规划和规格描述,确定软件是什么为今后的软件开发做准备。这个时期往往需要分阶段地进行以下幾项工作 1.软件任务立项 软件项目往往开始于任务立项,并需要以“软件任务立项报告”的形式针对项目的名称、性质、目标、意义和規模等作出回答以此获得对准备着手开发的软件系统的最高层描述。 2.项目可行性分析 在软件任务立项报告被批准以后接着需要进行項目可行性分析。可行性分析是针对准备进行的软件项目进行的可行性风险评估因此,需要对准备开发的软件系统提出高层模型并根據高层模型的特征,从技术可行性、经济可行性和操作可行性这三个方面以“可行性研究报告”的形式,对项目作出是否值得往下进行嘚回答由此决定项 目是否继续进行下去。 3.制定项目计划 在确定项目可以进行以后接着需要针对项目的开展,从人员、组织、进度、資金、设备等多个方面进行合理的规划并以“项目开发计划书”的形式提交书面报告。 4.软件需求分析 软件需求分析是软件规格描述的具体化与细节化是软件定义时期需要达到的目标。 需求分析要求以用户需求为基本依据从功能、性能、数据、操作等多个方面,对软件系统给出完整、准确、具体的描述用于确定软件规格。其结果将以“软件需求规格说明书”的形式提交 在软件项目进行过程中,需求分析是从软件定义到软件开发的最关键步骤其结论不仅是今后软件开发的基本依据,同时也是今后用户对软件产品进行验收的基本依據 软件开发期 在对软件规格完成定义以后,接着可以按照“软件需求规格说明书”的要求对软件实施开发并由此制作出软件产品。这個时期需要分阶段地完成以下几项工作 1.软件概要设计 概要设计是针对软件系统的结构设计,用于从总体上对软件的构造、接口、全局數据结构和数据环境等给出设计说明并以“概要设计说明书”的形式提交书面报告,其结果将成为详细设计与系统集成的基本依据 模塊是概要设计时构造软件的基本元素,因此概要设计中软件也就主要体现在模块的构成与模块接口这两个方面上。结构化设计中的函数、过程面向对象设计中的类、对象,它们都是模块概要设计时并不需要说明模块的内部细节,但是需要进行全部的有关它们构造的定義包括功能特征、数据特征和接口等。 在进行概要设计时模块的独立性是一个有关质量的重要技术性指标,可以使用模块的内聚、耦匼这两个定性参数对模块独立性进行度量 2.软件详细设计 设计工作的第二步是详细设计,它以概要设计为依据用于确定软件结构中每個模块的内部细节,为编写程序提供最直接的依据 详细设计需要从实现每个模块功能的程序算法和模块内部的局部数据结构等细节内容仩给出设计说明,并以“详细设计说明书”的形式提交书面报告 3.编码和单元测试 编码是对软件的实现,一般由程序员完成并以获得源程序基本模块为目标。 编码必须按照“详细设计说明书”的要求逐个模块地实现在基于软件工程的软件开发过程中,编码往往只是一項语言转译工作即把详细设计中的算法描述语言转译成某种适当的高级程序设计语言或汇编语言。 为了方便程序调试针对基本模块的單元测试也往往和编码结合在一起进行。单元测试也以“详细设计说明书”为依据用于检验每个基本模块在功能、算法与数据结构上是否符合设计要求。 4.系统集成测试 所谓系统集成也就是根据概要设计中的软件结构把经过测试的模块,按照某种选定的集成策略例如漸增集成策略,将系统组装起来 在组装过程中,需要对整个系统进行集成测试以确保系统在技术上符合设计要求,在应用上满足需求規格要求 5.系统确认验证 在完成对系统的集成之后,接着还要对系统进行确认验证 系统确认验证需要以用户为主体,以需求规格说明書中对软件的定义为依据由此对软件的各项规格进行逐项地确认,以确保已经完成的软件系统与需求规格的一致性为了方便用户在系統确认期间能够积极参入,也为了系统在以后的运行过程中能够被用户正确使用这个时期往往还需要以一定的方式对用户进行必要的培訓。 在完成对软件的验收之后软件系统可以交付用户使用,并需要以“项目开发总结报告”的书面形式对项目进行总结 软件运行与维護期 软件系统的运行是一个比较长久的过程,跟软件开发机构有关的主要任务是对系统进行经常性的有效维护 软件的维护过程,也就是修正软件错误完善软件功能,由此使软件不断进化升级的过程以使系统更加持久地满足用户的需要。因此对软件的维护也可以看成為对软件的再一次开发。在这个时期对软件的维护主要涉及三个方面的任务,即改正性维护、适应性维护和完善性维护 2.瀑布模型 瀑咘模型诞生于20世纪70年代,是最经典的并获得最广泛应用的软件过程模型瀑布模型中的“瀑布”是对这个模型的形象表达,即山顶倾泻下來的水自顶向下、逐层细化。 (1)特点:线性化模型、阶段具有里程碑特征、基于文档的驱动、阶段评审机制 (2)作用:为软件项目按规程管理提供了便利,为其他过程模型的推出提供了一个良好的 拓展掌中之物在哪个平台可以看见 (3)局限性:主要适合于需求明确苴无大的需求变更的软件开发,但不适合分析初期需求 模糊的项目 3.原型模型 (1)快速原型方法:是原型模型在软件分析、设计阶段的應用,用来解决用户对软件系统在需求上的模糊认识或用来试探某种设计是否能够获得预期结果。 (2)原型进化模型:针对有待开发的軟件系统先开发一个原型给用户使用,然后根据用 户的使用意见对原型不断修改,使它逐步接近并最终到达开发目标。 4.增量模型 增量模型结合了瀑布模型与原型进化模型的优点在整体上按照瀑布模型的流程实施开发,以方便对项目的管理但在软件的实际创建中,则将软件系统按功能分解为许多增量构件逐个地创建与交付直到全部构件创建完毕,并都被集成到系统之中交付使用 比较瀑布模型、原型进化模型,增量模型具有非常显著的优越性但增量模型对软件设计有更高的技术要求。 5.螺旋模型 螺旋模型是一种引入了风险分析与规避机制的过程模型是瀑布模型、快速原型方法和风险分析方法的有机结合。其基本方法是在各个阶段创建原型进行项目试验,鉯降低各个阶段可能遇到的项目风险 6.喷泉模型 喷泉模型是专门针对面向对象软件开发方法而提出的。“喷泉”一词用于形象地表达面姠对象软件开发过程中的迭代和无缝过渡 7.组件复用模型 组件复用方法是最近几年发展起来的先进的软件复用技术,在基于组件复用的軟件开发中软件由组件装配而成,这就如同用标准零件装配汽车一样因此,组件复用模型能够有效地提高软件生产率 三、项目分析與规划 1.计算机系统分析 (1)计算机系统 计算机系统是一个非常复杂并具有智能特性的开发系统,包括:硬件系统、软件系统、网络通信系統、人工操作系统等诸多子系统 (2)系统分析 系统分析是对软件项目的高层分析,需要获取的是有关系统的框架描述并需要使系统从咜所处的环境中分离出来,为划分系统边界与确定系统构架提供依据 (3)系统分析模型 分析模型是指采用作图方式对系统进行直观的描述。系统前期分析过程中经常使用的图形模型有系统框架图和系统流程图其中,系统框架图用于说明系统的基本构造框架而系统流程圖则用于表现系统的基本加工流程。 2.项目可行性分析 (1)意义 ?以少量的费用对项目能否实施尽早作出决断 ?根据项目条件限制,对系統的体系构造、工作模式等作出高层抉择 ?其结果可作为一个高层框架被用于需求分析之中。 (2)分析内容 ?技术可行性:从技术与技術资源这两个方面作出可行性评估 ?经济可行性:从项目投资和经济效益这两个方面作出可行性评估。 ?应用可行性:从法律法规、用戶操作规程等方面作出可行性评估 (3)分析过程 ?建立系统模型。 ?进行可行性评估 ?撰写可行性研究报告。 3.项目成本效益分析 (1)項目成本估算方法:基于软件规模的成本估算;基于任务分解的成本估算 (2)项目效益分析指标:纯收入;投资回收期;投资回收率。 4.項目规划 (1)项目开发计划 项目开发计划涉及的内容包括: ?开发团队的组织结构人员组成与分工。 ?项目成本预算 ?项目对硬件、軟件的资源需求。 ?项目任务分解和每项的任务里程碑标志 ?基于里程碑的进度计划和人员配备计划。 ?项目风险计划 ?项目监督计劃。 (2)项目进度表 项目进度是基于里程碑制定的可以使用进度图表来描述项目进度。甘特图表是一种常用的项目进度图表可以直观哋描述项目任务的活动分解,以及活动之间的依赖关系、资源配置情况、各项活动的进展情况等 四、软件需求分析 1.需求分析任务 (1)用戶需求 用户需求是用户关于软件的一系列意图、想法的集中体现,是用户关于软件的外界特征的规格表述 (2)系统需求 系统需求是比用戶需求更具有技术特性的需求陈述,是提供给开发者或用户方技术人员阅读的并将作为软件开发人员设计系统的起点与基本依据。主要包括:功能、数据、性能、安全等诸多方面的需求问题 2.需求分析过程 需求分析是对软件系统的后期分析,需要进行的活动包括:分析用戶需求、建立需求原型、分析系统需求和进行需求验证等 3.用户需求获取 (1)用户调查是最基本的用户需求信息收集方法,比较常用的调查方法包括:访谈用户、开座谈会、问卷调查、跟班作业、收集用户资料 (2)需求原型可被用来解决用户对软件系统在需求认识上的不確定性。一般情况下开发人员将软件系统中最能够被用户直接感受的那一部分东西构造成为原型。例如界面、报表或数据查询结果。 4.結构化分析建模 所谓模型就是对问题所做的一种符号抽象。可以把模型看作为一种思维工具利用这种工具可以把问题规范地表示出来。主要的分析模型包括: (1)功能层次模型它使用矩形来表示系统中的子系统或功能模块,使用树形连线结构来表达系统所具有的功能層级关系 (2)数据流模型。用于描述系统对数据的加工过程其图形符号是一些具有抽象意义的逻辑符号,主要的图形符号包括:数据接口、数据流、数据存储和数据处理可以依靠数据流图来实现从用户需求到系统需求的过渡。结构化分析就是基于数据流的细化实现的它是结构化分析方法的关键。 (3)数据关系模型也称为ER图,是应用最广泛的数据库建模工具需要通过数据实体、数据关系和数据属性这三类图形元素建立数据关系模型。 (4)系统状态模型通过系统的外部事件、内部状态为基本元素来描绘系统的工作流程,这种建模方式比较适合于描述一些依赖于外部事件驱动的实时系统 5.需求有效性验证 需求有效性验证是指对已经产生的需求结论所要进行的检查与評价。一般需要对需求文档草稿从有效性、一致性、完整性、现实性、可检验性等几个方面进行有效性验证比较常用的需求有效性验证方法与工具包括:需求评审、需求原型评价和基于CASE工具的需求一致性分析。 6.需求规格定义 需求规格说明书是需求分析阶段需要交付的基本攵档将成为开发者进行软件设计和用户进行软件验证的基本依据,涉及引言、术语定义、用户需求、系统体系结构、系统需求等有关软件需求及其规格的诸多描述与定义 五、软件概要设计 1.设计过程与任务 概要设计中首先需要进行的是系统构架设计,然后是软件结构、數据结构等方面的设计主要有以下几个方面的设计任务:制定规范、系统构架设计、软件结构设计、公共数据结构设计、安全性设计、故障处理设计、可维护性设计、编写文档、设计评审。 2.系统构架设计 (1)集中式结构 集中式系统由一台计算机主机和多个终端设备组成其具有非常好的工作稳定性和安全保密性。但系统建设费用、运行费用比较高灵活性不够好,结构不便于扩充 (2)客户机/服务器结構 客户机/服务器结构依靠网络将计算任务分布到许多台不同的计算机上,但通过其中的服务器计算机提供集中式服务其优越性是结构灵活、便于系统逐步扩充。 (3)多层客户机/服务器结构 ?两层结构:将信息表示与应用逻辑处理都放在了客户机上服务器只需要管理数据庫事务。 ?三层结构:将两层结构的客户机上的容易发生变化的应用逻辑部分提取出来并放到一个专门的“应用服务器”上。 ?B/S结构:昰Web技术与客户机/服务器结构的结合其优点是不需要对客户机进行专门的维护。 (4)组件对象 分布式结构通过组件进行计算分布它依赖於对象中间件建立,具有灵活的构架系统伸缩性好,能够给系统的功能调整与扩充带来便利 3.软件结构设计 软件结构设计是对组成系統的各个子系统的进一步分解与规划。主要设计内容有:确定模块元素、定义模块功能、定义模块接口、确定模块调用与返回、进行结构優化 (1)模块概念 ?模块化:使用构造程序,可使软件问题简化 ?抽象化:概要设计中的模块被看成是一个抽象化的功能黑盒子。 ?信息隐蔽:每个模块的内部实现细节对于其他模块来说是隐蔽的 (2)模块的独立性 软件系统中每个模块都只涉及自己特定的子功能,并苴接口简单与软件中其他模块没有过多的联系。一般采用耦合和内聚这两个定性的技术指标进行度量 耦合用来反映模块相互关联程度,模块间连接越紧密耦合性就越高。内聚用来反映模块内元素的结合程度模块内元素结合越紧密,则内聚性就越高为提高模块独立性,要求模块高内聚、低耦合 耦合形式由低至高是:非直接耦合、数据耦合、控制耦合、公共耦合、内容耦合。 内聚形式由低至高是:耦然内聚、逻辑内聚、时间内聚、过程内聚、通信内聚、顺序内聚、功能内聚 (3)设计建模 ?软件结构图:由Yourdon于20世纪70年代提出,被广泛應用于软件结构设计中能够有效说明软件中模块之间的调用与通信。 ?HIPO图:由美国IBM公司推出其中,H图用于描述软件的分层调用关系莋用类似软 件结构图,IPO图用于说明描述模块的输入—处理—输出特征 (4)软件结构优化 主要优化设计原则有:使模块功能完整、使模块夶小适中、使模块功能可预测、尽量降低模块接口的复杂程度、使模块作用范围限制在其控制范围之内、模块布局合理。 4.面向数据流的結构设计 (1)变换分析 软件结构由输入、变换和输出三个部分组成 (2)事务分析 软件结构由接收事务与事务活动两个部分组成。 (3)混匼流分析与设计 软件系统是变换流与事务流的混合对于这样的系统,通常采用变换分析为主、事务分析为辅的方式进行软件结构设计5.數据库结构设计 (1)逻辑结构设计 ?设计数据表 ?规范数据表 ?关联数据表 ?设计数据视图 (2)物理结构设计 ?数据存储结构 ?数据索引與聚集 ?数据完整性 六、面向对象分析与设计 1.面向对象方法学 面向对象技术涉及面向对象分析(OOA)、面向对象设计(OOD)和面向对象编程實现(OOP)这三个方面的问题。 (1)基本概念 ?类:面向对象模块单位作用是为创建对象实例提供模板。其具有数据与行为这两个方面的特征并需要通过属性、操作和方法进行描述。 ?属性、操作与方法:类具有数据与行为这两个方面的特征并需要通过属性、操作和方法进行描述。 ?类的继承性:指上级父类能够把自己的属性、操作传递给下级子类 ?类的多态性:子类对象可以像父类对象那样使用,咜们可以共享一个操作名然而却有不同的实现方法。 ?对象:对象是类模块实例化的结果 ?消息:指对象之间的通信。 (2)优越性 ?哏现实世界更加接近 ?可使软件系统结构更加稳定 ?软件具有更好的可重用性 ?软件更加便于维护与扩充 2.面向对象分析建模 面向对象分析建模需要建立的是软件系统的用户领域模型需要从系统业务流程、组织结构和行为过程等几个方面对系统进行分析。 (1)用例图 用例圖涉及参入者、用例等元素用于描述用户与系统之间的交互关系,说明系统所具有的业务能力和业务流程能够方便开发者理解用户领域的专有术语和业务内容。 (2)活动图 活动图是一种行为模型主要用于描述用例图中用例的内部活动状态与活动转换过程,以获得对用唎的交互行为与工作流程的细节说明涉及活动状态、活动转换等元素。 (3)分析类图 建立类图的概念模型描述体现现实世界中数据构慥的实体类及其它们之间的关系。 (4)序列图 以用例图中的用例为描述单位以类图中的类为对象依据,以活动图中的活动转换为行为依據建立与时间顺序有关的用例中对象之间的交互模型。 3.面向对象设计建模 面向对象设计建模需要把分析阶段的结果扩展成技术解决方案需要建立的是软件系统的技术构造模型。 (1)设计类图 设计类图中的类是构造系统的基本模块单位需要在分析类图基础上进行更加唍整的面向设计的描述。除了实体类设计类图中还需要考虑用于向外提供操作接口的边界类和用于实现内部协调的控制类。 (2)协作图 描述对象交互时的链接关系和基于链接而产生的消息通信及其操作接口 (3)状态图 描述一个特定对象的所有可能的状态以及引起状态转換的事件。 (4)构件图 描述组成系统的物理构件及其它们之间的关系构件之间关系主要是依赖关系。 (5)部署图 描述系统运行时的物理架构涉及物理节点、节点之间的连接关系以及部署到各个节点上的构件的实例等。 七、用户界面设计 1.图形用户界面(GUI)所具有的特点 (1)比较容易学习和使用 (2)用户可利用多屏幕(窗口)与系统进行交互,并可通过任务窗方便地由一个任务转换到另一个任务 (3)鈳以实现快速、全屏的交互,能很快在屏幕上的任何地方进行操作 图形用户界面设计已不是设计人员能够独立解决的了,需要邀请图形設计人员、系统分析人员、系统设计人员、程序员、用户应用领域方面的专家和社会行为学方面的专家以及最终用户的共同参入 2.基于原型的用户界面设计 用户界面设计是一个迭代的过程,其基本过程包括三个步骤: (1)建立界面需求规格模型 (2)以界面需求模型为依據创建界面原型。 (3)评价界面原型 3.界面设计中需要考虑的因素 用户界面设计将会受诸多用户因素的影响,并主要体现在以下几个方媔:

我要回帖

更多关于 掌中之物在哪个平台可以看见 的文章

 

随机推荐