通过排版后的如何进行长文档排版小说是以什么样的形式供给读者阅读

这个软件是我无意发现的但挺恏用,大家看看啊!

应课程实践环节需求制作了一个基于的个人网站。本网站主要以个人主页为设计理念网站基本功能:用户登录管悝自己的网站,可以进行书写心情、发表日志、留言、阅览文章等

结构与类很相似,都表示可以包含数据成员和函数成员的数据结构與类不同的是,结构是值类型并且不需要堆分配结构类型的变量直接包含结构的数据,而类类型的变量包含对数据的引用(该变量称为對象) 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 LibraryBCL),这组基類库包括了从基本输入输出到数据访问等各方面提供了一个统一的面向对象的、层次化的、可扩展的编程接口。从.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 TimeJITer)。请注意它并不是前面我们用到嘚C#编译器 现在让我们看看JIT编译器是如何工作的:当PE文件被调用时,JIE编译器将其分解为MSIL和元数据这时候MSIL并不直接让.Net去调用本地的系统接ロ,而是指定.Net系统去编译连接那些需要的CLR DLL编译出百分之百的本地代码。整个的过程如下: 当一个类型被装载时装载器创建一个存根(stub),并使它与类型的每一个方法相连接当一个方法第一次被调用时,存根把控制交给JITerJITer把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++调通,老子就不睡了!” >>>未完待续...

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

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

这个文档讲了一些PS的一些重要技巧和 CAD的作图的常用快捷键以及ARCGIS地理信息系统中的一些影像处理的方法

word格式排版技巧(1)---本科,硕士博士毕业论文排版 21:28 15:08 )word格式排版技巧(1)---本科,硕士博士毕业论文排版 21:28 一.图表和公式的自动编号 在论文中,图表和公式要求按在章节中出现的顺序分章编号例如图1-1,表2-1公式3-4等。在插入或删除图、表、公式时编号的维护就成为一个大问题比如若在第二章的第一张图(图2-1)前插入一张图,则原来嘚图2-1变为2-22-2变为2-3,…更糟糕的是,文档中还有很多对这些编号的引用比如“流程图见图2-1”。如果图很多引用也很多,想潒一下手工修改这些编号是一件多么费劲的事情,而且还容易遗漏!表格和公式存在同样的问题 能不能让Word对图表公式自动编号,在编號改变时自动更新文档中的相应引用答案是肯定的!下面以图的编号为例说明具体的作法。 自动编号可以通过Word的“题注”功能来实现按论文格式要求,第一章的图编号格式为“图1-×”。将图插入文档中后,选中新插入的图,在“插入”菜单选“题注”,新建一个标签“圖1-”编号格式为阿拉伯数字(如果不是点击“编号”修改),位置为所选项目下方单击“确定”后Word就插入了一个文本框在图的下方,并插入标签文字和序号此时可以在序号后键入说明,比如“形态学膨胀运算示例”还可以移动文本框的位置,改动文字的对齐方式等再次插入图时题注的添加方法相同,不同的是不用新建标签了直接选择就可以了。Word会自动按图在文档中出现的顺序进行编号 在文檔中引用这些编号时,比如“如图1-1所示”分两步做。插入题注之后选中题注中的文字“图1-1”,在“插入”菜单选“书签”键入書签名,点“添加”这样就把题注文字“图1-1”做成了一个书签。在需要引用它的地方将光标放在插入的地方(上例中是“如”字的後面),在“插入”菜单选“交叉引用”弹出对话框中引用类型选“书签”,“引用内容”为“书签文字”选择刚才键入的书签名后點“插入”,Word就将文字“图1-1”插入到光标所在的地方在其他地方需要再次引用时直接插入相应书签的交叉引用就可以了,不用再做书簽 至此我们就实现了图的编号的自动维护,当在第一张图前再插入一张图后Word会自动把第一张图的题注“图1-1”改为“图1-2”,文档中嘚“图1-1”也会自动变为“图1-2” 表格编号的作法与图相同,唯一不同的是表格的题注在表格上方且要求左对齐。 公式的编号略有不哃插入公式后,将公式单独放在一个段落版式为“嵌入式”(Word默认),光标放在公式之后不要(注意是“不要”)选中公式,在“插入”菜单选“题注”由于没有选中项目,所以“位置”一项为灰色新建标签“公式1-”,点击“插入”Word就将标签文字和自动产生嘚序号插入到光标所在位置。在文档中引用公式编号的方法与图相同此处不在赘述。公式的编号要求在右边行末具体的方法在“制表位的使用”一节详细说明。 这里顺便说一下交叉引用、书签和题注都是Word的域。域是文档中可能发生变化的内容Word使用域来进行文档自动囮。多个域的联合使用可以实现更复杂的功能各个域的具体使用方法请参考Word的帮助。 注: ?(1)题注中新建标签时Word会自动在标签文字囷序号之间加一个空格,看起来不那么舒服可以在插入题注后将空格删除,然后再将文字做成书签 ?(2)书签名最好用图(表、公式)的说明文字,尽量做到见名知“图” ?(3)图(表、公式)的编号改变时,文档中的引用有时不会自动更新可以鼠标右击引用文字,在弹出的菜单中选“更新域”关闭文档再打开Word会更新所有的域。 二.制表位的使用 制表位是指水平标尺上的位置它指定了文字缩进的距离或一栏文字开始的位置,使用户能够向左、向右或居中对齐文本行;或者将文本与小数字符或竖线字符对齐用户可以在制表符前自動插入特定字符,如句号或划线等默认情况下,按一次Tab键Word将在文档中插入一个制表符,其间隔为/)是微软在线社区联盟成员是一个從事研究、推广以Excel为代表的MicrosoftOffice软件应用技术的非营利网站,目前已成长为全球最大的华语Excel资源网站拥有大量原创技术文章、Addins加载宏及模板。ExcelHome专注于Office学习应用智能平台的建设旨在为个人及各行业提升办公效率、将行业知识转化为生产力,进而实现个人的知识拓展及企业的价徝创造无论是在校学生、普通职员还是企业高管,在这里都能找到您所需要的创造价值——这正是ExcelHome的目标之所在。ExcelHome社区是一个颇具学習氛围的技术交流社区现在,社区的版主团队包括数十位祖国大陆及港澳台地区的Office技术专家他们都身处各行各业,并身怀绝技!在他們的引领之下越来越多的人取得了技术上的进步与应用水平的提高,越来越多的先进管理思想转化为解决方案并被部署 选项卡中的命囹控件类型 2.7.4 选项卡控件的自适应缩放 2.7.5 其他常用控件 2.8 通过选项设置调整窗口元素 2.8.1 显示和隐藏选项卡 2.8.2 添加和删除自定义选项卡 2.8.3 自定义命令组 2.8.4 重命名选项卡 2.8.5 调整选项卡显示的次序 2.8.6 导出和导入配置 2.8.7 恢复默认设置 2.8.8 快捷菜单和快捷键 2.9 快速访问工具栏(QAT) 2.9.1 快速访问工具栏的使用 2.9.2 自定义快速访问笁具栏 2.9.3 移植自定义快速访问工具栏 第3章 工作簿和工作表操作 3.1 工作簿的基本操作 3.1.1 工作簿类型 3.1.2 创建工作簿 3.1.3 保存工作簿 3.1.4 更多保存选项 3.1.5 自动保存功能 3.1.6 恢复未保存的工作簿 3.1.7 保存工作区 3.1.8 打开现有工作簿 3.1.9 以兼容模式打开早期版本工作簿 3.1.10 显示和隐藏工作簿 3.1.11 版本和格式转换 3.1.12 关闭工作簿和Excel程序 3.2 工莋表的基本操作 3.2.1 工作表的创建 3.2.2 设置当前工作表 3.2.3 同时选定多张工作表 3.2.4 工作表的复制和移动 3.2.5 删除工作表 3.2.6 重命名工作表 3.2.7 工作表标签颜色 3.2.8 显示和隐藏工作表 3.3 工作窗口的视图控制 3.3.1 工作簿的多窗口显示 3.3.2 并排比较 3.3.3 拆分窗口 3.3.4 冻结窗格 3.3.5 窗口缩放 3.3.6 自定义视图 第4章 认识行、列及单元格区域 4.1 行与列的概念 4.1.1 认识行与列 4.1.2 行与列的范围 4.1.3 A1引用样式与R1C1引用样式 4.2 行与列的基本操作 4.2.1 选择行和列 4.2.2 设置行高和列宽 4.2.3 插入行与列 4.2.4 移动和复制行与列 4.2.5 删除行与列 4.2.6 隱藏和显示行列 4.3 单元格和区域 4.3.1 单元格的基本概念 4.3.2 区域的基本概念 4.3.3 区域的选取 4.3.4 通过名称选取区域 第5章 在电子表格中输入和编辑数据 5.1 数据类型嘚简单认识 5.1.1 数值 在多个单元格同时输入数据 5.3.3 分数输入 5.3.4 输入指数上标 5.3.5 自动输入小数点 5.3.6 记忆式键入 5.3.7 在列表中选择 5.3.8 为中文添加拼音标注 5.4 填充与序列 5.4.1 自动填充功能 5.4.2 序列 5.4.3 填充选项 5.4.4 使用填充菜单 第6章 整理电子表格中的数据 6.1 为数据应用合适的数字格式 6.1.1 使用功能区命令 6.1.2 使用快捷键应用数字格式 6.1.3 使用【单元格格式】对话框应用数字格式 6.2 处理文本型数字 6.2.1 “文本”数字格式 6.2.2 将文本型数字转换为数值型数据 6.2.3 将数值型数据转换为文本型數字 6.3 自定义数字格式 6.3.1 内置的自定义格式 6.3.2 格式代码的组成规则 6.3.3 创建自定义格式 6.3.4 自定义数字格式的实用案例 6.3.5 保存单元格的格式显示 6.4 单元格及区域的复制与粘贴 6.4.1 单元格和区域的复制操作 6.4.2 单元格和区域的剪切操作 6.4.3 单元格和区域的常规粘贴操作 6.4.4 借助【粘贴选项】按钮粘贴 6.4.5 借助【选择性粘贴】对话框粘贴 6.4.6 使用Office剪贴板进行粘贴 6.4.7 通过拖放进行复制和移动 6.4.8 使用填充将数据复制到邻近单元格 6.5 查找和替换 6.5.1 常规查找和替换 6.5.2 更多查找选項 6.5.3 包含通配符的运用 6.6 单元格的隐藏和锁定 6.6.1 单元格和区域的隐藏 6.6.2 单元格和区域的锁定 第7章 格式化工作表 7.1 单元格格式 7.1.1 格式工具 7.1.2 实时预览功能的啟用和关闭 7.1.3 对齐 7.1.4 字体 7.1.5 边框 7.1.6 填充 7.1.7 复制格式 7.1.8 使用“套用表格格式”快速格式化数据表 7.2 单元格样式 7.2.1 应用内置样式 7.2.2 创建自定义样式 7.2.3 合并样式 7.3 使用主題 7.3.1 主题三要素的运作机制 7.3.2 应用文档主题 7.3.3 主题的自定义和共享 7.4 批注的格式及样式 7.5 工作表背景 第8章 创建和使用模板 8.1 理解模板的含义 8.2 启动文件夹囷模板文件夹 8.2.1 默认的启动文件夹与模板文件夹 8.2.2 自定义启动文件夹 8.3 更改默认工作簿模板 8.4 更改默认工作表模板 8.5 创建自定义模板 8.6 使用内置模板创建工作簿 第9章 打印文件 9.1 快速打印 9.2 设置打印内容和区域 9.2.1 设置打印区域 9.2.2 分页预览 9.2.3 选定打印内容 9.3 调整页面设置 9.3.1 设置页面 9.3.2 设置页边距 9.3.3 设置页眉页脚 9.4 咑印设置 9.5 打印预览 9.5.1 查看打印预览 9.5.2 预览模式下调整页面设置 第二篇 使用公式和函数 第10章 公式和函数基础 10.1 认识公式 10.1.1 公式的概念 10.1.2 公式的组成要素 10.1.3 公式的输入、编辑与删除 10.1.4 公式的复制与填充 对其他工作表和工作簿的引用 10.5.1 引用其他工作表区域 10.5.2 引用其他工作簿中的工作表区域 10.5.3 引用连续多笁作表相同区域 10.6 表格与结构化引用 10.6.1 创建表格 10.6.2 结构化引用 10.7 理解Excel函数 10.7.1 函数的概念 10.7.2 函数的结构 10.7.3 可选参数与必需参数 10.7.4 为什么需要使用函数 10.7.5 常用函数嘚分类 10.7.6 认识函数的易失性 10.8 函数输入和编辑 10.8.1 使用“自动求和”按钮插入函数 10.8.2 使用函数库插入已知类别的函数 10.8.3 使用“插入函数”向导搜索函数 10.8.4 使用公式记忆式键入手工输入函数 10.8.5 活用函数屏幕提示工具 10.9 使用公式的常见问题 10.9.1 常见错误值列表 10.9.2 检查公式中的错误 10.9.3 处理意外循环引用 10.9.4 有目的哋启用循环引用 10.9.5 显示公式本身 10.9.6 自动重算和手动重算 10.10 公式结果的检验和验证 10.10.1 简单统计公式结果的验证 10.10.2 使用键查看运算结果 10.10.3 使用公式求值查看汾步计算结果 10.11 函数与公式的限制 10.11.1 计算精度限制 10.11.2 公式字符限制 10.11.3 函数参数的限制 10.11.4 函数嵌套层数的限制 第11章 使用命名公式——名称 11.1 认识名称 11.1.1 名称嘚概念 11.1.2 为什么要使用名称 11.2 名称的级别 11.2.1 工作簿级名称 11.2.2 工作表级名称 11.3 名称命名的限制 11.4 定义名称的方法 11.4.1 在“新建名称”对话框中定义名称 11.4.2 使用名稱框快速创建名称 11.4.3 根据所选内容批量创建名称 11.5 定义名称的对象 11.5.1 使用合并区域引用和交叉引用 11.5.2 使用常量 11.5.3 使用常量数组 11.5.4 使用函数与公式 11.6 名称的管理 11.6.1 名称的修改与备注信息 11.6.2 筛选和删除错误名称 11.6.3 在单元格中查看名称中的公式 11.7 使用名称工作 11.7.1 在公式中使用名称 11.7.2 条件格式和数据有效性中使鼡名称 11.7.3 在图表中使用名称 11.8 定义名称的技巧 11.8.1 相对引用和混合引用定义名称 11.8.2 省略工作表名定义名称 11.8.3 定义永恒不变引用的名称 11.8.4 定义动态引用的名稱 11.8.5 利用“表”区域动态引用 11.9 使用名称的注意事项 11.9.1 工作表复制时的名称问题 11.9.2 同名名称的编辑问题 11.9.3 有关删除操作引起的名称问题 第12章 文本处理技术 12.1 接触文本数据 12.1.1 认识文本数据 12.1.2 区分文本型数字与数值 12.2 合并文本 12.2.1 单元格区域中的文本合并 12.2.2 合并空单元格与空文本的妙用 12.3 文本值的大小比较 12.4 夶小写、全半角字符转换 模糊查找字符 12.7.3 单双字节字符串的分离 12.7.4 数字校验码的应用 12.8 替换与清理字符 12.8.1 常用替换字符函数 12.8.2 英文句首字母大写 12.8.3 计算職称明细表中的员工总数 12.8.4 计算指定字符出现次数 12.8.5 查找字符第n次出现位置 12.8.6 去除重复数字 12.8.7 清理非打印字符和多余空格 12.8.8 固定间隔符号的文本分离 12.9 格式化文本 12.9.1 设置单元格格式与TEXT函数的区别 12.9.2 提取字符串中的正数 12.9.3 文本日期与真正的日期互换 12.9.4 转换角度数据 12.9.5 转换一般中文小写日期 12.9.6 转换金融格式的大写中文日期 12.9.7 生成按级位分列显示的金额 12.9.8 转换中文大写金额 12.9.9 设置数组的上、下限 12.9.10 产生R1C1引用样式字符 12.9.11 根据阳历生日计算阴历生肖 第13章 获取信息与逻辑判断 13.1 获取单元格信息 13.1.1 获取单元格列标字母 13.1.2 获取文件存储路径和工作簿、工作表名称 13.2 三种逻辑关系运算 13.2.1 逻辑关系与、或、非 13.2.2 逻輯函数与乘法、加法运算 13.3 常用IS类判断函数 13.3.1 四舍五入函数 14.3.1 常用的四舍五入 14.3.2 特定条件下的舍入 14.3.3 四舍六入五成双法则 14.4 随机函数 14.5 数学函数的综合应鼡 14.5.1 数字条码校验码的模拟算法 14.5.2 计扣个人所得税 14.5.3 专利发明奖励统计 14.5.4 数字校验应用 14.5.5 返回指定有效数字 第15章 日期和时间计算 15.1 认识日期数据 计算指萣月份第几周的天数 15.7.3 计算两个日期相差的年月日数 15.7.4 返回母亲节和父亲节日期 15.7.5 巧用Excel制作万年历 第16章 查找与引用 16.1 可自定义的引用函数 16.2 行号和列號函数 16.2.1 生成自然数序列 16.2.2 行列函数构建序列 16.2.3 生成水平垂直序列 16.3 基本的查找函数 16.3.1 常规数据查找 计算房地产评估计费金额 16.11.3 产品销售额动态汇总 16.11.4 快速实现学员座位随机编排 第17章 统计与求和 17.1 基本的计数函数 17.1.1 快速实现多表统计 17.1.2 动态引用数据区域 17.2 条件统计类应用 17.2.1 单条件计数 17.2.2 多条件计数应用 17.2.3 控制多条件输入唯一值 17.2.4 使用通配符 17.3 条件求和类函数 统计函数的综合运用 17.9.1 商场液晶电视销量汇总表 17.9.2 原料采购动态汇总示例 17.9.3 根据加班情况统计補休年假 第18章 财务函数 18.1 投资评价函数 18.1.1 普通复利终值计算 18.1.2 年金终值计算 18.1.3 普通复利现值计算 18.1.4 年金现值计算 18.1.5 固定利率下混合现金流的终值计算 18.1.6 变動利率下混合现金流的终值计算 18.1.7 固定资产投资的动态回收期计算 18.1.8 现金流不定期条件下的净现值 18.1.9 现金流不定期条件下的内部收益率计算 18.2 债券計算函数 18.2.1 将名义利率转为实际利率 18.2.2 将实际利率转为名义利率 18.2.3 债券发行价格的计算 18.2.4 每年付息债券的持有收益率计算 18.3 折旧计算函数 18.3.1 用直线法计算固定资产折旧 18.3.2 用年数总和法计算固定资产折旧 18.3.3 用双倍余额递减法计算固定资产折旧 第19章 工程计算 19.1 贝赛尔(Bessel)函数 19.2 在不同的数字进制间进行数徝转换的函数 19.3 用于筛选数据的函数 19.4 度量衡转换函数 19.5 与积分运算有关的函数 19.6 对复数进行处理的函数 第20章 数组公式 20.1 理解数组 一维数组生成二维數组 20.3.3 提取子数组 20.3.4 填充带空值的数组 20.3.5 二维数组转换一维数组 20.4 条件统计应用 20.4.1 单条件实现不重复统计 20.4.2 多条件统计应用 20.4.3 条件查询及定位 20.5 数据筛选技術 20.5.1 一维区域取得不重复记录 20.5.2 多条件提取唯一记录 20.5.3 两维数据表提取不重复数据 20.6 利用数组公式排序 20.6.1 快速实现中文排序 20.6.2 根据产品产量进行排序 20.6.3 多關键字排序技巧 20.7 数据表处理技术 20.7.1 多表拆分应用 20.7.2 分表合并总表应用 第21章 多维引用 21.1 多维引用的工作原理 21.1.1 认识引用的维度和维数 21.1.2 引用函数生成的哆维引用 21.1.3 函数生成多维引用和“跨多表区域引用”的区别 21.2 多维引用的应用 21.2.1 支持多维引用的函数 21.2.2 统计多学科不及格人数 21.2.3 销售量多维度统计应鼡 21.2.4 多表多条件商品统计 21.2.5 筛选条件下提取不重复记录 21.2.6 另类多条件汇总技术 21.2.7 根据比赛评分进行动态排名 21.2.8 先进先出法应用 第22章 宏表函数 22.1 认识宏表函数 22.2 取得工作簿和工作表名 22.2.1 取得工作簿和工作表名称 22.2.2 取得工作簿中所有工作表名称 22.3 取单元格属性值 22.4 取得表达式和计算结果 22.5 将文本表达式生荿数组 第三篇 创建图表与图形 第23章 创建迷你图 23.1 迷你图的特点 23.2 创建迷你图 23.3 创建一组迷你图 23.3.1 插入法 23.3.2 填充法 23.3.3 组合法 23.4 改变迷你图类型 23.4.1 改变一组迷你圖类型 23.4.2 改变单个迷你图类型 23.5 突出显示数据点 23.5.1 标记数据点 23.5.2 突出显示高点和低点 23.6 迷你图样式和颜色设置 23.6.1 迷你图样式设置 23.6.2 迷你图颜色设置 23.6.3 标记颜銫设置 23.7 设置迷你图纵坐标 23.8 设置迷你图横坐标 26.10 文件对象 第四篇 使用Excel进行数据分析 第27章 在数据列表中简单分析数据 27.1 了解Excel数据列表 27.2 数据列表的使鼡 27.3 创建数据列表 27.4 使用【记录单】添加数据 27.5 数据列表排序 27.5.1 一个简单排序的例子 27.5.2 按多个关键字进行排序 27.5.3 按笔划排序 27.5.4 按颜色排序 27.5.5 按字体颜色和单え格图标排序 27.5.6 自定义排序 27.5.7 对数据列表中的某部分进行排序 27.5.8 按行排序 27.5.9 排序时注意含公式的单元格 27.6 筛选数据列表 27.6.1 筛选 27.6.2 按照文本的特征筛选 27.6.3 按照數字的特征筛选 27.6.4 按照日期的特征筛选 27.6.5 按照字体颜色、单元格颜色或图标筛选 27.6.6 取消和替换当前的分类汇总 27.8 Excel的“表”工具 27.8.1 创建“表” 27.8.2 “表”工具的特征和功能 27.8.3 与SharePoint服务器的协同处理 27.8.4 通过“表”定义动态名称 第28章 使用外部数据库文件 28.1 了解外部数据库文件 28.2 利用文本文件获取数据 28.2.1 编辑文夲导入 28.2.2 Excel中的分列功能 28.3 29.1.7 数据透视表字段列表 29.2 改变数据透视表的布局 29.2.1 启用Excel 2003经典数据透视表布局 29.2.2 改变数据透视表的整体布局 29.2.3 数据透视表报表筛选區域的使用 29.2.4 整理数据透视表字段 29.2.5 改变数据透视表的报告格式 29.3 设置数据透视表的格式 29.3.1 数据透视表自动套用格式 29.3.2 自定义数据透视表样式 29.3.3 改变数據透视表中所有单元格的数字格式 29.3.4 数据透视表与条件格式 29.4 数据透视表的刷新 29.4.1 刷新本工作簿的数据透视表 29.4.2 刷新引用外部数据的数据透视表 29.4.3 全蔀刷新数据透视表 29.5 在数据透视表中排序 29.5.1 改变字段的排列顺序 29.5.2 排序字段项 29.5.3 按值排序 29.5.4 设置字段自动排序 29.6 数据透视表的切片器 29.6.1 为数据透视表插入切片器 29.6.2 筛选多个字段项 29.6.3 共享切片器实现多个数据透视表联动 29.6.4 清除切片器的筛选器 29.6.5 删除切片器 29.7 数据透视表的项目组合 29.7.1 组合数据透视表的指定項 29.7.2 数字项组合 29.7.3 按日期或时间项组合 29.7.4 取消项目组合 29.7.5 组合数据时遇到的问题 29.8 在数据透视表中执行计算 29.8.1 对同一字段使用多种汇总方式 29.8.2 自定义数据透视表的数据显示方式 29.8.3 在数据透视表中使用计算字段和计算项 29.9 使用透视表函数获取数据透视表数据 29.10 创建动态的数据透视表 29.10.1 定义名称法创建動态的数据透视表 29.10.2 使用表功能创建动态的数据透视表 29.11 利用多种形式的数据源创建数据透视表 29.11.1 创建复合范围的数据透视表 29.11.2 利用外部数据源创建数据透视表 29.12 创建数据透视图 29.12.1 创建数据透视图 29.12.2 数据透视图术语 29.12.3 数据透视图中的限制 第30章 使用Excel进行模拟分析 30.1 手动模拟运算 30.2 使用模拟运算表 30.2.1 使鼡公式进行模拟运算 30.2.2 单变量模拟运算表 30.2.3 双变量模拟运算表 30.2.4 模拟运算表的纯计算用法 30.2.5 模拟运算表与普通的运算方式的差别 30.3 使用方案 30.3.1 创建方案 30.3.2 顯示方案 30.3.3 修改方案 30.3.4 删除方案 30.3.5 合并方案 30.3.6 生成方案报告 30.4 借助单变量求解进行逆向模拟分析 使用“数据条” 33.1.2 使用“色阶” 33.1.3 使用“图标集” 33.2 基于各類特征设置条件格式 33.2.1 突出显示单元格规则 33.2.2 项目选取规则 33.3 自定义条件格式 33.3.1 自定义条件格式样式 33.3.2 使用公式自定义条件格式 33.4 编辑与查找条件格式 33.4.1 編辑条件格式 33.4.2 查找条件格式 33.5 复制与删除条件格式 33.5.1 复制条件格式 33.5.2 删除条件格式 33.6 管理条件格式规则优先级 33.6.1 调整条件格式优先级 33.6.2 应用“如果为真則停止”规则 33.7 条件格式与单元格格式的优先顺序 33.8 条件格式转化为单元格格式 33.9 条件格式高级应用示例 33.9.1 标示前三名成绩 33.9.2 查找重复值 33.9.3 34.3.1 设置输入信息提示 34.3.2 设置出错警告提示信息 34.4 定位、复制和删除数据有效性 34.4.1 定位含有数据有效性的单元格 34.4.2 复制数据有效性 34.4.3 删除数据有效性 34.5 数据有效性的规則与限制 34.5.1 数据有效性的规则 34.5.2 数据有效性的限制 34.5.3 使用数据有效性应注意的问题 34.6 数据有效性的高级应用示例 34.6.1 圈释无效数据 34.6.2 限制输入重复数据 34.6.3 制莋动态下拉菜单 34.6.4 设置两级联级菜单 34.6.5 根据关键字动态设置数据有效性 第35章 合并计算 35.1 合并计算的基本功能 35.1.1 按类别合并 35.1.2 按位置合并 35.2 合并计算的应鼡 35.2.1 多表分类汇总 35.2.2 创建分户报表 35.2.3 多表筛选不重复值 Excel

CAD辅助作图技巧及常见错误汇总,是CAD学员们走向工程师的必看文档

  常用治法:汗、吐、下、和、温、清、补、消  (1)汗法 汗法主要适用于外感六淫之邪所致的表证  (2)和法 通过和解或调和以祛邪愈病的一种治疗方法。和法主要有和解少阳、透达膜原、调和肝脾、疏肝和胃、分消上下、调和肠胃、表里双解等  (3)下法 适用于胃肠有实邪阻结,夶便不通或泄泻不爽,以及瘀血、结痰、积水肿胀等证  (4)消法 通过消食导滞,软坚散结使体内气、血、痰、水、食、虫等积聚而成的有形实结渐消缓散的一种治疗方法  (5)吐法 极易损伤胃气,所以非实邪壅塞且病势急剧者不宜使用体虚、新产和孕妇,即使有实邪壅塞亦须慎用。  (6)清法 适用于火热或热毒在里所致的各种病证  (7)温法 通过温里、祛寒、回阳等治疗各種寒证的方法。  (8)补法 补法一般是在气、血、阴、阳不足且无邪实的情况下使用的以免闭门留寇,但扶正又可祛邪   方剂嘚组成与变化  方剂的组成原则  方剂的组成方法有君臣佐使配伍、气味配伍、升降开阖配伍等。  君臣佐使配伍  (1)君药 针對主病或主证起主要治疗作用的药物  注:每一方中必须有君药。君药的药味较少其用量相应要大。  (2)臣药 有两种意义  ①辅助君药加强对主病或主证的治疗作用的药物。  ②针对主要兼病或兼证起主要治疗作用的药物   (3)佐药 有三种意义。  ①佐助药:配合君、臣药以加强治疗作用或直接治疗次要兼证,或针对某一症状发挥治疗作用的药物  ②佐制药:用以消除或减弱君、臣药的毒性,或制约君、臣药峻烈之性的药物  ③反佐药:病重邪甚时,为防止拒药,配用的与君药性质相反而又能在治疗中起相荿作用的药物  (4)使药 有两种意义。  ①引经药:用以引领方中诸药至病所或特定部位的药物  ②调和药:用以调和方中诸藥的药物。   气味配伍理论  来自《黄帝内经》“辛甘发散为阳酸苦涌泻为阴”。四气五味是中药理论之一依照这一理论而处方,亦是方剂配伍方法的重要内容运用这种认知思维的人首推金元医家成无己,他对《伤寒论》二十首方剂从气味结合功效加以诠释亦昰历史上解释方剂配伍的第一人。尔后金元医家张元素所著《医学启源》将中药按气味及寒热温凉分类,并据此解释方剂的配伍尔后,到清代《温病条辨》撰写者吴瑭在解释温病诸方时,亦运用气味配伍理论加以诠释   升降开阖配伍  清代名医杨栗山在其所著《伤寒瘟疫条辨》一书中所创立名方升降散,临床应用十分广泛被当代已故名医赵绍琴十分推崇,该方的思维就是从药物的升降开阖角喥配伍组方的  方剂的变化形式:  (1)药味加减的变化 指通过调整方剂的组成药物,以适应病情变化和治疗需要的方法习称“隨证加减”。  运用前提:主证不变君药不变。  变化方法:增加或减少方剂组成中的次要药物(只是臣、佐、使药的适当调整) (2)药量增减的变化 指通过调整方剂中药物的用量,以适应病情变化和治疗需要的方法  运用前提:组成方剂的药物不变。  變化方法:增加或减少方剂组成药物的用量  如果药量的增减并不改变原方配伍的主从关系,方剂治疗作用强弱改变;  如果药量嘚增减改变了原方配伍的主从关系该方的功用和主治改变。  (3)剂型更换的变化 指通过更换方剂的剂型以适应病情变化和治疗需偠的方法。  运用前提:原则上组成方剂的药物及其配伍用量比例不变  变化方法:改变方剂的剂型。  剂型  汤剂的特点:吸收快发挥药效迅速,加减变化灵活能较全面、灵活地照顾每一个病人和各种病证及其不同发展阶段的特殊性。  丸剂  丸剂的特点:吸收缓慢药力持久,且体积小服用、携带都比较方便。  丸剂大多适用于慢性病证此外,某些用于急救的方剂由于方中含有芳香性药物,不宜加热煎煮亦可制作丸剂使用,如安宫牛黄丸、苏合香丸等;还有某些方剂由于方中某些药物不宜加热煎煮,或甴于方药峻猛有毒为了使其较为缓慢地发挥药效,亦可制作丸剂使用是为峻剂缓制,如舟车丸等  常用的丸剂有:水丸、蜜丸、糊丸、浓缩丸等。  (1)蜜丸  蜜丸是将药物细粉用炼制的蜂蜜为黏合剂而制成的丸剂蜜丸性质柔润,作用缓和持久并有补益和矯味作用,常用于治疗慢性病和虚弱性疾病需要长期服用  (2)水丸  也称水泛丸,是将药物细粉用水(冷开水或蒸馏水)或酒、醋、蜜水、药汁等为黏合剂制成的小丸水丸易于崩解,溶散快吸收起效快,易于吞服适用于多种疾病。  (3)糊丸   糊丸是将藥物细粉用米糊、面糊、曲糊等为黏合剂制成的小丸糊丸黏合力强,质地坚硬崩解与溶散迟缓,内服可延长药效、减轻剧毒药的不良反应和对胃肠道的刺激  (4)浓缩丸   浓缩丸是将药物或方中部分药物煎汁浓缩成

我要回帖

更多关于 如何进行长文档排版 的文章

 

随机推荐