出版時間:2011-6-20 出版社:機械工業(yè)出版社華章公司 作者:新設計團隊 頁數(shù):444
Tag標簽:無
前言
很早就有一個想法,做中國人自己的、有所突破、有所創(chuàng)新的操作系統(tǒng)、計算機語言及編譯平臺。我?guī)ьI的“新設計團隊”(主要由中國科學院研究生院已畢業(yè)的學生組成)在實際開發(fā)自己的操作系統(tǒng)的過程中,最先遇到的問題就是如何培養(yǎng)學生真正看懂Linux操作系統(tǒng)的源代碼的能力。開源的Linux操作系統(tǒng)的源代碼很容易找到,但很快就會發(fā)現(xiàn),培養(yǎng)學生看懂Linux操作系統(tǒng)的源代碼是一件非常非常困難的事。操作系統(tǒng)的代碼量通常都是非常龐大的,動輒幾百萬行,即使是瀏覽一遍也要很長時間。比龐大的代碼量更讓學習者絕望的是操作系統(tǒng)有著極其錯綜復雜的關系??瓷先ィa的執(zhí)行序時隱時現(xiàn),很難抓住脈絡。代碼之間相互牽扯,相互勾連,幾乎無法理出頭緒。更談不上理解代碼背后的原理、意圖和思想。對于學生而言,選擇從源代碼的什么地方開始分析本身就是一個難題。通常,學生有兩種選擇:一種是從main函數(shù),也就是從C語言代碼的總入口開始,沿著源代碼的調(diào)用路線一行一行地看下去,學生很快就會發(fā)現(xiàn)源代碼的調(diào)用路線莫名其妙地斷了,但直覺和常識告訴他操作系統(tǒng)肯定不會在這個地方停止,一定還在繼續(xù)運行,但卻不知道后續(xù)的代碼在哪里,這種方法很快就走進了死胡同;另一種則是從某一模塊入手,如文件系統(tǒng),但這樣會無形中切斷操作系統(tǒng)源碼之間復雜的關系,如文件系統(tǒng)與進程管理的關系,文件系統(tǒng)與內(nèi)存管理的關系,等等。使學生孤立地去理解一個模塊,往往只能記住一些名詞和簡單概念,難以真正理解操作系統(tǒng)的全貌。用學生的話講,他們理解的操作系統(tǒng)變成了“文科”的操作系統(tǒng)。由于操作系統(tǒng)是底層系統(tǒng)程序,對應用程序行之有效的調(diào)試和跟蹤等手段對操作系統(tǒng)的源代碼而言,幾乎無效。就算把每一行源代碼都看懂了,對源代碼已經(jīng)爛熟于心,知道這一行是一個for循環(huán),那一行是一個調(diào)用……但仍然不知道整個代碼究竟在做什么,以及起什么作用,更不知道設計者的意圖究竟是什么。我們在操作系統(tǒng)的課程上學習過進程管理、內(nèi)存管理、文件系統(tǒng)等基礎知識,但是這些空洞的理論在一個實際的操作系統(tǒng)中是如何實現(xiàn)的卻不得而知。他們在源代碼中很難看出進程和內(nèi)存之間有什么關聯(lián),內(nèi)核程序和用戶程序有什么區(qū)別,為什么要有這些區(qū)別。也很難從源代碼中看清楚,我們實際經(jīng)常用到的操作,比如打開文件,操作系統(tǒng)在其中都做了哪些具體的工作?想在與常見的應用程序的編程方法有巨大差異的、晦澀難懂的、浩瀚如海的操作系統(tǒng)底層源代碼中找到這些問題的答案,似乎比登天還難。對熟悉操作系統(tǒng)源代碼的學生而言,他們也知道像分頁機制這樣知識點,但是未必能夠真正理解隱藏在機制背后的深刻意義。這些都是學生在學習Linux操作系統(tǒng)源代碼時遇到的實際問題。中國科學院研究生院的學生應該是年輕人中的佼佼者,他們遇到的問題可能其他讀者也會遇到。我萌發(fā)了一個想法,雖然學生的問題早已解決,但是否可以把他們曾經(jīng)在學習、研發(fā)操作系統(tǒng)的過程中遇到的問題和心得體會得拿出來供廣大讀者分享?當時,針對學生的實際問題,我的解決方法是以一個真實的操作系統(tǒng)為例,讓學生理解源代碼,把操作系統(tǒng)在內(nèi)存中的運行時狀態(tài)畫出圖來。實踐證明,這個方法簡單有效。現(xiàn)在我們把這個解決方案體現(xiàn)在這本書中。就是以一個真實的操作系統(tǒng)的實際運行為主線;以圖形、圖像為核心,突出描述操作系統(tǒng)在實際運行過程中內(nèi)存的運行時結構;強調(diào)站在操作系統(tǒng)設計者的視角,用體系的思想方法,整體把握操作系統(tǒng)的行為、作用、目的和意義。在全書的講解過程中,我們不僅詳細分析了源代碼、分析了操作系統(tǒng)的執(zhí)行序,我們還特別分析了操作系統(tǒng)都作了哪些“事”,并且把“事”與“事”之間的關系和來龍去脈,這些“事”意味著什么,為什么要做這些“事”,這些“事”背后的設計思想是什么……都做了非常詳細且深入的分析。更重要的是,對于所有重要的階段,我們幾乎都用圖解的方式把操作系統(tǒng)在內(nèi)存中的實際運行狀態(tài)精確地表示了出來。我們用600dpi的分辨率精心繪制了349張圖,圖中表現(xiàn)的運行時結構和狀態(tài)與操作系統(tǒng)實際運行的真實狀態(tài)完全吻合。每一條線、每一個色塊、每一個位置、每一個地址及數(shù)字都經(jīng)過了我們認真反復地推演和求證,并最終在計算機上進行了核對和驗證??戳诉@些繪制精美的圖后,在讀者的頭腦中就不再是一行行、一段段枯燥的、令人眩暈的源代碼,而是立體呈現(xiàn)的一件件清晰的“事”,以及這些“事”在內(nèi)存中直截了當、清晰鮮活的畫面。用這樣的方法講解操作系統(tǒng)是本書的一大特色。理解這些圖要比理解源代碼和文字容易得多,毫不夸張地說,只要你能理解這些圖,你就理解了操作系統(tǒng)的80%,這時你可以自豪的說,你比大多數(shù)用別的方法學過操作系統(tǒng)的人的水平都要高出一大截。作者和機械工業(yè)出版社的編輯作了大量的檢索工作,就我們檢索的范圍而言,這樣的創(chuàng)作方法及具有這樣特色的操作系統(tǒng)專著在世界范圍都是第一次。我們分三個部分來講解Linux操作系統(tǒng):第一部分由第1章和第2章組成,分析了從開機加電到操作系統(tǒng)啟動完成并進入怠速狀態(tài)的整個過程;第二部分由第3章、第4章、第5章、第6章、第7章組成,講述了操作系統(tǒng)進入系統(tǒng)怠速后,在執(zhí)行用戶程序的過程中,操作系統(tǒng)和用戶進程的實際運行過程和狀態(tài);第三部分由第8章組成,闡述整個Linux操作系統(tǒng)的設計指導思想,本章內(nèi)容是從微觀到宏觀的回歸。第一部分,我們詳細講解了開機加電啟動BIOS,通過BIOS加載操作系統(tǒng)程序,對主機的初始化,打開保護模式和分頁,調(diào)用main函數(shù),創(chuàng)建進程0、進程1、進程2以及shell進程,并且具備用文件的形式與外設交互。第二部分,我們設計了幾個盡可能簡單又有代表性的應用程序,并以這些程序的執(zhí)行為引導,詳細講解了安裝文件系統(tǒng)、文件操作、用戶進程與內(nèi)存管理、多個進程對文件的操作以及進程間通信。我們將操作系統(tǒng)的原理自然而然地融入到了講解真實操作系統(tǒng)的實際運行過程中。在讀者看來,操作系統(tǒng)原理不再是空對空的、“文科”概念的計算機理論,而是既有完整的、體系的理論,又有真實、具體、實際的代碼和案例,理論與實際緊密耦合。第三部分是全書水平最高的部分,我們嘗試從操作系統(tǒng)設計者的視角講解操作系統(tǒng)的設計指導思想。詳細闡述了主奴機制以及實現(xiàn)主奴機制的三項關鍵技術:保護和分頁、特權級、中斷,分析了保障主奴機制實現(xiàn)的決定性因素——先機,還詳細講解了緩沖區(qū)、共享頁面、信號、管道的設計指導思想。希望幫助讀者用體系的思想理解、把握、駕馭整個操作系統(tǒng)以及背后的設計思想和設計意圖。在本書中,我們詳細講解了大家在學習操作系統(tǒng)的過程中可能會遇到的每一個難點,如main函數(shù)中的pause()調(diào)用,雖然已經(jīng)找不到后續(xù)代碼,但該調(diào)用結束后,程序仍然執(zhí)行的原因是:中斷一經(jīng)打開,進程調(diào)度就開始了,而此時可以調(diào)度的進程只有進程1,所以后續(xù)的代碼應該從進程1處繼續(xù)執(zhí)行……我們還對一些讀者不容易理解和掌握的操作系統(tǒng)特有的底層代碼的編程技巧作了詳細的講解。如用模擬call的方法,通過ret指令“調(diào)用”main函數(shù)…………總之,我們所做的一切努力就是想真正解決讀者遇到的實際問題和難題,給予讀者有效的幫助。我們盼望即使是剛剛考入大學的學生也有興趣和信心把這本書讀下去;我們同樣希望即使是對操作系統(tǒng)源代碼很熟悉的讀者,這本書也能給他們一些不同的視角、方法和體系性思考。這本書選用的操作系統(tǒng)源代碼是Linux 0.11。對為什么選用Linux 0.11而不是最新版本,趙炯先生有過非常精彩的論述,我們認為趙先生的論述是非常到位的。我們不妨看一下Linux最新的版本2.6,代碼量大約在千萬行這個量級,去掉其中的驅動部分,代碼量仍在百萬行這個量級。一個人一秒鐘看一行,一天看8小時,中間不吃、不喝、不休息,也要看上幾個月,很難想象如何去理解。就算我們硬要選用Linux 2.6,就算我們寫上3000頁(書足足會有十幾厘米厚),所有的篇幅都用來印代碼,也只能印上不到十分之一的代碼。所以,即使是這么不切實際的篇幅,也不可能整體講解Linux 2.6。讀者會逐漸明白,對于理解和掌握操作系統(tǒng)而言,真正有價值的是整體、是體系,而不是局部。Linux 0.11的內(nèi)核代碼雖然只有約兩萬行,但卻是一個實實在在、不折不扣的現(xiàn)代操作系統(tǒng),因為它具有現(xiàn)代操作系統(tǒng)最重要的特征——支持實時多任務,所以必然支持保護和分頁……而且它還是后續(xù)版本的真正的始祖,有著內(nèi)在的、緊密的傳承關系。讀者更容易看清設計者最初的、最根本的設計意圖和設計指導思想。Linux 0.11已經(jīng)問世20年了,被世人廣為研究和學習。換一個角度看,要想在眾人熟悉的事物和領域講出新意和特色,對作者來說也是一個強有力的挑戰(zhàn)。這本書能夠順利出版,我們首先要感謝機械工業(yè)出版社華章公司的副總經(jīng)理溫莉芳女士以及其他領導,是他們的決心和決策成就了這本書,并且在幾乎所有方面給予了強有力的支持。特別令人感動的是他們主動承擔了全部的出版風險,同時給予了作者最好的條件,讓我們看到一個大出版社的氣度和風范。其次,我們還要感謝的是機械工業(yè)出版社華章公司的編輯楊福川。楊先生的鑒賞力和他的事業(yè)心以及他對工作認真負責的態(tài)度為這本書的出版打開了大門。楊先生對讀者的理解以及他的計算機專業(yè)素養(yǎng)使得他有能力對這本書給予全方位的指導和幫助,使我們對這本書整體修改了6次,使之更貼近讀者,可讀性更好。我們還要感謝我們和楊福川先生共同的朋友張國強先生和楊縉女士。最后,我們要感謝我們的家人和朋友。是他們堅定的支持才使得我們的整個團隊能夠拒絕方方面面、形形色色的誘惑,放棄普遍追求的短期利益,在常人難以想象的艱苦條件下,長時間專注于操作系統(tǒng)、計算機語言、編譯器、計算機體系結構等基礎性學科的研究。認認真真、踏踏實實、不為名利,做了一點實在、深入的工作,有了一點能湊合拿得出手的10年積累,以及一支敢想、敢干、敢打、敢拼、不懼世界頂級強敵的隊伍。這些是本書的基礎。楊力祥中國科學院研究生院2011年5月
內(nèi)容概要
關于Linux內(nèi)核的書已經(jīng)不計其數(shù),但這本書卻是獨樹一幟的,它的內(nèi)容代表著Linux內(nèi)核研究成果的世界頂尖級水平,它在世界范圍內(nèi)首次提出并闡述了操作系統(tǒng)設計的核心指導思想——主奴機制,這是所有操作系統(tǒng)研究者的一筆寶貴財富。本書可能也代表著同類圖書的頂尖水平,是一本真正能引導我們較為容易地、極為透徹地理解Linux內(nèi)核的經(jīng)典之作,也可能是當前唯一能從本質上指引我們?nèi)ピO計和開發(fā)擁有自主知識產(chǎn)權的操作系統(tǒng)的著作。它的出版也許會成為Linux內(nèi)核研究領域的一個里程碑事件。
本書的最大特點是它的寫作方式和內(nèi)容組織方式,與同類書完全不同。它在深刻地分析了傳統(tǒng)講解方法的利弊之后,破舊立新,從認知學的角度開創(chuàng)了一種全新的方式。以操作系統(tǒng)的真實運行過程為主線,結合真實的內(nèi)核源代碼、349幅精確的內(nèi)核運行時序圖和具有點睛之妙的文字說明,對操作系統(tǒng)從開機加電到系統(tǒng)完全準備就緒的整個過程進行了系統(tǒng)而完整地分析,深刻地揭示了其間每一個動作的設計意圖和實現(xiàn)原理,完美地再現(xiàn)了操作系統(tǒng)設計者的設計思路。閱讀本書就如同跟隨著操作系統(tǒng)設計者一起去思考,我們會在閱讀的過程中發(fā)現(xiàn)Linux內(nèi)核設計的精妙,會發(fā)現(xiàn)原來處處都“暗藏玄機”,哪怕是一行很短的代碼。
本書在所有細節(jié)上都力求完美。為了保證知識的準確性,操作系統(tǒng)運行過程中的每個動作都經(jīng)過了嚴格的考證;為了讓我們真正理解Linux內(nèi)核的原理,它突破傳統(tǒng),以Linux的真實運行過程為主線進行講解;為了做到真正易于理解,創(chuàng)新性地使用了圖解的方式,精心繪制了349幅分辨率600dpi的時序圖,圖中表現(xiàn)的運行時結構和狀態(tài)與操作系統(tǒng)實際運行時的真實狀態(tài)完全吻合;為了提高閱讀體驗,本書采用了雙色印刷,以便于我們更清楚地觀察每一幅圖中的細節(jié)。
作者簡介
新設計團隊始于世紀之交,不斷發(fā)展、優(yōu)勝劣汰、適者生存、自然形成。團隊始終不自量力地奉行高舉高打的策略,只對計算機領域中基礎的、有體系的事情感興趣,且只做自己感興趣的事。團隊不相信二流水平、三流心態(tài),能作出世界頂級的工作。團隊相信成功的決定因素是人,而不是物。團隊對藝術、對鑒賞力、對欣賞品味、對一切美好的事物都有著近乎狂熱的追求。認為科學、技術的最高境界是藝術,認為世界的本源是通的。團隊崇尚理論體系、崇尚個性鮮明、崇尚獨立思考?!皼]體系”是團隊成員之間善意貶損的常用語,也是判斷一件事是否值得關注的標準之一。團隊鄙視抄襲、弄虛作假。對別人熱炒、做熟的事情不感興趣,更不喜歡在別人的體系上狗尾續(xù)貂、移花接木,粉飾為“自主創(chuàng)新”。團隊強調(diào)理論,注重實踐,講究科學的研究方法,不屈膝權威,不迷信盲從。提出基礎假設,構建邏輯自洽的體系,證偽、修正、再證偽、再修正,不斷推進體系的完善。團隊鉆研學術,但決不死板,學術和商業(yè)結合,彼此互為推進,最終改變整個時代的商業(yè)格局,是團隊追求的目標。團隊特別注重誠信,提倡公平、公正。團隊內(nèi)部是一方凈土,既相互競爭,又相互幫助、相互協(xié)作。團隊成員都在高高興興做自己喜歡的、感興趣的事,沒有時間顧及其他。勾心斗角、爾虞我詐、溜須拍馬、拉幫結派……,在團隊內(nèi)部沒有市場。團隊在上述思想的指導下,研發(fā)了基于圖形、圖像(而非基于字符、語句)的圖示化程序設計集成開發(fā)環(huán)境,已成功的移植了linux 0.11,正確編譯,正確boot,正確運行?,F(xiàn)在正在研發(fā)新的操作系統(tǒng),已初步實現(xiàn)了與現(xiàn)有的基于塊概念的文件系統(tǒng)有較大差異的新的文件系統(tǒng),據(jù)我們測試,相對于基于塊設備的文件系統(tǒng),在文件的讀寫速度上有較大優(yōu)勢?!禠inux內(nèi)核設計的藝術》一書,體現(xiàn)了我們設計新操作系統(tǒng)的過程中,對操作系統(tǒng)的理解??赡茉诓痪玫膶?,我們也將我們在設計圖示化程序設計平臺中,對編譯原理的理解,奉獻給廣大讀者。
書籍目錄
前言
第1章 從開機加電到執(zhí)行main函數(shù)之前的過程1
1.1 啟動BIOS,準備實模式下的中斷向量表和中斷服務程序1
1.1.1 BIOS的啟動原理2
1.1.2 BIOS在內(nèi)存中加載中斷向量表和中斷服務程序3
1.2 加載操作系統(tǒng)內(nèi)核程序并為保護模式做準備4
1.2.1 加載第一部分代碼—引導程序(bootsect)5
1.2.2 加載第二部分代碼—setup7
1.2.3 加載第三部分代碼—system模塊12
1.3 開始向32位模式轉變,為main函數(shù)的調(diào)用做準備16
1.3.1 關中斷并將system移動到內(nèi)存地址起始位置0x0000016
1.3.2 設置中斷描述符表和全局描述符表18
1.3.3 打開A20,實現(xiàn)32位尋址20
1.3.4 為在保護模式下執(zhí)行head.s做準備21
1.3.5 head.s開始執(zhí)行24
1.4 本章小結41
第2章 從main到怠速42
2.1 開中斷之前的準備工作43
2.1.1 復制根設備號和硬盤參數(shù)表 44
2.1.2 物理內(nèi)存規(guī)劃格局45
2.1.3 虛擬盤設置與初始化46
2.1.4 內(nèi)存管理結構mem_map初始化47
2.1.5 異常處理類中斷服務程序掛接48
2.1.6 初始化塊設備請求項結構50
2.1.7 與建立人機交互界面相關的外設的中斷服務程序掛接52
2.1.8 開機啟動時間設置55
2.1.9 系統(tǒng)開始激活進程056
2.1.10 進程相關事務初始化設置57
2.1.11 時鐘中斷設置59
2.1.12 系統(tǒng)調(diào)用服務程序掛接59
2.1.13 初始化緩沖區(qū)管理結構61
2.1.14 初始化硬盤63
2.1.15 初始化軟盤65
2.1.16 開中斷66
2.2 進程創(chuàng)建的最基本動作67
2.2.1 操作系統(tǒng)為進程0創(chuàng)建進程1做準備67
2.2.2 在進程槽中為進程1 申請一個空閑位置并獲取進程號71
2.2.3 復制進程信息之前,先將一些數(shù)據(jù)壓棧73
2.2.4 初步設置進程1管理結構74
2.2.5 進程0創(chuàng)建進程1的過程中發(fā)生時鐘中斷76
2.2.6 從時鐘中斷返回78
2.2.7 調(diào)整進程1管理結構79
2.2.8 設置進程1的線性地址空間及物理頁面81
2.2.9 繼續(xù)調(diào)整進程1管理結構84
2.2.10 操作系統(tǒng)如何區(qū)分進程0和進程187
2.2.11 進程0準備切換到進程189
2.2.12 系統(tǒng)切換到進程1執(zhí)行90
2.3 加載根文件系統(tǒng)92
2.3.1 進程1如何開始執(zhí)行96
2.3.2 進程1開始執(zhí)行98
2.3.3 進程1開始以數(shù)據(jù)塊的形式操作硬盤99
2.3.4 將找到的緩沖塊與請求項掛接101
2.3.5 將請求項與硬盤處理函數(shù)掛接104
2.3.6 進行硬盤讀盤前的準備工作105
2.3.7 給硬盤下達讀盤指令106
2.3.8 進程1由于等待讀盤操作掛起107
2.3.9 系統(tǒng)切換到進程0執(zhí)行109
2.3.10 進程0的執(zhí)行過程110
2.3.11 進程0執(zhí)行過程中發(fā)生硬盤中斷111
2.3.12 硬盤中斷服務程序響應后,進程0繼續(xù)執(zhí)行113
2.3.13 再次響應硬盤中斷并喚醒進程1114
2.3.14 讀盤操作完成后,進程1繼續(xù)執(zhí)行116
2.3.15 進程1繼續(xù)設置硬盤管理結構117
2.3.16 進程1獲取軟盤超級塊,為加載根文件系統(tǒng)做準備118
2.3.17 進程1備份超級塊數(shù)據(jù)119
2.3.18 進程1將根文件系統(tǒng)從軟盤拷貝到虛擬盤120
2.3.19 進程1開始加載根文件系統(tǒng)122
2.3.20 進程1準備加載根文件系統(tǒng)超級塊123
2.3.21 進程1加載根文件系統(tǒng)超級塊124
2.3.22 進程1繼續(xù)加載根文件系統(tǒng)126
2.3.23 進程1準備讀取根目錄i節(jié)點127
2.3.24 進程1加載根目錄i節(jié)點128
2.3.25 進程1結束加載根文件系統(tǒng)的過程129
2.4 打開終端設備文件及復制文件句柄131
2.4.1 進程1與內(nèi)核文件表掛接,為打開文件做準備133
2.4.2 確定打開操作的起點135
2.4.3 獲得枝梢i節(jié)點—dev目錄文件的i節(jié)點136
2.4.4 確定dev目錄文件i節(jié)點為枝梢i節(jié)點137
2.4.5 繼續(xù)返回枝梢i節(jié)點138
2.4.6 查找tty0文件的i節(jié)點138
2.4.7 將tty0設備文件的i節(jié)點返回給sys_open系統(tǒng)調(diào)用 139
2.4.8 分析tty0文件i節(jié)點140
2.4.9 設置文件管理結構并返回給用戶進程141
2.4.10 進程1復制tty0文件句柄142
2.4.11 進程1繼續(xù)復制tty0文件句柄144
2.5 創(chuàng)建進程2145
2.5.1 進程1準備創(chuàng)建進程2145
2.5.2 復制進程2管理結構并進行調(diào)整146
2.5.3 設置進程2的頁目錄項并復制進程2的頁表146
2.5.4 調(diào)整進程2管理結構中與文件有關的內(nèi)容146
2.5.5 進程1執(zhí)行過程中發(fā)生時鐘中斷148
2.5.6 進程1從時鐘中斷返回,準備切換到進程2150
2.6 進程1等待進程2退出150
2.6.1 進程1查找它自己的子進程151
2.6.2 對進程2的狀態(tài)進行處理151
2.6.3 切換到進程2執(zhí)行153
2.7 shell程序的加載154
2.7.1 進程2開始執(zhí)行156
2.7.2 為打開/etc/rc文件做準備156
2.7.3 進程2打開“/etc/rc”配置文件157
2.7.4 通過壓棧為加載shell文件做準備158
2.7.5 為參數(shù)和環(huán)境變量設置做準備159
2.7.6 得到shell文件的i節(jié)點160
2.7.7 為加載參數(shù)和環(huán)境變量做準備161
2.7.8 根據(jù)i節(jié)點,對shell文件進行檢測162
2.7.9 檢測shell文件頭163
2.7.10 備份文件頭并進行分析163
2.7.11 對shell文件進行進一步分析165
2.7.12 拷貝參數(shù)和環(huán)境變量166
2.7.13 調(diào)整進程2的管理結構167
2.7.14 繼續(xù)調(diào)整進程2管理結構168
2.7.15 釋放進程2繼承的頁面169
2.7.16 檢測協(xié)處理器170
2.7.17 調(diào)整shell程序所在的線性空間地址171
2.7.18 為shell程序準備參數(shù)和環(huán)境變量172
2.7.19 繼續(xù)調(diào)整進程2管理結構173
2.7.20 調(diào)整EIP,使其指向shell程序入口地址173
2.7.21 shell程序執(zhí)行引發(fā)缺頁中斷175
2.7.22 缺頁中斷中shell程序加載前的檢測175
2.7.23 為即將載入的內(nèi)容申請頁面177
2.7.24 將shell程序載入新獲得的頁面177
2.7.25 根據(jù)shell程序的情況,調(diào)整頁面的內(nèi)容178
2.7.26 將線性地址空間與程序所在的物理頁面對應179
2.8 系統(tǒng)實現(xiàn)怠速180
2.8.1 shell進程準備創(chuàng)建update進程180
2.8.2 進程2開始執(zhí)行/etc/rc文件181
2.8.3 準備加載update進程181
2.8.4 update進程的作用182
2.8.5 shell程序檢測“/etc/rc”文件183
2.8.6 shell進程退出184
2.8.7 shell進程退出善后處理185
2.8.8 進程1清理shell進程管理結構187
2.8.9 系統(tǒng)開始重建shell190
2.8.10 shell進程為何不會再次退出192
2.9 小結194
第3章 安裝文件系統(tǒng)195
3.1 獲取硬盤設備號196
3.1.1 用戶發(fā)出安裝硬盤文件系統(tǒng)指令196
3.1.2 從分析路徑開始,準備查找hd1設備的掛接點197
3.1.3 以根目錄i節(jié)點為依托,得到dev目錄文件的i節(jié)點197
3.1.4 從dev目錄文件中找到代表hd1設備文件的目錄項198
3.1.5 得到hd1設備文件的i節(jié)點號199
3.1.6 釋放dev目錄文件的相關內(nèi)容200
3.1.7 得到hd1設備文件的i節(jié)點200
3.1.8 獲得hd1設備的設備號200
3.1.9 釋放hd1設備文件的i節(jié)點201
3.2 獲取虛擬盤上的掛接點202
3.3 得到hd1設備文件的超級塊202
3.3.1 準備讀取hd1設備文件超級塊203
3.3.2 為hd1設備文件的超級塊找到存儲位置203
3.3.3 初始化空閑超級塊并加鎖203
3.3.4 從硬盤獲得hd1設備文件的超級塊204
3.3.5 加載邏輯塊位圖和i節(jié)點位圖205
3.4 將hd1設備文件與mnt目錄文件的i節(jié)點掛接206
3.5 小結207
第4章 文件操作208
4.1 打開文件211
4.1.1 用戶程序調(diào)用open庫函數(shù)產(chǎn)生軟中斷212
4.1.2 建立用戶進程與文件管理表的關系213
4.1.3 從硬盤上獲取helloc.txt文件的i節(jié)點214
4.1.4 將helloc.txt文件與文件管理表相掛接226
4.2 讀文件227
4.2.1 為按照用戶要求讀入文件做準備228
4.2.2 確定要讀入的數(shù)據(jù)塊的位置230
4.2.3 將指定的數(shù)據(jù)塊從硬盤讀入到高速緩沖塊233
4.2.4 將數(shù)據(jù)拷貝到用戶指定的內(nèi)存234
4.3 新建文件237
4.3.1 查找路徑“/mnt/user/hello.txt”238
4.3.2 為hello.txt文件新建一個i節(jié)點240
4.3.3 為hello.txt文件新建目錄項242
4.3.4 完成hello.txt新建操作并返回給用戶進程245
4.4 寫文件246
4.4.1 文件寫入前的準備工作248
4.4.2 確定hello.txt文件的寫入位置249
4.4.3 為數(shù)據(jù)的寫入申請緩沖塊252
4.4.4 將指定的寫入數(shù)據(jù)從用戶數(shù)據(jù)區(qū)拷貝到緩沖塊253
4.4.5 數(shù)據(jù)同步到硬盤的方法1255
4.4.6 將文件寫入硬盤的情況2257
4.5 修改文件260
4.5.1 對文件的當前操作指針進行重定位261
4.5.2 對文件進行修改261
4.6 關閉文件263
4.6.1 當前進程與文件管理表“脫鉤”264
4.6.2 將文件管理表中hello.txt對應的引用次數(shù)減1265
4.6.3 hello.txt文件與文件管理表“脫鉤”266
4.7 刪除文件268
4.7.1 系統(tǒng)準備刪除hello.txt文件268
4.7.2 刪除hello.txt文件在硬盤上對應的數(shù)據(jù)和i節(jié)點270
4.7.3 對hello.txt文件所在的user目錄做處理275
4.8 本章小結275
第5章 用戶進程與內(nèi)存管理277
5.1 用戶進程的創(chuàng)建277
5.1.1 為創(chuàng)建進程str1準備條件277
5.1.2 為str1進程管理結構找到存儲空間279
5.1.3 復制str1進程管理結構281
5.1.4 確定str1進程在線性空間中的位置282
5.1.5 復制str1進程頁表并設置其對應的頁目錄項283
5.1.6 調(diào)整str1進程中與文件相關的結構285
5.1.7 建立str1進程與全局描述符表GDT的關聯(lián)286
5.1.8 將str1進程設為就緒態(tài)287
5.2 為用戶進程str1的加載做準備288
5.2.1 為str1進程加載自身對應的程序做準備288
5.2.2 讀取str1可執(zhí)行文件的i節(jié)點并統(tǒng)計參數(shù)和環(huán)境變量289
5.2.3 讀取str1可執(zhí)行文件的文件頭290
5.2.4 對str1可執(zhí)行程序文件頭進行分析291
5.2.5 拷貝str1可執(zhí)行程序的參數(shù)和環(huán)境變量292
5.2.6 調(diào)整str1進程管理結構中可執(zhí)行程序對應的i節(jié)點292
5.2.7 繼續(xù)調(diào)整str1進程管理結構—文件和信號相關的字段293
5.2.8 釋放str1進程的頁表294
5.2.9 重新設置str1的程序代碼段和數(shù)據(jù)段295
5.2.10 創(chuàng)建環(huán)境變量和參數(shù)指針表296
5.2.11 繼續(xù)根據(jù)str1可執(zhí)行程序情況調(diào)整str1進程管理結構297
5.2.12 設置str1可執(zhí)行程序的棧指針和eip值297
5.3 對缺頁中斷的處理298
5.3.1 產(chǎn)生缺頁中斷并由操作系統(tǒng)響應298
5.3.2 為str1程序申請一個內(nèi)存頁面299
5.3.3 將str1程序加載到新分配的頁面中300
5.3.4 檢測是否需要對頁面剩余空間清0300
5.3.5 將str1程序占用的物理內(nèi)存地址與str1進程的線性地址空間對應301
5.3.6 不斷通過缺頁中斷加載str1程序的全部內(nèi)容301
5.3.7 str1程序需要壓棧302
5.3.8 str1程序第一次調(diào)用foo程序壓棧302
5.3.9 str1程序第二次壓棧,產(chǎn)生缺頁中斷302
5.3.10 處理str1程序第二次壓棧產(chǎn)生的缺頁中斷302
5.3.11 str1程序繼續(xù)執(zhí)行,反復壓棧并產(chǎn)生缺頁中斷303
5.3.12 str1程序運行結束后清棧303
5.4 str1用戶進程的退出305
5.4.1 str1進程準備退出305
5.4.2 釋放str1程序所占頁面305
5.4.3 解除str1程序與文件有關的內(nèi)容并給父進程發(fā)信號306
5.4.4 str1程序退出后執(zhí)行進程調(diào)度307
5.5 多個用戶進程“同時”運行308
5.5.1 依次創(chuàng)建str1、str2和str3進程308
5.5.2 str1進程壓棧的執(zhí)行效果309
5.5.3 str1運行過程中產(chǎn)生時鐘中斷并切換到str2執(zhí)行309
5.5.4 str2執(zhí)行過程遇到時鐘中斷切換到str3執(zhí)行310
5.5.5 三個程序執(zhí)行一段時間后在主內(nèi)存的分布格局311
5.6 進程的調(diào)度與切換311
5.6.1 str1剛被shell創(chuàng)建并處于就緒態(tài)311
5.6.2 shell進程將自己掛起,然后準備切換到str1執(zhí)行311
5.6.3 準備切換到str1進程執(zhí)行312
5.6.4 str1執(zhí)行時發(fā)生時鐘中斷314
5.6.5 時鐘中斷遞減str1運行的時間片315
5.6.6 str1執(zhí)行一段時間后掛起,shell進程新建str2進程315
5.6.7 str2運行期間發(fā)生時鐘中斷316
5.6.8 系統(tǒng)切換到str1程序執(zhí)行317
5.7 內(nèi)核的分頁318
5.7.1 為設置內(nèi)核的頁目錄表和頁表做準備—所占空間清0318
5.7.2 設置內(nèi)核對應的頁目錄項和頁表項的內(nèi)容319
5.7.3 設置內(nèi)核對應的全局描述符表GDT320
5.8 頁寫保護321
5.8.1 進程A和進程B共享頁面321
5.8.2 進程A準備進行壓棧操作322
5.8.3 進程A的壓棧動作引發(fā)頁寫保護322
5.8.4 將進程A的頁表指向新申請的頁面323
5.8.5 拷貝原頁面內(nèi)容到進程A新申請的頁面324
5.8.6 進程B準備操作共享頁面325
5.8.7 假設進程B先執(zhí)行壓棧操作的情況325
5.9 小結326
第6章 多個進程“同時”操作一個文件327
6.1 三個進程操作同一個文件327
6.1.1 進程A執(zhí)行,hello.txt文件被打開328
6.1.2 進程A讀取hello.txt文件并由于等待硬盤中斷而被系統(tǒng)掛起328
6.1.3 進程B準備打開hello.txt文件330
6.1.4 系統(tǒng)準備為進程B獲取hello.txt文件的i節(jié)點332
6.1.5 系統(tǒng)找到hello.txt文件已經(jīng)載入的i節(jié)點333
6.1.6 系統(tǒng)準備為進程B從硬盤上讀取hello.txt文件334
6.1.7 系統(tǒng)找到了正在操作的緩沖塊,將進程B掛起335
6.1.8 系統(tǒng)再次切換到進程0執(zhí)行337
6.1.9 進程C啟動并打開hello.txt文件337
6.1.10 進程C也由于等待緩沖塊解鎖而被系統(tǒng)掛起338
6.1.11 緩沖塊解鎖后先喚醒進程C339
6.1.12 系統(tǒng)將進程B設為就緒狀態(tài)340
6.1.13 系統(tǒng)將指定數(shù)據(jù)寫入緩沖塊341
6.1.14 寫入完成后,進程C繼續(xù)執(zhí)行341
6.1.15 進程C準備切換到進程B342
6.1.16 進程C切換到進程B執(zhí)行,進程B喚醒進程A342
6.1.17 進程B不斷執(zhí)行,直到時間片減為0后切換到進程A執(zhí)行343
6.1.18 進程A、B、C退出,寫入數(shù)據(jù)由update進程同步344
6.2 緩沖區(qū)與外設的數(shù)據(jù)同步344
6.2.1 系統(tǒng)不斷為進程A向緩沖區(qū)寫入數(shù)據(jù)346
6.2.2 繼續(xù)執(zhí)行引發(fā)緩沖塊數(shù)據(jù)需要同步346
6.2.3 將緩沖區(qū)中的數(shù)據(jù)同步到硬盤上347
6.2.4 進程A由于等待空閑請求項而被系統(tǒng)掛起349
6.2.5 進程B開始執(zhí)行350
6.2.6 進程B也被掛起351
6.2.7 進程C開始執(zhí)行并隨后被掛起352
6.2.8 進程A和進程C均被喚醒352
6.2.9 進程B切換到進程A執(zhí)行354
6.3 小結356
第7章 IPC問題358
7.1 管道機制358
7.1.1 為管道文件在文件管理表中申請空閑項360
7.1.2 為管道文件與進程建立聯(lián)系創(chuàng)造條件360
7.1.3 創(chuàng)建管道文件i節(jié)點361
7.1.4 將管道文件i節(jié)點與文件管理表建立聯(lián)系362
7.1.5 將管道文件句柄返回給用戶進程363
7.1.6 讀管道進程開始操作管道文件363
7.1.7 寫管道進程向管道中寫入數(shù)據(jù)364
7.1.8 寫管道進程繼續(xù)向管道寫入數(shù)據(jù)366
7.1.9 寫管道進程已將管道空間寫滿366
7.1.10 寫管道進程掛起366
7.1.11 讀管道進程從管道中讀出數(shù)據(jù)367
7.1.12 讀管道進程繼續(xù)執(zhí)行,不斷從管道中讀出數(shù)據(jù)369
7.1.13 讀管道進程執(zhí)行中發(fā)生時鐘中斷369
7.1.14 讀管道進程執(zhí)行過程中再次發(fā)生時鐘中斷370
7.1.15 讀管道進程切換到寫管道進程執(zhí)行371
7.1.16 寫管道進程掛起切換到讀管道進程執(zhí)行371
7.1.17 讀管道進程繼續(xù)執(zhí)行,直到把管道中的數(shù)據(jù)讀完372
7.1.18 讀取完成后,讀進程掛起,寫進程繼續(xù)執(zhí)行373
7.2 信號機制374
7.2.1 processig進程開始執(zhí)行376
7.2.2 processig進程進入可中斷等待狀態(tài)377
7.2.3 sendsig進程開始執(zhí)行并向processig進程發(fā)信號379
7.2.4 系統(tǒng)檢測當前進程接收到信號并準備處理381
7.2.5 系統(tǒng)檢測信號處理函數(shù)指針掛接是否正常382
7.2.6 調(diào)整processig進程的內(nèi)核棧結構,使之先執(zhí)行信號處理函數(shù)383
7.2.7 信號對進程執(zhí)行狀態(tài)的影響386
7.3 小結393
第8章 操作系統(tǒng)的設計指導思想395
8.1 運行一個最簡單的程序,看操作系統(tǒng)為程序運行做了哪些工作395
8.2 操作系統(tǒng)的設計指導思想—主奴機制398
8.2.1 主奴機制中的進程及進程創(chuàng)建機制399
8.2.2 操作系統(tǒng)在內(nèi)存管理中的主奴機制400
8.2.3 操作系統(tǒng)在文件系統(tǒng)中體現(xiàn)的主奴機制401
8.3 實現(xiàn)主奴機制的三種關鍵技術402
8.3.1 保護和分頁402
8.3.2 特權級405
8.3.3 中斷405
8.4 建立主奴機制的決定性因素—先機407
8.5 軟件和硬件的關系:主機與進程、外設與文件408
8.5.1 非用戶進程—進程0、進程1、shell進程408
8.5.2 文件與數(shù)據(jù)存儲409
8.6 父子進程共享頁面414
8.7 操作系統(tǒng)的全局中斷與進程的局部中斷—信號414
8.8 小結415
結束語415
“新設計團隊”簡介416
附錄 搭建Linux 0.11系統(tǒng)環(huán)境421
編輯推薦
《Linux內(nèi)核設計的藝術:圖解Linux操作系統(tǒng)架構設計與實現(xiàn)原理》對操作系統(tǒng)內(nèi)核的駕馭能力和深刻理解程度達到世界頂尖級水平,是一本能真正引導你深入理解Linux內(nèi)核設計思想的經(jīng)典著作。結合真實的源碼、349幅內(nèi)核運行時序圖和詳細的文字描述,以一種開創(chuàng)性的方式對Linux內(nèi)核進行了極為直觀和透徹地闡述,讀者可通過閱讀本書提出自己的設計思想。
圖書封面
圖書標簽Tags
無
評論、評分、閱讀與下載