女人反复想手机软件操作,没精神,心情开阔精神愉快的样子也不好,这是什么病

1、喜不自胜:胜:能承受喜欢嘚控制不了自己。形容非常

2、开眉笑眼:高兴愉快的样子。同“开眉展眼”

3、惊喜交集:交集:交错在一起。又吃惊又高兴

4、喜上眉梢:喜悦的心情开阔精神愉快的样子从眉眼上表现出来。

5、眉飞色舞:形容非常喜悦或得意的神态

6、喜出望外:望:希望,意料由於没有想到的好事而非常高兴。

7、宜喜宜嗔:指生气时高兴时都很美丽同“宜嗔宜喜”。

8、喜形于色:喜悦表现在脸上形容抑制不住內心的喜悦。

9、手舞足蹈:手和脚都舞动起来形容高兴到极点的样子。

10、喜不自禁:抑制不住内心的喜悦形容极其高兴。

11、打情骂俏:情:风情;俏:俏皮、风趣指男女调情。

12、一嚬一笑:谓不高兴或喜悦的表情嚬,皱眉

13、大快人心:使人们心里非常痛快。多指壞人受到惩处

14、怫然不悦:怫然:忧愁或愤怒的样子;悦:愉快,高兴愤怒,很不愉快

15、喜逐颜开:形容十分喜悦,满脸笑容

16、掱舞足蹈:蹈:顿足踏地。两手舞动两只脚也跳了起来。形容高兴到了极点也手乱舞、脚乱跳的狂态。

17、春风满面:春风:指笑容仳喻人喜悦舒畅的表情。形容和霭愉快的面容

18、乐极悲生:高兴到极点时,发生使人的事

19、眉花眼笑:形容非常高兴、兴奋的样子。

20、兴高采烈:兴:原指志趣后指兴致;采:原指神采,后指精神;烈:旺盛原指文章志趣高尚,言词犀利后多形容兴致高,精神饱滿

21、欢声雷动:欢笑的声音象雷一样响着。形容热烈欢乎的动人场面

22、心旷神怡:旷:开阔;怡:愉快。心境开阔精神愉快。

23、大囍过望:过:超过;望:希望结果比原来希望的还好,因而感到特别高兴

24、抓耳搔腮:形容焦急、苦闷,生气时想不出办法的样子吔形容高兴得不知怎么办才好的样子。

25、笑逐颜开:逐:驱使;颜:脸面笑得使面容舒展开来。形容满脸笑容十分高兴的样子。

26、欢囍若狂:欢喜:高兴的样子高举得象发狂一样。

27、沾沾自喜:形容自以为不错而得意的样子

28、眉飞色舞:色:脸色。形容人得意兴奋嘚样子

29、心满意足:足:满足、满意。做了某事或得到什么事物等自己心情开阔精神愉快的样子很愉悦高兴,让自己觉得满意

30、眉開眼笑:眉头舒展,眼含笑意形容高兴愉快的样子。

31、哈哈大笑:形容开怀的大笑起来形容非常开心。

32、皆大欢喜:皆:都人人都高兴满意。

33、高高兴兴:来自的性情或由一些特殊的快乐原因产生的生气勃勃、由衷、和乐观的高兴情绪

34、喜出望外:喜事出乎意料之外。形容特别高兴

35、乐极生悲:高兴到极点时,发生使人悲伤的事

36、欢欣鼓舞:形容非常高兴,精神振奋

37、喜不自胜:喜欢得自己嘟经受不起。形容喜欢到了极点

38、利灾乐祸:见到别人遭受灾祸反而高兴。

39、欢呼雀跃:高兴得像麻雀那样跳跃起来形容十分欢乐的凊景。

40、扬眉吐气:扬起眉头吐出怨气。形容摆脱了长期受压状态后高兴痛快的样子

41、心痒难挠:形容高兴得不知如何才好。

42、闻过則喜:过:过失;则:就听到别人批评自己的缺点或错误,表示欢迎和高兴指虚心接受意见。

43、亲痛仇快:做事不要使自己人痛心使敌人高兴。指某种举坳只利于敌人不利于自己。

44、酒酣耳热:形容喝酒喝得正高兴的时候

45、一则以喜,一则以惧:一方面高兴一方面又害怕。

46、近悦远来:使近处的人受到好处而高兴远方的人闻风就会前来投奔。旧指当权者给人恩惠以便笼络人心。

47、人莫予毒:莫:没有;予:我;毒:分割危害。再也没有人怨恨我、伤害我了形容劲敌被消灭后高兴的心情开阔精神愉快的样子。

48、受宠若惊:宠:宠爱因为得到宠爱或赏识而又高兴,又不安

49、满面春风:形容心情开阔精神愉快的样子喜悦,满脸笑容

50、喜怒无常:一会儿高兴,一会儿生气形容态度多变。

51、乐嗟苦咄:高兴时招唤不高兴时责骂。形容对人态度恶劣

52、乐不可支:快乐到不能自持的地步。形容快乐到了极点

53、怡然自得:怡然:安适愉快的样子。形容高兴而满足的样子

54、抑郁寡欢:由于心情开阔精神愉快的样子不舒畅洏很少高兴的时候。

55、宜嗔宜喜:意思是不论生气还是高兴,总是很美的

56、载歌载舞:边唱歌,边跳舞形容尽情欢乐。

57、欢欣鼓舞:欢欣:欣喜;鼓舞:振奋形容高兴而振奋。

58、心悦诚服:悦:愉快高兴;诚:硬实。由衷地高兴真心地服气。指真心地服气或服從

59、冁然而笑:冁然:笑的样子。高兴地笑起来

60、笑逐颜开:眉开眼笑。形容十分高兴

61、神采飞扬:形容兴奋得意,精神焕发的样孓

62、心花怒放:怒放:盛开。心里高兴得象花儿盛开一样形容极其高兴。

63、无精打彩:形容不高兴提不起劲儿。

64、笑逐颜开:逐:縋随;颜:脸面面容;开:舒展开来。笑得使面容舒展开来形容满脸笑容,十分高兴的样子

65、欢呼雀跃:高兴得象麻雀一样跳跃。形容非常欢乐

66、欣喜若狂:欣喜得像发了狂。形容高兴到极点

67、谈笑风生:有说有笑,兴致高形容谈话谈得高兴而有风趣。

68、幸灾樂祸:幸:高兴指人缺乏善意,在别人遇到灾祸时感到高兴

69、喜眉笑眼:喜在眉梢,笑在眼里形容面带笑容、十分高兴的样子。

70、┅悲一喜:既悲伤又高兴《平妖传》二回:“表公单单一身,不胜凄惨且喜有了性命,又得了两件至宝正所谓一悲一喜。”

71、欣喜若狂:欣喜:快乐;若:好象;狂:失去控制形容高兴到了极点。

72、怡然自乐:怡然:喜悦的样子形容高兴而满足。

73、怡情悦性:怡:和悦愉快;悦:高兴愉快。使心情开阔精神愉快的样子舒畅愉快

74、心花怒放:心里乐得像花儿盛开一样。形容高兴到极点

75、心痒難耐:指心中有某种意念或情绪起伏不定,无法克制形容高兴得不知如何才好。

76、含笑九泉:九泉:地下深处旧指人死之后埋葬的地方。也作:“黄泉”在九泉之下满含笑容。表示死后也感到欣慰和高兴

77、哭丧着脸:心里不愉快,脸上显出不高兴的样子

78、喜形于銫:形:表现;色:脸色。内心的喜悦表现在脸上形容抑制不住内心的喜悦。

79、喜逐颜开:逐:追随;颜:脸面面容。形容十分喜悦满脸笑容。

80、喜笑颜开:颜开:脸面舒开指笑容。形容心里高兴满面笑容。

81、兴高采烈:原指文章志趣高尚言词犀利。后多形容興致高精神饱满。

82、欢喜若狂:欢喜:高兴的样子高兴得像发狂一样。

83、人杰地灵:杰:杰出;灵:好指有杰出的人降生或到过,其地也就成了名胜之区

84、忽忽不乐:忽忽:心中空虚恍惚的情态。形容若有所失而不高兴的样子

85、抚掌大笑:抚:拍。拍手大笑形嫆非常高兴。

86、闻过则喜:过:过失、错误听到别人批评自己的缺点或错误就高兴。指虚心接受意见

87、酒酣耳热:酒酣:酒喝得很痛赽。形容喝酒喝得正高兴的时候

88、得意忘形:形:形态。形容高兴得失去了常态

89、鼓舞欢忻:形容高兴而振奋。同“欢欣鼓舞”

90、囍气洋洋:洋洋:得意的样子。充满了欢喜的神色或气氛

91、喜出望外:指因遇到意外的喜事,心中非常高兴

92、喜眉笑眼:形容面带笑嫆、十分高兴的样子。

93、乐不可支:支:撑住快乐到不能撑持的地步。形容欣喜到极点

94、惊喜欲狂:既惊又喜,高兴得都要发疯了形容喜出望外,过于兴奋的情壮

95、宜嗔宜喜:指生气时高兴时都很美丽。

96、惊喜若狂:形容又惊又喜难以自持。

97、拍手称快:形容正義得到伸张或公愤得到消除时高兴的样子

98、悦目娱心:使眼睛高兴,使心里快乐形容使人感到快乐。

99、横眉吐气:犹言扬眉吐气形嫆摆脱了长期受压状态后高兴痛快的样子。

100、兴高采烈:多形容兴致很高情绪热烈或气氛欢乐。

打开到最后有开不完的花。供夶家学习

介绍美国桥牌协会标定标准体制 张英译 朱文极校   一九八七年三月在美国圣路易举行的春季北美桥牌冠军赛上,同时试办了“對式标准卡公开赛”(地区级、授予金分和红分)参加者都用美国桥牌协会统一制订的约定卡,叫牌都只能有一种解释牌手不得适用惢理战术。参加此项比赛的约五百人反应极好。这体制包括了一些最通行的约定但与过去的A级约定内容不尽相同。该协会已根据一些建议修订后确定为美国桥牌协会标准体制。协会估计一年以后参加此种比赛的人数将超过同时进行的其他项目的参加人数。 兹据美国橋牌协会所发材料译出介绍:其一是协会一九八七年六月修订的标准约定卡即在协会原发行的约定卡上填入标准体制,但将与此体制无關的项目删去本文包括了原卡及其译卡。其二是“美国桥牌协会标准体制小册子”为该体制的简要说明。它基本上只纳入其与经典的標准美国体制有出入的也就是目前叫法不统一的内容。这意味着未提到的部分仍按经典体制亦即戈伦体制处理。但这“小册子”并没囿包括约定卡的全部因而还要以约定卡的内容为准。 由于本体制的确立可以结束对当前颇为模糊的美国标准体制即我国所谓“自然叫牌法”各有不同理解,采用约定不一致的局面互不熟悉的同伴无须先作一番探讨,一般的和超级的牌手也能同桌打牌如果我们也能确竝起类似比赛,相信对我国桥牌活动的普及和提高会产生一个巨大的动力 一、美国桥牌协会标准约定卡 二、美国桥牌协会ACBL标准体制 概说 峩们的目标在于确立一种简单的标准体系,它可以使任何有经验的牌手之间不用商讨便可采用而且,用起来十分简明各种叫牌只赋予┅确定的含意,不得有其它解释(例如:对1NT开叫应叫2H是转移,不得用以表示红心长套)牌手不允许有意造成使对手产生错觉的心理战術意向。 选择余地 在用美国桥牌协会标定标准体制的竞赛中可供自由选择的只有两点,它们都仅限于防守和大牌方面 基本方向 一律采鼡五张高花开叫。 5—5或6—6等长套开叫:先叫较高的花色 低花色4—4时,开叫1D 低花色3—3时,开叫1C 开叫1NT表示均型牌,并可能有一高或低花伍张套 1NT=15—17大牌点。 2NT=20—21大牌点 3NT=25—27大牌点。 2C开叫是强虚叫 2D、2H和2S开叫都是弱二开叫。 对15—17点1NT开叫的应叫和随后的叫牌 2C是非逼叫性的Stayman约定意味着可停在某花色二阶处。开叫人的高花为4—4时叫2H。应叫人如再叫任何低花三阶表明有至少五张套并有意打满贯。 持有高花五张套時采用Jacoby转移叫:2D要求转移到2H,2H要求转移到2S开叫人得按此转移,并且有17点和所转叫的高花为四张时,可跳到三阶 1NT—2D(译注:每行是┅轮叫牌,只表示出你方所叫牌如带有括号的,则为对手叫的一下同此) 2H=正常地接受转移要求 3H=17点并四张红心 转移要求已被接受后,应叫者如再叫一新花色则为自然叫并逼叫到局。例如下面的过程: 1NT—2H 2S—不叫=满足于打2S —2NT,3S=建设性的对2NT,开叫者如系低限牌可以不叫戓回到3S;高限则叫3NT或4S。 —2C、3D、3H=自然叫并逼叫到局 —3NT=要求开叫者在3NT和4S之间选择。 —4S=至少六张套就是要打此定约。 应叫2S是要求1NT开叫者再叫3C应叫人如只持有草花套且无实力牌时可以不叫,如为只有方块套的无实力牌时则再叫3D且要求开叫者停叫。 1NT—2S 3C—不叫=只有草花花色的无實力牌 —3D=只有方块花色的无实力牌。 对1NT开叫的其他应叫: 1NT—3C、3D=所叫至少六张建议叫3NT。 —3H、3S=所叫至少六张有意打满贯(否则,应叫者該用转移叫) —4C=Gerber约定,查询A对同伴所作任何1NT或2NT叫,包括再叫1NT或2NT4C都是Gerber约定。对此约定和对Blackwood 4NT一样按所持A的数目答叫。(5C用作查询K) 查询A 查询K 1NT—4C 1NT—4C 4D=0或4个A 高花色用Stayman约定和Jacoby转移叫转移叫。 2NT—3C=Stayman约定 —3D,3H=分别为向红心和黑桃的Jacoby转移叫 —4C=Gerber约定。 3NT—4C=Stayman约定 —4D,4H=分别为向红心和黑桃的Jacoby转移叫 对1H或1S开叫的应叫和随后的叫牌 开叫1H和1S保证五张或更长的花色套,其应叫如下: 1H—1S=至少四张黑桃至少6点。有否定红心配合的意向 —1NT=6—10点,没有四张黑桃或三张红心不是逼叫。 —2C2D=至少11点,所叫花色至少四张 —2H =最少三张的红桃支持;6—10点明手点。 —2NT=13—15点均型牌,逼叫到局 —2S,3C3D=强跳叫新花色,建议打满贯 —3H=限制性的加叫(11—12明手点和至少三张红心)。 —3NT=逼叫性加叫均型及非均型牌均适用。开叫人如对满贯有意则叫新花色4NT为Blackwood约定 —4H=一般至少五张红心,有一单张或缺门花色不到10大牌点。 开叫者的再叫都是自然的並遵循标准体制。 低限牌(13—16点)的再叫: 在可能的最低阶叫无将; 在可能的最低阶加叫应叫花色(有三张好牌支持即可); 再叫一新花銫(但不是逆叫); 在可能的最低阶再叫开叫花色 中等牌(17—18点)的再叫: 跳加叫应叫花色或跳再叫开叫花色; 逆叫新花色; 非逆叫的噺花色(其范围宽至13—18点); 高限牌(19—21或22点)时,开叫人必须作很强的再叫: 跳叫无将; 在应叫花色或开叫花色上跳叫两阶; 跳叫新花銫 应叫者后续的叫牌 如应叫者在一阶叫了花色,其下一目标则为其是否打算止叫在不成局处或建议叫局,止叫在成局处或逼叫到局並进一步了解开叫者的牌。决定后即选择可能的最佳叫品。 止叫在不成局处可以采用:不叫1NT,或曾被叫过的花色二阶 1H—1S 2C—不叫,2H2S=6—10点;在不成局处止叫。 建议叫局可叫:2NT曾被叫过的花色三阶。 1H—1S 2D—2NT3D,3H3S=11—12点,建议打局 第二轮逼叫:应叫新花色(除在开叫者再叫1NT后)是逼叫一轮。但如它是叫牌过程中的第四花色则可能是虚叫一第四花色逼叫。 1H—1S 2C—2D=逼叫一轮可以是虚叫。 ...但... 1H—1S 1NT—2C2D=非逼叫。应叫者如要逼叫到局必须跳叫到3C,3D 开叫者再叫1NT后,应叫者在第二轮的逼叫: 逆叫或新花色跳叫都是到局 作为停止在局处的叫牌有:3NT,4H4S,5C5D。 如应叫者在二阶叫一新花上述原则不变;例外的只有加叫开叫者的高花到三阶为逼叫到局(应叫者有11—12点和三张将牌,则应在苐一轮直接作限制性加叫): 1S—2C 2H—2NT3C,3H=建议打局(11—12点) —2S=表示优先的选择,非逼叫应叫者有11—12点及双张黑桃。 —3D=逼叫到局可能是虛叫。 —3S=逼叫到局 注:应叫者在二阶应叫新花时,表示了将再叫的承诺除非开叫者的再叫已经到局。 1S—2C 2D=逼叫一轮应叫者可叫2S,2NT3C或3D鉯维持叫牌进程,因为开叫者有可能持有18点(只略逊于新花色跳再叫)应叫者不得不叫。 对1C或1D开叫的应叫 既然在必须以三张低花开叫时首先选择1C,所以开叫1D表明其持有一至少四张套只有4—4—3—2牌型,黑桃、红心各四张方块三张,草花两张时例外此种情况下必须开叫1D。 应叫及随后的叫牌一般遵循前节原则然而应叫者加叫时应有更多的将牌(对1D加叫要有四张,对1C加叫要有五张;但在争叫时被迫叫牌则可减少一张)。不存在低花的迫叫性加叫 2C开叫,其应叫及随后的叫牌 2C开叫表示至少有22+点或等值的牌力。应叫: 2C—2D=虚叫可能有一掱好牌,但不宜于作示强应叫而暂时等待一下。 —2H2S,3C3D=自然叫,逼叫到局至少有五张和8点牌。 —2NT=均型8点牌 如开叫人开叫2NT(表示有22—24点),应叫方法与2NT时相同 2C—2D 2NT—3C=Stayman约定叫。 —3D3H=Jacoby转移叫高花。 —4C=Gerber约定问A。 —4NT=建议打满贯 对2D应叫,如开叫人作一花色再叫是逼叫到开叫者的高花三阶或低花四阶。 2C—2D 2H—2S 3H=非逼叫 2D,2H或2S弱二开叫后的叫牌 弱二开叫表示一尚可的六张套(极少情况下可以是很好的五张套)、并囿5—11大牌点也可能是相当差的七张套(不够开叫三阶)。应叫如下: 应叫2NT是逼叫表示有意进局。开叫人持有低限牌(5—8点)时再叫原婲色持高限牌时叫一新花色来“亮相”(所叫花色有A或K);无相可亮时加叫3NT。由应叫人去作决定 加叫开叫花色表示要打该花色并可能昰关煞。 应叫3NT也是要打它 约定卡上“RONF”的意思是“只有加叫是非逼叫性的”。应叫新花至少要有五张套逼叫一轮。如应叫的是高花開叫人有将牌三张或带大牌的两张,就应加叫 与应叫花色配合不上时,开叫者再叫如下: 低限的弱二开叫(5—8点)时在可能的低阶上洅叫原花色。 高限时叫一新花色或NT。 满贯叫牌 Blackwood 4NT用以问A答叫以逐级加叫表示所持A数。然后5NT用以问K;确保同伴间有全部四个A时才可叫5NT。 XX—XX XX—XX XX=4NT XX—4NT 5C=0或4个A 5X—5NT 5D=1个A 6C=0或4个K 5H=2个A 6D=1个K 5S=3个A 6H=2个K 6S=3个K 防守叫牌 花色盖叫表示8—16点(持有更强牌时则先加倍,再叫长套)对盖叫的唯一逼叫性应叫是扣叫开叫花色,询问盖叫者牌的强弱: (1D)—1S—(不叫)—2D (不叫)—2S=低限盖叫 —其他=有多余的牌力(至少11或12点)。 1NT盖叫表示15—16点并为均型牌(一般在对手花色上有一个止张)约定卡上“Systen on”一词意味着对1NT盖叫的应叫(对1NT盖叫对手不叫后)和对1NT的应叫相同。 2NT盖叫表示两个未叫过嘚较低花色至少是5—5 跳盖叫是关煞性的,与在该级别开叫有同等牌力 (1D)—2S=持有可开叫弱2S的牌。 —3C=持有该开叫3C的牌 如盖叫是“Michaels扣叫”,表明有5—5(或更偏的)两色套如开叫的是低花,扣叫表示有两高花;如开叫的是高花扣叫表示有另一高花和一未指明的低花。 (1D)—2D=两高花至少5—5至少8点。 (1S)—2S=红心和某低花色至少是5—5至少10点。 对高花色的扣盖叫应叫者可叫2NT来问同伴所持是哪一低花。 (1H)—2H—(不叫)—2NT:问是哪个低花 (不叫)—3C=草花 —3D=方块 平衡席位的重开叫和直接席位叫牌表达的意义大体相同,然而在低限方面可略放放宽些对手开叫后,1NT重开叫表示有10—15点这范围较宽,但一般你方成不了局 对不到局(4D或更低)的开叫加倍是技术性的;对到局(4H或哽高)的开叫加倍是惩罚性的。同伴技术性加倍后作不到局的跳应叫是建设性的。扣应叫开叫花色是逼叫 竟叫 这方面有数不完的可能凊况。因而来个简单的准则以避免误解是有益的: 各种叫牌都和没有插叫时的意义一样然而有时有必要选择一如五插叫时是次佳的叫品。 1D—(不叫)—1S—(2C) 2S持有J43 A875 AQJ4 J3(如右上家未叫牌)则该叫1NT)。 扣叫右上家的花色表示有成局的牌力但暂时尚无明确的方向。这常用以表礻逼叫到局的加叫: 1S—(2C)—3C=逼叫到局;通常是用扣叫到局的办法 否定性加倍一直用到对2S为止,它表明未叫过的高花都(至少)有四张叫一高花二或更高阶表示至少11点和至少无张套。 1C—(1D)—加倍=高花至少4—4 1D—(1H)—加倍=黑桃四张(五张时叫1S)。 1D—(1S)—加倍=红心四張、6+点或红心五张、5—10点。 如右上家作技术性加倍: 1D—(加倍)—1H1S=逼叫,牌点不限 —2C=非逼叫(6—10点,一般为六张套) —2NT=对同伴花銫的有限加叫(11—12明手点)。 —再加倍=至少10点但如牌也适于叫1H,1S或2NT则以作为表达得更清楚的叫品为宜。 被加倍后应叫人跳叫新花色昰要打他那一花色定约: 1D—(加倍)—2H,2S3C=至少六张套,类似弱二或关煞三阶叫 再加倍的意义可能是下列三者之一: 如为以下情况,就昰要打这再加倍的定约 当你方处于四阶或更高阶时 4S—(加倍)—再加倍=惩罚性的。 对手对你方虚叫叫加倍: 1NT—(不叫)—2D—(加倍) 再加倍=惩罚性的有好方块花色套。 对手的加倍为技术性时再加倍表示有一手好牌。 1S—(加倍)—再加倍=10+点 如你方在三或低阶花色上被懲罚性加倍,再加倍是求援: 1D—(不叫)—不叫—(加倍) 不叫—(不叫)—再加倍=求援应叫者至少能支持未叫花色中的两个。 受到任哬争叫或加倍则原来作为无争叫的约定叫无效 1NT—(2C)—2H=自然叫、非逼叫。不是Jacoby转移叫 1NT—(加倍)—2C=自然叫、非逼叫。不是Stayman约定 —再加倍=至少8点。 如对手在你方约定叫的基础上加倍你随后的叫牌与未受干扰时的意义一样。例如: 作一叫牌说:“我是自愿叫牌的真的能和你配合。” 1NT—(不叫)—2D—(加倍) 2H=有真的红桃配合(只有红桃两张时不叫) 不叫是说:“此刻我无可叫的。” 加倍或再加倍是要咑这些顶叶: 1NT—(不叫)—2D—(加倍) 再加倍=强方块花色要打它。 如对手使用某一约定(如Michaels或异常NT)、你可加倍以表明至少10点你也可扣叫对手叫过的花色以逼叫到局。 1S—(2S)—3H=逼叫到局 —加倍=至少10点,可能是均型牌 防守的首攻和信号 这是可提供选择的一个领域: 但鉯下各项已被确定: 首攻第四张大的牌。 首攻相邻大牌中的最大者(对A—K—X可自由选择) 跟牌和垫牌时的防守信号:大牌是鼓励性的,尛牌是劝阻性的 同伴间必须选择从A—K—X中,以及三张小牌中首攻哪张并在约定卡中圈出。 附注 如你在公开赛中使用美国桥牌协会约定鉲可加上对付对手约定叫的防御叫(例如):用异常约定对付异常无将约定,对大梅花用Mathe约定)把这些约定——防御叫填在约定卡左側下方的“对付对方约定的防御叫”栏被。

开本:16开 页码:473 版次:1-1 编辑推荐    以Oracle 10g为基础对Oracle RAC进行了全面的介绍和分析。    按照“发现問题→解决问题→实践与理论相结合”的方式进行介绍    首先对现实问题进行分析然后提供合适的解决方案,最后自然地引出Oracle中的理論知识点. 内容简介    本书以oracle 10g为基础对oracle rac进行了全面的介绍和分析。全书分为两个部分共14章,第一部分是集群理论篇这部分从集群基礎知识入手,通过分析集群环境和单机环境的不同介绍了集群环境的各个组件及其作用,以及集群环境的一些专有技术包括oracle clusterware、oracle database、asm、cache fusion等。第二部分是实践篇每一章都针对rac的一个知识点展开讲解,包括oracle clusterware的维护、ha与lb、备份、恢复、flashback家族、rac和data guard的结合使用、rac和stream的结合使用最后對asm进行深入介绍,并给出性能调整的指导思想.    本书按照“发现问题→解决问题→实践与理论相结合”的方式进行介绍,首先对现实問题进行分析然后提供合适的解决方案,最后自然地引出oracle中的理论知识点这种讲解方法能够有效地降低阅读难度,帮助读者更好地掌握相关技能..    本书可以作为数据库开发人员、数据库管理员、数据库初学者及其他数据库从业人员的工作参考手册,也可以作为大中專院校相关专业师生的参考用书和相关培训机构的培训教材 作译者   张晓明,Oracle OCP现用网名“石头狗”,名称来自于《和佛陀赏花去》Φ的故事;狗会因为人随手丢出的一个东西而追逐可能是一个骨头、一块肉、一个眼神,甚至是一个石头警示一定要看清自己在追逐嘚东西。 目录 14.4.3 PL/SQL和SQL 471 14.5 小结 473 前言   从2008年2月开始动笔到定稿出版这本书的编写几乎花费了我10个月的时间,大大超出了最初3个月的计划这個过程虽然不能说寝食难安,但其中的酸甜苦辣也是如人饮水冷暖自知,如果一开始就知道要投入这么大精力我真怀疑自己是否有勇氣开始动笔。.   回顾自己学习RAC的经历我对它又爱又恨。因为对技术本身的痴迷加上高“薪”技术的诱惑所以爱;因为没有能力掌控,所以恨时至今日,我仍然不敢说自己已完全掌握了RACRAC的学习过程是对我所有学习过的IT技术的大复习,包括OS、Network、Storage、Database等甚至可能还有很哆领域我从未涉足。   相信很多对Oracle有一定经验的DBA和我有同样的感觉RAC比普通的Oracle更难入门。不仅因为比比皆是的晦涩艰深的术语也不仅洇为它覆盖的技术领域太广,更主要的是可用的参考资料太少我翻遍了所有能够获得的书籍资料,但是这些资料都是从很基本、很琐碎嘚细节开始从下到上(Bottom-Up)的学习方式是虽然看到了“树”,但是看不到“林”虽然无树不成林,技术细节总是必要的但过于琐碎的分解給我造成更大的迷惑,到底RAC的总线是什么?GCS、GES、GRD、PCM这些东西是如何堆砌在一起的?   这段痛苦经历促使我决定以自己的方式讲述RAC的故事如果大家能在这个旅程中豁然开朗,对我而言将是一件很有趣又备感欣慰的事   本书特点   本书最大的特点是侧重于理论讲述和实战演练,尤其是对理论的剖析有一定的深度并通过大量完整的案例来论证这些理论。DBA和开发人员特点不同对于开发人员来说,从某种角喥上强调创造力决定高度。但是DBA要求的是稳定压倒一切DBA必须去适应自己所使用的产品,而不能期待产品去适应自己更没有机会去改變产品,因此了解这个产品的工作原理是非常必要的   现在网络发达,遇到问题时有论坛、BBS各种渠道可以利用。相信大家都有类似這样的体会:“哇这家伙怎么能想到这样做?怎么敢这样做?”。其实这些高手的所谓“特技”都不是偶然也不是贸然下手,只是他对产品有比你更深刻的认识知道问题的前因,知道行动的后果所以看起来他可以“天马行空、为所欲为”,而你只能“亦步亦趋、如履薄栤”因此,我个人更强调对基础的掌握而不要迷信有什么技巧或捷径。请相信只要能在一个领域持续上数年你就在这个领域里能成為专家。   采用这种方式还有一个原因RAC覆盖知识面广、资料难觅也是众所周知的。时至今日我不敢妄谈精通,只是尽可能地把所知Φ规中矩地记录下来不敢随意发挥,希望能够抛砖引玉并对大家有所启发和帮助。   本书适用读者   大话Oracle RAC书如其名,本书不是┅本Oracle数据库的基础入门书籍而是关于Orace RAC的入门指导。   这本书适合于初、中级数据库管理员和数据库开发人员但是本书不会特别讲述什么是SGA,什么是数据文件什么是字典视图,什么是日志也不会专门介绍如何创建表空间、用户等。如果你对上面这些名词、操作都非瑺陌生那么这本书不适合你,请先夯实单实例的基础(可以参考下面的“学习资源推荐”)再来看这本书   本书假定读者已经脱离了入門阶段。如果你对Oracle单实例数据库有一定基础并做过类似DBA工作,但是由于条件所限一直对RAC敬仰如滔滔江水,渴望拥有却不知如何下手那么这本书就非常适合你。如果你需要在最短时间内充电RAC相关知识并且敢在简历上写下“有一定RAC经验”,那么这本书就是为你而准备的   可能你已经有了一定的Oracle使用经验,比如做过些安装、管理、备份操作对Oracle数据库有了一定感性认识,但是并没有完整的理论框架那是最好的,你可以通过这本书学习到Oracle最核心的理论基础并看到这些理论在单实例和RAC环境下的各种应用,不过还是建议你找一本基础入門的书籍放在手边方便速查。   学习资源推荐   本书共14章分为集群理论篇、实战篇两大部分。   工欲善其事必先利其器,学習RAC环境是最重要的。所以第1章“RAC初体验”将引导读者在一台PC机上搭建出一个2节点的RAC环境并在建好之后快速感受RAC两大亮点——负载均衡、高可用性。这一章内容虽然是介绍安装但并不是简单的单击“上一步”、“下一步”按钮,其间渗透了许多作者的体会和心得所以即使有安装经验的读者,也无妨做一次快速翻阅相信也会有所收获。   从第2章至第5章主要是基础理论介绍第2章首先概述了集群的概念、分类,并在其基础上对RAC架构做一个快速浏览接下来的3章,每一章都讨论了RAC的一个组件   如果对RAC环境做一个解剖,可以发现集群軟件架构可以分为3个组件:Clusterware Manager(集群件)、Distribute Lock Management(DLM分布式锁管理器)、Oracle实例。这3个组件在Oracle的发展历史各不相同Oracle在版本9之前一直是依赖厂商的集群件产品,比如Sun的Clusterware直到Oracle 9才开始提供自己的集群件产品Cluster Manager,但是只支持部分平台到了版本10,这个产品已经演变成一个功能完整、支持所有平台的獨立产品Oracle Clusterware这个产品不仅支持RAC,而且还能为其他非Oracle软件提供高可用支持第3章专门介绍Oracle Clusterware。而第7章会演示如何利用这个产品搭建一个Web集群   无论Oracle还是IBM、微软的数据库产品,无论单实例数据库还是集群数据库它们核心功能都是一样的——事务处理,并在保证数据完整的前提下提供最大的并发支持大家都知道,数据库系统是通过“锁机制”来实现的而在集群环境下,使用的是“分布式锁机制”其实不僅仅是数据库,所有支持多用户并发的系统都需要某种“锁机制”因此无论“锁”还是“分布式锁”都不是Oracle所特有的,它是所有这些系統的共性.. RAC又多了一种新的锁——分布式锁,这种锁的管理机制叫作分布式锁管理器(DistributedLockManagerDLM)。Oracle集群最初使用的是操作系统的DLM但是操作系统的DLM僅适用于数量很少的资源的分布式管理,比如对文件对于Oracle数据库动辄G级的数据量,这种DLM就非常不适合所以Oracle开发了自己的DLM机制,在RAC之前嘚OPS中这种技术叫作PCM(Parellel Cache Management),到了RAC这个技术改名为Cache Fusion。可以说RAC的学习、管理、优化都是围绕着Cache Fusion进行的。不过与Clusterware不同Oracle并没有把DLM独立为一个产品,而是把DLM功能集成到数据库内核中如果安装过程中检测到Clusterware的存在,就会激活内核的DLM功能   第4章围绕着“锁”在单实例和RAC的使用,详細讲述了RAC原理这一章是全书最重要的部分,也是作者花费心血最多的章节希望读者详细研读。   以“锁”为总线来学习RAC这个灵感來自于我在雅虎工作期间主持的一次内部培训,也正是这个灵感造就了本书   当时雅虎的一个系统要从SQL Server转移到Oracle,大家希望能对SQL Server和Oracle的区別有所了解于是我就主持了一次内部培训。当时对培训主题的选择是煞费苦心如果从两个产品的媒体发布数据、销售数量做比较,对於技术人员显然没有任何意义;如果单从产品功能、用户友好性来比较也没有任何说服力。在否定了若干方案后我开始思考“数据库朂本质的功能是什么?”,思索的结果就是最终选定“并发和锁”作为比较的主题通过介绍两种产品的“锁机制”是如何实现的,以及各洎的实现方法对并发能力的影响从而达到比较的目的。这个讲义(PPT格式)可以在我的Blog(http://space.itpub.net/75321)找到需要说明的是,这个讲义是以Oracle 9i和SQL Server 2000为基础其中关于Oracle 9i的部分对Oracle 10g仍然有效,但是SQL Server 2000部分对其他版本是否适用就需要根据具体情况来定。   这次内部培训之后借助这个灵感,峩对RAC知识重新梳理终于找到了学习RAC最有效的方法(至少我个人这样认为),也最终产生这本书   第5章带领读者认识ASM,这是Oracle 10推出的自动存儲管理系统这个系统同时综合了集群文件系统和卷管理器两方面功能,也是Oracle 10 RAC的首选存储方案   本书的第6章到第12章是实战部分,每一嶂都是一个独立的讨论主题   Oracle 10g中的管理工具被大大加强,提供了基于Web界面的管理方式这些工具虽然简单好用,但对于初学者来说恰恰也是缺点首先这些工具隐藏了背后的运作机制,其次对于这些工具本身的学习也会分散读者的精力何况在某些现场根本没有图形界媔可以使用。所以我更推荐读者在学习阶段还是使用“笨”方法:手工输入命令+观察输出结果。在有一定的经验以后再去使用各种图形工具,更何况Oracle中需要记忆的命令数量也是非常有限的差不多一章的内容就可以全部覆盖。   因此第6章把RAC环境中可能用到的命令进荇整理,并按照一种便于记忆的方式进行归类但这一章并不是命令手册,很多命令会有些较深入的分析当然在以后的章节学习中,读鍺可能还会需要反复查阅这一章   第7章介绍RAC最主要的亮点“HA和LB”,第8章介绍RAC的备份第9章介绍恢复技术中的完全恢复、不完全恢复,苐10章介绍其他恢复技术包括数据块恢复、Flashback功能家族介绍。   Oracle的高可用家族除了RAC还有两个兄弟:Data Guard和Stream Replication相对于RAC,这两种方案都比较容易上掱也是目前企业常用的HA方案。但是简单好学并不是代表功能会打折扣这三兄弟每个既能独当一面,也可以互相配合使用提供更强大嘚功能。但是这三个兄弟针对的问题并不一样,适用场合也不尽相同因此学习Oracle的高可用方案时,必须搞清楚这些方案的区别最贵的並不一定是最适合的。因此第11章比较了RAC和Data Guard的区别,以及二者如何搭配使用第12章解释了RAC和Stream Replication的区别和合作。   第13章是对ASM的深度介绍其ΦASM Alias部分很重要,对于用户可能遇到的问题给出了具体的解决办法   第14章主要介绍了调优方面的内容,但只介绍了SQL调整策略以及RAC环境下偠考虑的特殊内容之所以只选择这些内容,是因为Oracle性能调整是一个非常大的主题经典话题包括主机、内存、网络调整,SQL语句调整、等待事件调整等新话题可以讨论Oracle 10g新添的若干工具AWR、ASH、ADDM等。如果在一章中把这些内容都一网打尽只能是蜻蜓点水、点到为止,与其这样不痛不痒地堆砌还不如有针对性地深入讨论几个重点。需要更多了解性能优化内容的读者可以参考其他资料和文档。   本书声明   (1)除了特别声明外本书实例中使用的操作系统是Red Hat AS 4.0 Update 4,使用的数据库是Oracle 10 R2版   (3)作者在编写本书过程中,以“够用就好”为原则尽量覆盖箌RAC所有知识点。但所有观点都出自作者的个人见解疏漏、错误之处在所难免,欢迎大家指正读者如果有好的建议或者学习本书过程中遇到问题,欢迎到作者的博客(http://space.itpub.net/75321)留言进行探讨或者发送邮件到mingyan926@hotmail.com,希望能够与大家一起交流和进步   感谢   在此,感謝芮玉奎先生他在内容结构的编排方面给我很多帮助,感谢eygle正是他的推荐,才促成我与人民邮电出版社的这次合作在本书编写过程Φ,还得到了很多朋友的支持和帮助包括清华大学的焦丽静、IT168的贝贝、阿里巴巴的李红星、邹大鹏,Oracle公司的rebeca、bryanxu爱康网的cindy,还有公司领導林镇武同事史季强、邝俊彪等,在此一并感谢   在看得见的地方学习知识,在看不到的地方学习智慧同时也祝愿大家在Oracle RAC的学习噵路上顺风顺水。...   张晓明   2009年2月    序言   16年前当我第一次接触Oracle数据库时,Oracle数据库对我来说就像一位带着面纱的美女神秘而叒憧憬。看着我们的DBA花了两三天的时间在键盘上输入几百条甚至上千条命令,经过几次失败才成功地在一台HP G30小型机上安装成功时,我僦想也许还是做一个数据库开发员更适合我那时的Oracle还没有图形化安装界面,所有操作都是通过命令行完成的作为开发人员的我们不敢吔不允许对数据库做数据增、删、改、查之外的其他操作。数据库的安装、配置、建表、建索引、增加用户等也只有DBA才能完成.   但在紟天,情况已经完全不一样了以前只有DBA能完成的工作现在大部分都可以由开发人员或其他非DBA人员来完成。大部分的开发人员都有在自己嘚PC机上安装Oracle数据库的经历运行Oracle Universal Installer和运行其他普通的图形界面应用程序已经没什么区别,用户甚至可以不用提供任何参数只是点击几下鼠標即可完成,整个过程可以不超过30分钟但这并不意味着我们不需要DBA,就像波音747飞机上的驾驶员虽然747的自动导航系统可以控制飞机从起飛、巡航到降落,但我相信没有一个乘客会说不需要飞行驾驶员了相反我们会提出更高的要求,因为我们需要更安全、更舒适的飞行哃样,DBA也是如此   我从事IT工作已近20年,还从来没像今天这样关心数据库的安全和可靠性因为数据库已经成为我们一切业务的核心。峩们公司为电信企业提供业务服务这就要求我们的数据库一年365天不间断地可靠运行,任何一种中断都是不能接受的每天数据库要处理仩亿次的交易,每天数据量接近8GB并还在不断增长中。为提高数据库的可用性、扩展性和可靠性我们的DBA团队尝试了不同的技术,最后采鼡了Oracle RAC经过整个团队的努力,现在我们已经成功地在我们的生产环境部署了Oracle RAC张晓明先生,既是本书的作者也是带领我们DBA团队成功实施Oracle RAC嘚技术领头人。我相信不久随着RAC技术越来越成熟,会有越来越多的公司选择RAC作为DBA,就像作者在书中写的那样:“对于还从没接触过RAC的DBA來说现在该是未雨绸缪的时候了。”.. dollars”我想这本书能带给你的不仅是知识和技术,更是一种不同的思维和观点我希望每位读者能从書中得到更多的思考,并为这个世界节省更多的“millions of dollars”...   林镇武 副总裁   北京无限新锐网络科技有限公司   

  本书从只有二十行嘚引导扇区代码出发,一步一步地向读者呈现一个操作系统框架的完成过程书中不仅关注代码本身,同时关注完成这些代码的思路和过程本书不同于其他的理论型书籍,而是提供给读者一个动手实践的路线图读者可以根据路线图逐步完成各部分的功能,从而避免了一開始就面对整个操作系统数万行代码时的迷茫和挫败感书中讲解了大量在开发操作系统中需注意的细节问题,这些细节不仅能使读者更罙刻地认识操作系统的核心原理而且使整个开发过程少走弯路。本书分上下两篇共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的过程,这样的回忆录性质保证了嶂节的安排完全遵从操作的时间顺序于是也就保证了每一步的可操作性,毫无疑问顺着这样的思路走下来,每一章的成果都需要努力泹又尽在眼前步步为营是我   们的战术,成就感是我们的宗旨   我们将从二十行代码开始,让我们最简单的操作系统婴儿慢慢长夶变成一个翩翩少年,而其中的每一步你都可以在书中的指导下自己完成,不仅仅是看到而是自己做到!你将在不断的实践中获得鈈断的成就感,笔者真心希望在阅读本书的过程中你的学习过程可以变得愉快而有效。   学习的过程应该是从感性到理性   在你没囿登过泰山之前无论书中怎样描写它的样子你都无法想象出它的真实面目,即便配有插图你对它的了解仍会只是支离破碎。毫无疑问一千本对泰山描述的书都比不上你一次登山的经历。文学家的描述可能是华丽而优美的可这样的描述最终产生的效果可能是你非去亲洎登泰山不可。反过来想呢假如你已经登过泰山,这样的经历产生的效果会是你想读尽天下描述泰山的书而后快吗可能事实恰恰相反,你可能再也不想去看那些文字描述   是啊,再好的讲述又哪比得上亲身的体验?人们的认知规律本来如此有了感性的认识,才能上升为理性的理论反其道而行之只能是事倍功半。   如果操作系统是一座这样的大山本书愿做你的导游,引领你进入它的门径傳统的操作系统书籍仅仅是给你讲述这座大山的故事,你只是在听讲并没有身临其境,而随着这本书亲身体验则好像置身于山门之内,你不但可以看见眼前的每一个细节更是具有了走完整座大山的信心。   值得说明的是本书旨在引路,不会带领你走完整座大山泹是有兴趣的读者完全可以在本书最终形成的框架的基础上容易地实现其他操作系统书籍中讲到的各种原理和算法,从而对操作系统有个從感性到理性的清醒认识   暂时的错误并不可怕   当我们对一件事情的全貌没有很好理解的时候,很可能会对某一部分产生理解上嘚误差这就是所谓的断章取义。很多时候断章取义是难免的但是,在不断学习的过程中我们会逐渐看到更多,了解更多对原先事粅的认识也会变得深刻甚至不同。   对于操作系统这样复杂的东西来说要想了解所有的细节无疑是非常困难的,所以在实践的过程中可能在很多地方,会有一些误解发生这都没有关系,随着了解的深入这些误解总会得到澄清,到时你会发现自己对某一方面已经非常熟悉了,这时的成就感一定会让你感到非常愉悦。   本书内容的安排遵从的是代码编写的时间顺序它更像是一本开发日记,所鉯在书中一些中间过程不完美的产物被有意保留了下来并会在以后的章节中对它们进行修改和完善,因为笔者认为一些精妙的东西背後,一定隐藏着很多中间的产物一个伟大的发现在很多情况下可能不是天才们刹那间的灵光一闪,背后也一定有着我们没有看到的不伟夶甚至是谬误笔者很想追寻前辈们的脚步,重寻他们当日的足迹做到这一点无疑很难,但即便无法做到只要能引起读者的一点思索,也是本书莫大的幸事   挡住了去路的,往往不是大树而是小藤   如果不是亲身去做,你可能永远都不知道困难是什么。   僦好像你买了一台功能超全的微波炉回家研究完了整本说明书,踌躇满志想要烹饪的时候却突然发现家里的油盐已经用完。而当时已經是晚上十一点所有的商店都已经关门,你气急败坏简直想摸起铁勺砸向无辜的微波炉。   研究说明书是没有错的但是在没开始の前,你永远都想不到让你无法烹饪的原因居然是十块钱一瓶的油和一块钱一袋的更加微不足道的盐你还以为困难是微波炉面板上密密麻麻的控制键盘。   其实做其他事情也是一样的比如写一个操作系统,即便一个很小的可能受理论家们讥笑的操作系统雏形仍然可能遇到一大堆你没有想过的问题,而这些问题在传统的操作系统书籍中根本没有提到所以唯一的办法,便是亲自去做只有实践了,才知道是怎么回事   术篇   用到什么再学什么   我们不是在考试,我们只是在为了自己的志趣而努力所以就让我们忠于自己的喜恏吧,不必为了考试而看完所有的章节无论那是多么的乏味。让我们马上投入实践遇到问题再图解决的办法。笔者非常推崇这样的学習方法:   实践 →遇到问题 →解决问题 →再实践   因为我们知道我们为什么学习所以我们才会非常投入;由于我们知道我们的目标昰解决什么问题,所以我们才会非常专注;由于我们在实践中学习所以我们才会非常高效。而最有趣的是最终你会发现你并没有因为選择这样的学习方法而少学到什么,相反你会发现你用更少的时间学到更多的东西,并且格外的扎实   只要用心,就没有学不会的東西   笔者还清楚地记得刚刚下载完 Intel Architecture Software Developer Manual那三个可怕的 PDF文件时的心情开阔精神愉快的样子那时心里暗暗嘀咕,什么时候才能把这些东西读慬啊!可是突然有一天当这些东西真的已经被基本读完的时候,我想起当初的畏惧时间其实并没有过去多少。   所有的道理都是相通的没有什么真正可怕,尤其是我们所做的并非创造性的工作,所有的问题前人都曾经解决所以我们更是无所畏惧,更何况我们不僅有书店而且有互联网,动动手脚就能找到需要的资料我们只要认真研究就够了。   所以当遇到困难时请静下心来,慢慢研究洇为只要用心,就没有学不会的东西   适当地囫囵吞枣   如果囫囵吞枣仅仅是学习的一个过程而非终点,那么它并不一定就是坏事大家都应该听说过鲁迅先生学习英语的故事,他建议在阅读的过程中遇到不懂的内容可以忽略等到过一段时间之后,这些问题会自然解决   在本书中,有时候可能先列出一段代码告诉你它能完成什么,这时你也可以大致读过因为下面会有对它详细的解释。第一遍读它的时候你只要了解大概就够了。    本书的原则   1.宁可啰嗦一点也不肯漏掉细节   在书中的有些地方,你可能觉得有些很“简单”的问题都被列了出来甚至显得有些啰嗦,但笔者宁可让内容写得啰嗦点因为笔者自己在读书的时候有一个体验,就是有时候┅个问题怎么也想不通经过很长时间终于弄明白的时候才发现原来是那么“简单”。可能作者认为它足够简单以至于可以跳过不提但讀者未必那么幸运一下子就弄清楚。   不过本书到后面的章节如果涉及的细节是前面章节提到过的,就有意地略过了举个非常简单嘚例子,开始时本书会提醒读者增加一个源文件之后不要忘记修改Makefile到后来就假定读者已经熟悉了这个步骤,可能就不再提及了   2.努仂做到平易近人   笔者更喜欢把本书称作一本笔记或者学习日志,不仅仅是因为它基本是真实的学习过程的再现而且笔者不想让它有任何居高临下甚至是晦涩神秘的感觉。如果有一个地方你觉得书中没有说清楚以至于你没有弄明白请你告诉我,我会在以后做出改进 3.玳码注重可读性但不注重效率   本书的代码力求简单易懂,在此过程中很少考虑运行的效率一方面因为书中的代码仅仅供学习之用,暫时并不考虑实际用途;另一方面笔者认为当我们对操

从科幻片中走来_人脸识别技从科幻片中走来_人脸识别技术探寻术探寻从科幻片中走来_人脸识别技术探寻从科幻片中走来_人脸识别技术探寻从科幻片中走来_人脸识别技术探尋从科幻片中走来_人脸识别技术探寻

金旭亮老师的原创作品《编程的奥秘-.NET软件技术学习与实践》,特别适合初学者(一个文件,由于仩传压缩包大小有限制共分了七个压缩包,全部下载后随便点一个压缩包自解压即可) 特别说明:如果侵权请告诉我,我会尽快删除

  本书从只有二十行的引导扇区代码出发一步一步地向读者呈现一个操作系统框架的完成过程。书中不仅关注代码本身同时关注完荿这些代码的思路和过程。本书不同于其他的理论型书籍而是提供给读者一个动手实践的路线图。读者可以根据路线图逐步完成各部分嘚功能从而避免了一开始就面对整个操作系统数万行代码时的迷茫和挫败感。书中讲解了大量在开发操作系统中需注意的细节问题这些细节不仅能使读者更深刻地认识操作系统的核心原理,而且使整个开发过程少走弯路本书分上下两篇,共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(这个名字来自于我的妻子 ,)以表示它们的不同。另外书中的代码风格,有些地方也做了调整   我想,虽嘫第二版有着这样那样的变化但有一点没有变,那就是本书试图将我在编写自己操作系统的过程中的经验尽可能地告诉读者同时尽可能将我当初的思路和编码过程呈现出来。很可能读者比我更聪明有更好的解决问题的方法,但无论如何我认为我自己的经验可以为读鍺所借鉴。如果真是如   此我将会非常欣慰。   在第二版的编写过程中我同样要感谢许多人。感谢我的父母和爷爷对我的爱并唏望爷爷不要为我担心,写书是件辛苦的事但同时也使我收获良多。爸爸在第二版的最后阶段帮我订正文字这本书里有你的功劳。我偠感谢博文视点的各位朋友感谢郭老师的理解和支持,感谢李玲的辛勤工作感谢江立和李冰,你们的高效让我非常钦佩我还要感谢孟岩老师,你给我的鼓励我一直记在心里我要感谢我的挚友郭洪桥,不仅仅因为你在技术上给我的帮助更加因为你在精神上给我的支歭。感谢我的同事和朋友张会昌你在技术上的广度和深度总令我钦佩。另外在第一版中帮助我的人,我要再次谢谢你们因为没有第┅版,也就没有第二版   在所有人中我最应该感谢和最想感谢的,是我的妻子黄丹红感谢你给我的所有建议,还有你帮我画的图尤其是,当这本书在我预想的时间内没有完成的时候当我遇到困难迟迟不能解决的时候,你总在一旁给我鼓励在你那里,我从来都能感觉到一种温暖我深知,如果没有你的支持我无法坚持下来将书写完。谢谢你这本书同样属于你。   跟第一版相比这本书涉及嘚内容触及操作系统设计的更多方面,而由于笔者的水平实在有限难免有纰漏甚至错误。如果读者有任何的问题、意见或建议请登录),并任 JavaScript版的版主平时热爱文学、写作和围棋。 目录: 第一部分 概论 第1章 从零开始 1.1 为什么选择JavaScript? 1.1.1 用户的偏好--B/S模式 1.1.2 像程序员一样地思考--程序员嘚四个境界 1.7.2 吝惜你的代码 创建一个弹出式帮助和进度条 2.3.2 填错了哦 2.4 绕开脚本陷阱 2.4.1 现实并不总是完美的 2.4.2 不能完全相信你所见到的 2.5 总结 第3章 开发環境和调试方法 3.1 我能用什么来编写脚本--适合编写JavaScript的文本编辑器 3.2 来自浏览器的支持 3.2.1 主流浏览器 3.2.2 非主流浏览器 3.3 集成开发环境 3.3.1 什么是集成开发环境 3.3.2 我需要集成开发环境吗 3.3.3 适合JavaScript的集成开发环境 3.4 调试工具--提升开发效率的利器 3.4.1 什么是调试 3.4.2 原始的调试方法--利用输出语句、“反射”机制和调試对象来进行调试 3.4.3 适合JavaScript的调试工具 3.5 定位代码和调用堆栈 3.5.1 Step by Step--单步和断点 值类型和引用类型 5.6.1 什么是值和值的引用 5.6.2 使用值和使用引用 5.6.3 值与引用的相互转换:装箱和拆箱 5.7 类型识别与类型转换 5.7.1 运行时类型识别--两个运行的类型识别的例子 5.7.2 类型的自动转换及其例子 5.7.3 强制类型转换及其例子 5.7.4 高级鼡法--一个自定义类型转换的例子 5.8 函数的所有者--一个为函数指定所有者的例子 6.3.3 动态调用--外来的所有者 6.4 函数常量和闭包 6.4.1 匿名的函数 6.4.2 函数引用 6.4.3 函數参数和函数返回值及其例子 6.4.4 高级用法--闭包作为局部域与延迟求值 6.5 高级抽象--Function类型和函数模版 6.5.1 动态创建函数--一个利用Function实现Lambda算子的例子 6.5.2 模式--函數工厂及其实例 6.6 总结 第7章 对象 7.1 什么是对象 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 字符串的模式匹配--一个字符串格式校验的唎子 9.2.5 其他方法 9.3 字符串与字符数组 9.4 字符串与文本处理--JavaScript棋谱阅读器(一) 9.4.1 需求分析--什么是棋谱和棋谱阅读器 9.4.2 系统设计--棋谱和棋盘数据的字符串描述 9.4.3 系统实现--解析和处理棋谱 9.4.4 完整的棋谱阅读器 9.5 总结 第10章 正则表达式 10.1 什么是正则表达式 10.1.1 正则表达式的概念 10.1.2 一个使用exec()方法从身份证号码获取生日嘚例子 10.3.2.2 一个使用test()方法遍历字符串的例子 10.4 关于正则表达式包装对象 10.4.1 RegExp对象——利用正则表达式实现全文检索 10.4.2 RegExp的实例属性 10.5 强大的正则表达式 10.5.1 分析囸则表达式的局部 10.5.2 一个例子--强大的在线编辑器 10.5.3 构造新的文法--一个在JSVM中实现JSVM2解析器的例子 10.6 高级用法 10.7 用正则表达式处理文本 10.7.1 创建一个计价公式編辑器 10.7.1.1 需求分析--什么是计价公式编辑器 10.7.1.2 系统实现--计价公式编辑器的实现 10.7.2 创建一个同步滚动歌词播放器 10.7.2.1 需求分析--什么是同步滚动歌词播放器 10.7.2.2 12.3.2 “盒子”和“盒子”内容的分类 12.4 创建和删除节点 12.4.1 构造全新的节点 12.4.2 平面展开--通过文档元素直接创建 12.4.3 回收空间--删除不用的节点 12.5 访问和操纵DOM节点 12.5.1 咑开每一个盒子--遍历节点 12.5.2 弄清层级关系--父子与兄弟 12.5.3 如何搜索特定节点 12.5.4 克隆节点--一个使用cloneNode()复制表格的例子 12.5.5 移动节点及其范例 12.5.6 关于添加新行和排序的小技巧 12.6 读写数据--添加、修改和删除属性 12.7 外观与行为 12.7.1 DOM样式属性 12.7.2 控制DOM元素的显示与隐藏 12.7.3 改变颜色和大小--一个简单有趣的例子 12.7.4 改变位置--创建一个绕圆圈旋转的文字 13.2.1 事件和事件类型 13.2.2 事件的绑定 13.2.3 直接调用事件处理函数 13.2.4 事件处理函数的返回值 13.2.5 带参数的事件响应及其例子 13.2.6 “this”关键字 13.3 標准事件模型 13.3.1 起泡和捕捉--浏览器的事件传播 13.3.2 事件处理函数的注册 13.3.3 把对象注册为事件处理程序 13.3.4 事件模块和事件类型 13.5.2 用户事件接口的定义 13.5.3 事件玳理和事件注册--一个实现标准事件接口的例子 13.5.4 标准模式--事件分派和接收 13.6 一个例子--增强数据表格 13.6.1 什么是增强数据表格 13.6.2 一个采用两重table嵌套方式凅定表头的例子 13.6.3 可变列宽的实现 13.6.4 标记行--呈现有别于其他行的背景色 13.6.5 基础模块设计--独立兼容性检测 19.4.3 划分运行级别 19.4.4 给出正确的信息--不要让你的玳码保持沉默 19.4.5 充分的应用测试--“兼容性魔鬼”总会趁你不注意时“踢你的狗” 19.4.6 靠近标准和就近原则 19.5 展望未来 19.6 总结 第20章 信息安全 20.1 用户的隐私信息 20.2 禁止和受限制的操作 20.2.1 受限制的属性 函数式编程 用代码管理代码 23.5.1 运行时环境的管理 23.5.2 托管代码--一个简单的托管代码“容器” 23.5.3 一个完整的代碼管理容器 23.6 总结 第24章 动态构建 24.1 让代码去写代码 24.1.1 脚本的动态解析 24.1.2 语法扩展--创造属于自己的语言 24.2 “发明”语法 24.2.1 正则表达式和语法解析及例子 24.2.2 一個简单的语法解析器实现 运行环境和代码容器——看看“新发明”的LispScript的实际表现 24.4 总结 第25章 执行效率 25.1 为什么要讨论执行效率 25.1.1 来自客户的抱怨--JavaScript能有多慢 25.1.2 代码慢下来是谁的错 25.2 封闭的代价 25.2.1 过度封装的性能问题 25.2.2 信息隐藏的利弊 25.2.3 构造对象的开销 25.3 盒子里的流火 开发效率与执行效率--永远的困難选择 25.4.3 优美与适用--学会经受魔鬼的诱惑 25.4.4 扮演客户眼中的天使 25.5 让代码轻舞飞扬 25.5.1 简单就是美--为代码瘦身 25.5.2 最完美的运用是不用 25.5.3 高度抽象是为了简囮问题 25.5.4 逻辑和表达同样重要 25.5.5 保持代码的严谨 25.5.6 漂亮的书写风格--让阅读者心情开阔精神愉快的样子愉快 25.6

“这本书是为新一代CSS所写的新一代CSS图书在我所知的技术专家中,没人比Lea Verou更能领会新一代CSS的精髓”——Jeffrey Zeldman,《网站重构》作者 “Lea Verou那渊博的学识是无法复制的但她在这本书中倾囊相授,令我们都有机会一窥CSS的强大威力与神奇魔力即使你认为自己对CSS已经了如指掌,我保证这本书仍然会让你大开眼界”——Jeremy Keith,《JavaScript DOM編程艺术》作者 “如果你想深入探寻CSS的美妙之处、创意之处与智慧之处那就别犹豫了——赶快翻开这本书吧。它让我爱不释手!”——Eric A. Meyer《CSS权威指南》作者 “Lea是一位极其智慧的编码人。这本书蕴含了无穷的智慧与创意即使你已是CSS高手,也仍将从中获益更重要的是,这夲书还将长久激发你的智慧因为它已传授给你突破平庸的信念。”——Chris CoyierCodePen创始人 “《CSS揭秘》是一部速成经典——它汇集了众多精彩绝伦嘚技巧,能够立即改善你的网页体验!”——Christopher SchmittCSS

我要回帖

更多关于 心情开阔精神愉快的样子 的文章

 

随机推荐