當前位置:編程學習大全網 - 源碼下載 - 壹個操作系統的實現的作者自序

壹個操作系統的實現的作者自序

本書是《自己動手寫操作系統》的第二版,通過壹個具體的實例向讀者呈現壹個操作系統雛形的實現過程。有關操作系統的書籍資料可以找到很多,但是關註如何幫助讀者實現壹個試驗性操作系統的書籍卻不多見,本書便是從壹個簡單的引導扇區開始,講述壹個操作系統成長的故事,以作讀者參考之用。

本書面向實踐,通過具體實例教讀者開發自己的操作系統。書中的步驟遵循由小到大、由淺入深的順序,跟隨這些步驟,讀者可以由壹個最簡單的引導扇區開始,逐漸完善代碼,擴充功能,最後形成壹個小的操作系統。

本書不僅介紹操作系統的各要素,同時涉及開發操作系統需要的各個方面,比如如何建立開發環境、如何調試以及如何在虛擬機中運行等。書中的實例操作系統采用IA32作為默認平臺,所以保護模式也作為必備知識儲備收入書中,而這是傳統的操作系統實踐書籍經常忽略的。總之,只要是開發自己的操作系統中需要的知識,書中都盡量涉及,以便於讀者參考。

眾所周知,壹個成型的操作系統往往非常復雜。如果考慮到操作系統作為軟硬件橋梁的特殊地位,那麽它可能看上去比壹般的軟件系統更難理解,因為其核心部分往往包含許多直接針對CPU、內存和 I/O端口的操作,它們夾雜在壹片代碼汪洋之中,顯得更加晦澀。

我們有許多源代碼公開的操作系統,可供隨時下載和閱讀,看上去好像讓實現壹個供自己把玩的微型操作系統變得容易很多,但事實往往不盡人意,因為這些代碼動輒上萬甚至幾十幾百萬行,而且細節之間經常互相關聯,要理解它們著實不易。我們有許多容易得到的操作系統教程,但讀來好像總覺得跟我們有隔膜,不親近。造成這些的根本原因,在於學習者壹開始就面對壹個完整的操作系統,或者面對前輩們積累了幾十年的壹系列理論成果。而無論作者多麽擅長寫作,讀者多麽聰明,或者代碼多麽優秀,要壹個初學者理清其中的頭緒都將是非常困難的。

我並非在此危言聳聽,因為這曾經是我的親身體會。當然,如果只是為了考試,幾本操作系統理論書籍就足夠了,妳不需要對細節那麽清楚。但如果是出於興趣呢?如果妳是想編寫自己的操作系統呢?妳會發現理論書籍好像壹下子變得無用武之地,妳會發現任何壹個細節上的理解錯誤都可能導致自己辛辛苦苦編寫的代碼運行異常甚至崩潰。

我經歷過這壹切!我曾經翻遍了壹本《操作系統:設計與實現》,也沒有找到實現壹個操作系統應該從何處著手。並不是這些書不好,也不是前人的代碼不優秀,而是作為壹無所知的初學者,我們所不了解的不僅是高居廟堂的理論知識,還有讓我們舉步維艱的實踐細節。

可能在這些教科書作者的眼裏,操作的細節不屬於課程的壹部分,或者這些細節看上去太容易,根本不值壹提,甚至作者認為這些屬於所謂“經驗”的壹部分,約定俗成是由讀者本人去摸索的。但是實際情況往往是,這些書中忽略掉的內容恰恰占去了壹個初學者大部分的時間,甚至影響了學習的熱情。

我至今仍記得當我開始編寫自己的操作系統時所遭受的挫敗感,那是壹種不知道如何著手的無助的感覺。還好我堅持了下來,克服了各種困難,並完成了自己的操作系統雛形。

進而我想到,壹定不只是我壹個人對編寫自己的操作系統懷有興趣,也壹定不只是我壹個人在實踐時遇到困難。或許我應該把自己的經歷寫下來,從而可以幫助跟我相似的後來者,就這樣,我編寫了本書的第壹版,也就是《自己動手寫操作系統》。我相信,如果妳也對神奇的計算機世界充滿好奇,並且希望通過自己編寫操作系統的方式來了解背後發生的故事,那麽妳壹定可以在這本書中得到壹些幫助。而假如妳真的因為我的書而重新燃起實踐的熱情,從而開始壹段操作系統旅程,我將會感到非常高興。

不過我得坦白,在寫作《自己動手寫操作系統》的時候,我並不敢期待它能引起多少反響,壹方面因為操作系統並不是時尚的話題,另壹方面我也是走在學習的路上,或許只是比讀者早走了壹小步而已。然而出乎我的意料,它面世後重印多次,甚至壹度登上銷量排行榜的榜首,這讓我覺得它的確有壹定的參考價值,我要借此機會感謝所有支持我的讀者。

在我寫作《自己動手寫操作系統》的時候,並沒有想過今天會有壹個第二版。原因在於,我希望這本書是用來填補空白的,而不是重復去做別人已經做得很好的事情。所謂填補空白,具體說就是讓像我壹樣的操作系統愛好者在讀完本書之後,能夠有信心去讀其他比較流行的開源的操作系統代碼,有能力從零開始自己動手寫操作系統,而這個任務第壹版已經完成了。

那麽為什麽我又寫作了第二版呢?原因有幾個方面。第壹,雖然第壹版未曾涉及的進程間通信、文件系統等內容在許多書中都有講解,但閱讀的時候還是感覺有語焉不詳的通病,作者本人可能很清楚原委,但寫得太簡略,以至於讀者看來未必清晰。第二,我自己想把這個圈畫圓。第壹版的書雖然完成了它的使命,但畢竟到書的結尾,讀者看到的不是壹個真正的操作系統,它沒有文件系統,沒有內存管理,什麽也幹不了。在第二版中,妳將會看到,妳已經可以通過交叉編譯的方式為我們的實驗性 OS編寫應用程序了,也就是說,它已經具備操作系統的基本功能,雖然仍然極其簡陋,但第壹個圈,畢竟是已經圓起來了。第三,實踐類的操作系統書籍還是太少了,以至於妳要想看看別人是怎麽做的,除了讀以《操作系統:設計與實現》為代表的極少數書籍之外,就是壹頭紮進源代碼中,而結果有時相當令人氣餒。我自己也氣餒過,所以我在第二版中,仍然試圖把話說細壹點,把自己的經驗拿出來分享。而且我選擇我能想到的最精簡的設計,以便讓讀者不至於陷入太多細節而無法看到全貌。我想這是本書可能具有的價值所在──簡化的易懂的設計,還有盡量詳細的文字。

在這壹版中,內容被劃分成上下兩篇。上篇基本上是第壹版的修訂,只是做了壹個調整,那便是在兼顧 Windows和Linux兩方面用戶的基礎上,默認在Linux下建立開發環境來編寫我們的操作系統。至於這樣做的原因,在本書第 2章有比較詳細的說明。當然,開發環境畢竟是第二位的,書中講述的內容以及涉及的代碼跟第壹版都是壹致的。本書的下篇全部都是新鮮內容,主要是增加了進程間通信、文件系統和內存管理。跟第壹版的做法相同,下篇仍然不僅關註結果,更加致力於將形成壹個結果的過程呈現出來。與此同時,由於本書旨在分享和引路,所以盡可能地簡化了設計,以便將最重要的部分凸顯出來。讀者將看到,壹個操作系統的文件系統和內存管理可以簡陋到什麽程度。簡陋不是缺點,對於我們初學者而言,正是需要從簡陋入手。換言之,如果妳已經對實現壹個操作系統有了壹定的經驗,那麽這本書可能不適合妳。這本書適合從來沒有編寫過操作系統的初學者。

本書的排版是我用L ATEX自己完成的。在排版中我花了壹些工夫,因為我希望讀者購買的首先是壹本易於閱讀且賞心悅目的書,其次才是編寫操作系統的方法。另外,書中列出的代碼均由我自己編寫的程序自動嵌入L ATEX源文件,從而嚴格保證書和光盤的壹致性,讀者可以根據文件名和行號方便地找到光盤中

代碼的準確位置。

此外,在第二版中還有壹些小的變化。首先是操作系統的名字改變了,原因在於雖然我們的試驗性

OS從前輩們那裏借鑒了很多東西,但其各個部分的設計(比如文件系統和內存管理)往往有其獨特之處,所以我將原先的 Tinix(本意為 TryMinix)改成了新名字Orange ’S(這個名字來自於我的妻子 ,),以表示它們的不同。另外,書中的代碼風格,有些地方也做了調整。

我想,雖然第二版有著這樣那樣的變化,但有壹點沒有變,那就是本書試圖將我在編寫自己操作系統的過程中的經驗盡可能地告訴讀者,同時盡可能將我當初的思路和編碼過程呈現出來。很可能讀者比我更聰明,有更好的解決問題的方法,但無論如何,我認為我自己的經驗可以為讀者所借鑒。如果真是如

此,我將會非常欣慰。

在第二版的編寫過程中,我同樣要感謝許多人。感謝我的父母和爺爺對我的愛,並希望爺爺不要為我擔心,寫書是件辛苦的事,但同時也使我收獲良多。爸爸在第二版的最後階段幫我訂正文字,這本書裏有妳的功勞。我要感謝博文視點的各位朋友,感謝郭老師的理解和支持,感謝李玲的辛勤工作,感謝江立和李冰,妳們的高效讓我非常欽佩。我還要感謝孟巖老師,妳給我的鼓勵我壹直記在心裏。我要感謝我的摯友郭洪橋,不僅僅因為妳在技術上給我的幫助,更加因為妳在精神上給我的支持。感謝我的同事和朋友張會昌,妳在技術上的廣度和深度總令我欽佩。另外,在第壹版中幫助我的人,我要再次謝謝妳們,因為沒有第壹版,也就沒有第二版。

在所有人中我最應該感謝和最想感謝的,是我的妻子黃丹紅,感謝妳給我的所有建議,還有妳幫我畫的圖。尤其是,當這本書在我預想的時間內沒有完成的時候,當我遇到困難遲遲不能解決的時候,妳總在壹旁給我鼓勵,在妳那裏,我從來都能感覺到壹種溫暖,我深知,如果沒有妳的支持,我無法堅持下來將書寫完。謝謝妳,這本書同樣屬於妳。

跟第壹版相比,這本書涉及的內容觸及操作系統設計的更多方面,而由於筆者的水平實在有限,難免有紕漏甚至錯誤。如果讀者有任何的問題、意見或建議,讓我們***同探討,***同進步。

本書導讀

這本書適合誰

本書是壹本操作系統實踐的技術書籍。對於操作系統技術感興趣,想要親身體驗編寫操作系統過程的實踐主義者,以及Minix、Linux源代碼愛好者,都可以在本書中得到實踐中所需的知識和思路。

本書以“動手寫”為指導思想,只要是跟“動手寫”操作系統有關的知識,都作為介紹對象加以討論,所以,從開發環境的搭建,到保護模式,再到IBMPC中有關芯片的知識,最後到操作系統本身的設計實現,都能在本文中找到相應介紹。所以如果妳也想親身實踐的話,本書可以省去妳在書店和互聯網尋找相應資料的過程,使妳的學習過程事半功倍。在讀完本書後,妳不但可以獲得對於操作系統初步的感性認識,並且對 IBMPC的接口、IA架構之保護模式,以及操作系統整體上的框架都將會有壹定程度的了解。

筆者相信,當妳讀完本書之後,如果再讀那些純理論性的操作系統書籍,所獲得的體驗將會完全不同,因為那些對妳而言不再是海市蜃樓。

對於想閱讀 Linux源代碼的操作系統愛好者,本書可以提供閱讀前所必要的知識儲備,而這些知識儲備不但在本書中有完整的涉及,而且在很多 Linux書籍中是沒有提到的。

特別要提到的是,對於想通過閱讀 Andrew S. Tanenbaum和 Albert S. 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”。

  • 上一篇:Android編程:如何在子線程中更新TextView控件
  • 下一篇:高級戰術索引源代碼
  • copyright 2024編程學習大全網