|
-- 會員 / 註冊 --
|
|
|
|
深入解析Windows操作系統(第6版)下冊 ( 簡體 字) |
作者:范德成,潘愛民 | 類別:1. -> 程式設計 -> 綜合 |
譯者: |
出版社:電子工業出版社 | 3dWoo書號: 48824 詢問書籍請說出此書號!【缺書】 【不接受訂購】 |
出版日:3/1/2018 |
頁數:592 |
光碟數:0 |
|
站長推薦: |
印刷:黑白印刷 | 語系: ( 簡體 版 ) |
|
【不接受訂購】 | ISBN:9787121336430 |
作者序 | 譯者序 | 前言 | 內容簡介 | 目錄 | 序 |
(簡體書上所述之下載連結耗時費功, 恕不適用在台灣, 若讀者需要請自行嘗試, 恕不保證) |
作者序: |
譯者序: |
前言:譯者序一 在所有介紹Windows操作系統的圖書中,我相信都離不開Windows Internals系列提供的信息。除了公開可見到的Windows源代碼以外,本書是披露Windows系統機理最為詳盡的一份資料,尤其對于Windows的每一個最新版本。本書第6版專門針對Windows 7和Windows Server 2008 R2進行了大幅度更新。由于篇幅的增加,這一版本改成了上下兩冊來發行,由此也可見本書的“分量”。本書上冊中文版已于2014年4月出版,這幾年間,我經常收到讀者的詢問,本書下冊是否出版。現在,下冊中文版終于要出版了,讀者們可以如愿看到本書了。 在Windows操作系統的發展歷程中,Windows 7是一個具有特殊意義的版本。它可以算得上是最為復雜的單機操作系統,無論是從代碼規模、代碼復雜度,還是從系統適應場景的復雜程度,都超過了以前所有的版本。從某種意義上,Windows 7代表了軟件工程的一個頂峰——人類可以構造出如此復雜且能穩定工作的軟件系統!與此相對應,要用一本書來涵蓋其中的各種機理也同樣是一項艱巨的任務,本書作者基于他們過去所做的大量工作,以及對Windows的深入理解,出色地完成了這一詮釋工作。 本書的權威性毋庸置疑。Mark Russinovich因在Windows內核探索方面所作出的貢獻而成為Microsoft Fellow(現為Azure CTO),本書中用到的大量Sysinternals工具均出自他的手筆。David Solomon長期從事Windows NT內部機理的培訓,他不僅在全球各地培訓Windows系統程序員,甚至也為Microsoft的內部員工提供Windows內核培訓服務,他從本書第2版開始奠定了卓有成效的敘述風格。Alex Ionescu是一名年輕的黑客型Windows專家,曾經為ReactOS(一個開源的操作系統項目,旨在兼容Windows 2000/XP/Server 2003的應用程序)編寫了絕大多數內核代碼。他曾經發現和報告了一些與Windows內核相關的軟件漏洞,也跟David Solomon一起講授Windows內部機理的課程。有如此強大的作者組合,再加上Microsoft的內部支持(包括提供源代碼,以及Windows開發組的細致解釋),本書無疑是Windows最新版本的第一手技術資料。 每一個對Windows操作系統有濃厚興趣的讀者都不應該錯過這本書。本書上冊介紹了Windows的系統架構、系統機制、管理機制、進程與線程、安全性和網絡。下冊是上冊的直接延續,共有7章,分別介紹了Windows I/O、存儲管理、內存管理、緩存管理器、文件系統、啟動與停機,以及崩潰轉儲分析。每一章都是一個重要話題,讀者既可以在上冊的基礎上繼續深入鉆研Windows各個子系統,也可以有選擇地閱讀某些章節。在閱讀過程中,最好能動手做一做書中描述的實驗。做這些實驗的門檻并不高,但效果非常好,既可以讓你直觀地領會Windows內部的一些設計與實現,也可以積累一些洞察Windows內部活動的方法,這些方法對于排查Windows平臺上出現的問題往往很有幫助。 我與本書的淵源是從第4版(針對Windows XP/Server 2003)開始的,后來第5版(針對Windows Vista/Server 2008)錯過了出版周期,直至這次第6版又有機會翻譯。這三個版本,連同后來的第7版(針對Windows 10/Server 2016)都采用同樣的敘述框架,只是針對最新的Windows版本做了更新。本書講述的內容,雖然是針對Windows 7/Server 2008 R2,但更新幅度較大,尤其是有關64位系統的介紹,有較多新內容。即使讀者已經在Windows 8或者Windows 10上工作,本書中的內容仍然對你有價值。另外,如果讀者不滿足于本書Windows系統機理的系列介紹,而希望進一步理解Windows操作系統的源代碼實現以及內核中的各種基礎算法,則推薦閱讀另一本書《Windows內核原理與實現》,這是我在Windows XP/Server 2003 SP1內核代碼基礎上寫作的一本講解Windows內核的書,它幾乎將Windows內核大白于天下。 最后,我要特別感謝范德成先生,他在我第4版譯稿的基礎上,更新到了第6版。也要感謝電子工業出版社的編輯劉皎,依然把第6版的翻譯工作交給了我,使我有機會彌補第5版中文版未能出版之缺憾。
潘愛民 2018年1月于杭州 譯者序二
微軟的Windows操作系統歷經三十年左右的發展,早已成為一個博大精深的桌面及服務器操作系統,并在市場上獲得了很大的成功。但近十年來,以亞馬遜、谷歌、Facebook等為代表的互聯網企業在市場和技術兩方面開疆拓土,極大地推動了移動設備、云計算、大數據和人工智能等行業的發展,顯著影響了包括微軟在內的各大傳統軟件巨頭的發展態勢。繼2006年亞馬遜提出云計算之后,微軟于2008年首度公開Azure虛擬機云平臺,SAP也在2012年公開其應用程序云平臺。盡管各種新的技術不斷涌現,但本書的定位焦點仍然在Windows操作系統本身,在我看來,這本書的價值依然很高,因為技術的本源有共通性,Windows操作系統又可謂是微軟技術的中流砥柱——微軟的Azure云平臺的操作系統就是基于Windows開發的,其上運行的虛擬機管理器正是最早在Windows Server 2008中發布的Hyper-V。 如果你對Windows操作系統有著濃厚的興趣,自然不應該錯過本書。如果你是分布式系統架構師,也同樣能從本書中受益。這是因為,分布式系統和操作系統在許多方面都有著或多或少的相似性,對操作系統設計原理的掌握自然會對分布式系統的設計有重大啟發和幫助。比如,操作系統的線程調度和分布式系統的負載均衡、操作系統的磁盤緩存和分布式系統的緩存設計、操作系統的文件系統和分布式系統的文件系統、虛擬機管理器的VLAN和分布式系統的軟件定義網絡(SDN)、操作系統的性能監視器與分布式系統服務器的性能監視平臺等之間都有不少相似性。 以事務處理為例,Windows Vista中引入了KTM(內核事務管理器,參見本書第12章),它所實現的事務的隔離級別類似于數據庫的READ COMMITTED級別,是一種幾乎所有SQL數據庫都會實現的隔離級別;而分布式系統中的Paxos共識算法所能實現的分布式事務,其隔離級別也類似于READ COMMITTED。又以磁盤緩存為例(參見本書第11章),操作系統的磁盤緩存是強一致性的,而分布式系統緩存可以做成應用服務器內的,或者是專門的緩存層,前一種實現對負載均衡調度有特殊要求,而普通的負載均衡會大大降低緩存命中率從而導致系統性能低下,后一種實現則在網絡延遲上稍差些。兩種實現都要考慮是做成強一致性的還是最終一致性的,前者需要在寫的同時更新緩存,后者則需要自動淘汰舊的緩存數據。緩存的粒度也很重要,粒度過小可能導致索引數據量過大,這和操作系統磁盤緩存的原理是類似的。所以,理解操作系統的知識能拓展眼界,進而對基于這些系統的設計產生正面影響。 此外,理解操作系統的行為有助于設計性能更高的分布式程序。比如,了解操作系統磁盤緩存的原理,有助于設計出高性能的對象存儲服務——可以想辦法提高對象存儲在操作系統上的緩存命中率,或者在必要時禁用操作系統緩存而改為自己實現緩存機制。又如,了解操作系統網絡棧的工作模式,有助于編寫做高速網絡傳輸的程序,甚至可以深入驅動程序層面做進一步的性能優化。 我是Windows操作系統的深度用戶,學習和研究了包括Windows、Linux、FreeBSD、OpenBSD在內的多種操作系統。從1995年首次接觸Windows 3.1開始,就與Windows結下了不解之緣。陸續使用過Windows 3.1、Windows 95、Windows 98、Windows ME、Windows NT 4.0、Windows 2000、Windows XP、Windows Vista、Windows 7、Windows 8、Windows 8.1和Windows 10等各個版本,還接觸過Windows Server 2000、Windows Server 2003、Windows Server 2008、Windows Server 2008 R2等服務器版本,以及其上的Microsoft Virtual PC、Virtual Server和Hyper-V虛擬化技術。我會好奇它們有著怎樣的功能和性能,底層是怎樣工作的,為什么這樣設計而不是那樣設計的;正是因為這種好奇,所以Windows Internals一直是我十分感興趣的一本書。在完成本書上冊的翻譯工作后,我寫了一篇后記(http://www.fandecheng.com/personal/ interests/pwindows/wi_translation_ps.pdf里面講了很多個人的理解和感悟)。2012年,當好友高博打電話告訴我有機會參與《深入解析Windows操作系統》第6版的翻譯時,我非常欣喜。在高博的引薦下,我首次見到了仰慕已久的潘愛民老師。因此我非常感謝高博的引薦和潘愛民老師的認可,感謝電子工業出版社的劉皎和白濤兩位編輯,本書的出版離不開他們的策劃和編輯。
范德成 2018年1月于上海浦東張江
引言
《深入解析Windows操作系統(第6版)》的讀者對象是那些想要理解Microsoft Windows 7和Windows Server 2008 R2操作系統的核心組件內部工作機理的高級計算機專業人員(包括開發人員和系統管理員)。開發人員利用這些知識,可以在構建Windows平臺上的應用程序時更好地理解各種設計決策背后的基本原理,調試復雜的問題。系統管理員也可以從這些信息中獲益,因為理解了操作系統背后的工作原理,有助于理解系統的性能行為,并且在事情變糟時更容易診斷各種系統問題。在閱讀了這本書以后,你應該可以更好地理解Windows是如何工作的,以及它為什么有這樣那樣的表現。 本書的結構 《深入解析Windows操作系統(第6版)》第一次被分成了上下冊來出版。為Windows的每一個版本更新這本書需要花相當多的時間,所以,按照上下冊來組織本書內容使我們可以更快地出版上冊部分。 本書上冊的前兩章為“概念和工具”和“系統結構”:第1章定義了關鍵的概念,并介紹了本書后面用到的工具;第2章講述了總體系統結構和組件。接下來的兩章展示了系統中關鍵的底層機制和管理機制。上冊部分還覆蓋了操作系統的三個核心組件:進程、線程和作業;安全性;網絡。 本書下冊的內容覆蓋了剩余的核心子系統:I/O、存儲、內存管理、緩存管理器和文件系統。下冊最后部分還描述了啟動和停機過程,并介紹了崩潰轉儲分析。 本書的歷史 本書以前的名稱是“Inside Windows NT”(Microsoft Press,1992,中文版的名稱是《Windows NT技術內幕》),現在是第6版。第1版由Helen Custer撰寫(在Microsoft Windows NT 3.1最初發布之前出版)。Inside Windows NT是第一本關于Windows NT的書籍,它提供了有關Windows NT系統架構和設計方面的關鍵要點。Inside Windows NT (Second Edition)(Microsoft Press, 1998)由David Solomon撰寫,在內容上做了更新,涵蓋了Windows NT 4.0,并且大大地提高了技術深度的層次。 “Inside Windows 2000 (Third Edition)”(Microsoft Press,2000)由David Solomon和Mark Russinovich合著完成。第3版增加了許多新的話題,比如啟動和停機、Windows服務的內部機理、注冊表的內部機理、文件系統驅動程序、網絡。它也覆蓋了Windows 2000中內核的變化,比如Windows驅動程序模型(WDM,Windows Driver Model)、即插即用、電源管理、Windows管理設施(WMI,Windows Management Instrumentation)、加密、作業對象和終端服務。Windows Internals (Fourth Edition)是針對Windows XP和Windows Server 2003的更新,它加入了更多的內容,主要集中在幫助IT專業人員更好地利用Windows的內部機理的知識,比如使用Windows Sysinternals (www.microsoft.com/technet/sysinternals)的關鍵工具,以及分析崩潰轉儲。Windows Internals (Fifth Edition)是針對Windows Vista和Windows Server 2008的更新,它包含的新內容有:映像加載器、用戶模式調試設施,以及Hyper-V。 第6版的變化 這一最新的版本在內容上做了更新,以覆蓋Windows 7和Windows Server 2008 R2中所做的內核變化。練習用的實驗也相應地做了更新,以反映出工具中的變化。 練習實驗 即使沒有訪問Windows源代碼,你也可以通過一些工具(比如內核調試器,以及來自Sysinternals和Winsider Seminars & Solutions的工具)獲得許多有關Windows內部機理的知識。當可以通過一個工具來揭示或演示Windows內部行為的某一方面時,本書的“實驗”輔助章節就會列出讓你自己試用該工具時遵從的步驟。這樣的實驗遍布全書,我們鼓勵你在閱讀本書時試一試這些實驗——看一看Windows內部是如何工作的,這比你僅僅讀一遍本書印象要深刻得多。 本書沒有覆蓋的話題 Windows是一個大而復雜的操作系統。本書并沒有覆蓋與Windows內部機理相關的一切內容,而是把焦點集中在基本的系統組件上。例如,本書沒有講述COM+(Windows分布式面向對象編程基礎設施),也沒有講述Microsoft .NET框架(托管代碼應用程序的基礎)。 因為這是一本講述內部機理的書籍,不是一本用戶指南、程序設計或系統管理類型的書籍,所以,本書沒有描述如何使用、編程或配置Windows。 提醒和告誡 因為本書講述的是Windows操作系統中未文檔化的內部結構和內部操作的行為(比如內核結構和函數),所以,這些內容有可能會在不同發行版本之間有所變化。(外部的接口,比如Windows API,則不會受到不兼容變化的影響。) 說到“受版本變化的影響”,我們并不是指本書所講述的細節將在不同發行版本之間一定有所變化,但是你不能認為它們不會改變。任何使用了這些未文檔化接口的軟件都有可能在將來的Windows版本上無法正常工作。更糟的是,在內核模式下運行并且用到了這些未文檔化接口的軟件(比如設備驅動程序)在新的Windows發行版本上運行時可能會導致系統崩潰。 致謝 首先,感謝Azius LLC的Jamie Hanrahan和BrianCatlin加入這一項目——沒有他們的幫助,本書將無法完成。他們對“安全性”和“網絡”這兩章做了大量的更新,也為“管理機制”和“進程和線程”這兩章的更新做出了很多貢獻。Azius提供了Windows內部機理和設備驅動程序的訓練。更多信息參見www.azius.com。 我們想要感謝Alex Ionescu,在這一版本中他是一名完全的聯合作者。這包含了Alex在本書第5版所做的大量工作,以及在這一版本中持續做的工作。 同時感謝Daniel Pearson,他更新了“崩潰轉儲分析”一章。他多年來的轉儲分析經驗,使得本章內容更加貼近真實場景。 感謝Eric Traut和Jon DeVaan,繼續讓David Solomon可以為了寫作本書而訪問Windows源代碼,以及繼續開發他的Windows Internals課程。 有三個關鍵的評審者尚未因為他們對第5版的評審和貢獻而被致以感謝,他們是:Arun Kishan、Landy Wang和Aaron Margosis。再次感謝他們!再次感謝Arun和Landy為這一版本所做的詳細審查和極有幫助的見地。 若沒有來自Microsoft Windows開發組關鍵成員的審查、建議和支持,這本書不會擁有現在這樣的技術細節深度和精確度。因此,我們感謝下面的人員,他們為本書提供了技術審查和建議:Greg Cottingham、Joe Hamburg、Jeff Lambert、Pavel Lebedinsky、Joseph East、Adi Oltean、Alexey Pakhunov、Valerie See。 同時感謝Scott Lee、Tim Shoultz和Eric Kratzer在編寫“崩潰轉儲分析”這章時所提供的協助。 對于“網絡”這一章,特別感謝Gianluigi Nusca和Tom Jolly,他們所做的遠遠超出了他們的責任范圍:Gianluigi在BranchCache的材料方面提供了特別有用的幫助,以及大量的建議(他還寫了許多段落材料);Tom Jolly不僅提供了優秀的審查意見和建議,而且讓許多其他的開發人員幫忙做技術審查。下面是所有對“網絡”這一章做了審查和貢獻的人員:Roopesh Battepati、Molly Brown、Greg Cottingham、Dotan Elharrar、Eric Hanson、Tom Jolly、Manoj Kadam、Greg Kramer、David Kruse、Jeff Lambert、Darene Lewis、Dan Lovinger、Gianluigi Nusca、Amos Ortal、Ivan Pashov、Ganesh Prasad、Paul Swan、Shiva Kumar Thangapandi。 Amos Ortal和Dotan Elharrar對NAP的內容提供了幫助,Shiva Kumar Thangapandi對EAP部分提供了大量幫助。 感謝Gerard Murphy為本書審閱Windows 7停機機制的內容,并清楚地解釋了不同組策略下的行為。 感謝Microsoft電源管理組的Tristan Brown,有好幾天他在辦公室陪Alex一起加班到深夜,仔細解釋處理器核心的停運算法和行為。他還提供了一幅珍貴的插圖。 感謝Apurva Doshi給Alex發了一份詳細解釋了緩存管理器在Windows 7中改變的文檔,本書中所介紹的一些新的行為和改變正是由于該文檔的幫助才研究清楚的。 感謝Matthieu Suiche,是他提供的內核符號文件數據庫讓Alex能發現最核心的內核數據結構中新增和去除的字段,并由此引發了他對底層功能變化的探索和發現。 感謝Cenk Ergan、Michael Fortin和Mehmet Iyigun對Superfetch細節部分的審查和建議。 Christophe Nasarre作為總體技術評審人,他所做的詳細檢查極大地提高了本書的技術精確度和一致性。 我們也要再次感謝Hex-Rays的Ilfak Guilfanov,因為他們為Alex Ionescu提供了IDA Pro Advanced and Hex Rays許可,所以Alex可以加快對Windows內核的逆向工程。 最后,作者們要感謝Microsoft Press的同事們,他們在背后做了很多工作,將這本書變成現實。Devon Musgrave作為本書的策劃編輯,承擔了雙重職責:既要考慮成本,也要考慮本書的發展;Carol Dillingham是本書的項目編輯。編輯和產品經理Steve Sagman、版權編輯Roger LeBanc、校對編輯Audrey Marr和索引編輯Christina Yeager都為本書的質量做出了貢獻。 最后,感謝Microsoft Press的發行人Ben Ryan,他始終相信為讀者提供如此詳細程度的Windows知識是極其重要的! 勘誤和本書支持 我們做了各種努力來確保本書的精確性。自本書出版以來已經報告的任何錯誤都將列出。 如果你遇到了尚未列出的錯誤,你可以通過以上頁面將錯誤報告給我們。 如果你需要額外的支持,請發送電子郵件給Microsoft Press Book Support。 請注意,通過上述地址并不會提供有關Microsoft軟件產品的支持。 傾聽你的聲音 讓你滿意是我們最高優先級的工作,你的反饋也是我們最有價值的財富。 注冊博文視點社區用戶,即享受以下服務: ? 提勘誤賺積分:可在【提交勘誤】處提交對內容的修改意見,若被采納將獲贈博文視點社區積分(可用來抵扣購買電子書的相應金額)。 ? 交流學習:在頁面下方【讀者評論】處留下您的疑問或觀點,與作譯者和其他讀者共同交流。 保持聯系 讓我們保持熱線聯系。 |
內容簡介:本書是Windows技術權威參考書的最新版本,本書主要介紹了基于Windows 7 and Windows Server 2008 R2的核心技術與底層技術,全面闡釋Windows技術機理,是廣大Windows開發人員必備的參考書。 |
目錄:第8章 I/O系統 1 8.1 I/O系統組件 1 I/O管理器 3 典型的I/O處理過程 4 8.2 設備驅動程序 5 設備驅動程序的類型 5 WDM驅動程序 6 分層的驅動程序 7 實驗:查看已加載的驅動程序列表 9 驅動程序的結構 11 驅動程序對象和設備對象 13 實驗:看一看設備對象 15 實驗:顯示驅動程序和設備對象 17 打開設備 18 實驗:查看設備句柄 21 實驗:查看Windows設備名稱之間的映射 23 8.3 I/O處理 24 I/O類型 24 同步I/O和異步I/O 24 快速I/O 25 實驗:查看一個驅動程序登記的快速I/O例程 25 映射文件I/O和文件緩存 26 分散/聚集I/O 27 I/O請求包 27 IRP棧單元 28 實驗:查看驅動程序的分發例程 29 實驗:查看一個線程的未完成IRP 29 IRP緩沖區管理 30 針對單層驅動程序的I/O請求 32 為一個中斷提供服務 33 完成一個I/O請求 34 同步 36 針對分層的驅動程序的I/O請求 38 實驗:查看一個設備棧 39 實驗:查看IRP 40 線程無關I/O 45 I/O取消 45 用戶發起的I/O取消 46 線程終止時的I/O取消 47 實驗:調試一個無法被殺死的進程 48 I/O完成端口 49 IoCompletion對象 50 使用完成端口 50 I/O完成端口操作 52 I/O優先級支持 54 I/O優先級 54 優先化策略 55 I/O優先級反轉的避免(I/O優先級繼承) 57 I/O優先級提升和撞升 57 實驗:“非常低”和“正常”I/O吞吐量的對比 58 實驗:I/O優先級提升/撞升的性能分析 59 帶寬預留(計劃的文件I/O) 60 容器通知 60 驅動程序檢驗器(Driver Verifier) 61 8.4 內核模式驅動程序框架(KMDF) 63 KMDF驅動程序的結構和操作 64 實驗:顯示KMDF驅動程序 65 KMDF數據模型 66 KMDF的I/O模型 69 8.5 用戶模式驅動程序框架(UMDF) 72 8.6 即插即用(PnP)管理器 76 即插即用支持的級別 77 驅動程序對于即插即用的支持 77 驅動程序加載、初始化和安裝 79 Start值 80 設備列舉 81 實驗:將設備樹轉儲出來 84 設備棧 85 設備棧的驅動程序加載 86 實驗:在設備管理器中查看詳細的devnode信息 88 驅動程序安裝 90 實驗:檢查一個驅動程序的INF文件 92 實驗:查看目錄(catalog)文件 93 8.7 電源管理器 94 電源管理器的操作 96 驅動程序的電源操作 97 實驗:查看一個驅動程序的電源映射關系 97 實驗:查看系統的電源能力和策略 98 驅動程序和應用程序對于設備電源的控制 100 電源可用性請求 100 實驗:在調試器中查看一個電源可用性請求 101 實驗:利用Powercfg查看電源可用性請求 103 處理器電源管理(PPM) 103 核心停運的策略 104 利用率函數 105 實驗:查看利用率和頻率的信息 106 實驗:查看利用率和頻率的歷史 107 算法覆蓋 108 增加/減少動作 108 各種閾值和策略的設置 109 實驗:查看當前的核心停運策略 111 “性能檢查”算法 112 實驗:查看當前的PPM檢查信息 116 8.8 本章總結 118 第9章 存儲管理 119 9.1 有關存儲的術語 119 9.2 磁盤設備 120 旋轉磁盤 120 磁盤的扇區格式 120 固態硬盤 122 NAND型閃存 122 文件的刪除和irim命令 124 9.3 磁盤驅動程序 125 Winload 125 磁盤類、端口和小端口驅動程序 126 iSCSI驅動程序 127 多路徑I/O(MPIO)驅動程序 128 實驗:觀察物理磁盤I/O 130 磁盤設備對象 130 分區管理器 131 9.4 卷的管理 132 基本磁盤 133 MBR風格的分區 133 GPT(GUID分區表)分區方案 133 基本磁盤卷管理器 134 動態磁盤 135 LDM數據庫 135 實驗:使用LDMDump來查看LDM數據庫 137 LDM和GPT或MBR風格的分區方案 139 動態磁盤的卷管理器 140 多分區卷的管理 140 跨距卷 141 條帶卷 142 實驗:觀察鏡像卷的I/O操作 143 RAID-5卷 145 卷名字空間 145 掛載管理器 146 掛載點 147 卷的掛載 148 實驗:查看VPB 149 卷的I/O操作 152 虛擬磁盤服務 153 9.5 虛擬硬盤(VHD文件)支持 155 附載VHD的操作 156 嵌套的文件系統 156 9.6 BitLocker驅動器加密 157 加密密鑰 159 可信平臺模塊(TPM) 161 BitLocker引導過程 163 BitLocker密鑰的恢復 165 全卷加密驅動程序 166 BitLocker的管理 167 BitLocker To Go 168 9.7 卷影像(shadow)拷貝服務 170 影像拷貝 170 “克隆”影像拷貝 170 “寫時復制”影像拷貝 170 VSS的架構 170 VSS的操作 171 影像拷貝提供者 172 實驗:查看Microsoft影像拷貝提供者的過濾型設備對象 173 Windows中的用途 174 備份 174 實驗:查看影像卷的設備對象 174 “之前的版本”和系統還原 175 實驗:導航到“之前的版本” 176 實驗:映射卷影像設備對象 177 9.8 本章總結 178 第10章 內存管理 179 10.1 內存管理器簡介 179 內存管理器組件 180 內部同步 181 檢查內存的使用情況 182 實驗:查看系統內存信息 182 10.2 內存管理器提供的服務 184 大頁面和小頁面 185 保留頁面和提交頁面 187 實驗:保留的頁面對比提交的頁面 188 提交限額 190 鎖住內存 190 分配粒度 191 共享內存和映射文件 192 實驗:查看內存映射文件 193 保護內存 194 “不可執行”頁面保護 196 實驗:查看進程上的DEP保護 199 軟件的數據執行保護 200 寫時復制 201 地址窗口擴展 203 10.3 內核模式堆(系統內存池) 204 內存池的大小 205 實驗:確定最大的池大小值 206 監視內存池的使用 208 實驗:診斷內存池泄漏 210 快查表(Look-Aside List) 211 實驗:查看系統的快查表 212 10.4 堆管理器 212 堆的類型 213 堆管理器結構 214 堆同步 215 低碎片堆 215 堆的安全特性 216 堆的調試特性 217 pageheap 218 容錯堆 218 10.5 虛擬地址空間的布局結構 219 x86地址空間的布局結構 221 實驗:檢查一個應用程序能否感知大地址空間 222 x86系統地址空間的布局結構 223 x86會話空間 224 實驗:查看會話 224 實驗:查看會話空間的使用情況 225 系統頁表項(PTE,Page Table Entry) 226 實驗:查看會話空間的使用情況 226 64位地址空間布局結構 227 x64虛擬尋址的限制 230 Windows x64的16TB限制 231 動態的系統虛擬地址空間管理 233 實驗:查詢系統虛擬地址的用量 234 實驗:設置系統虛擬地址的限制值 235 系統的虛擬地址空間配額 236 用戶地址空間的布局結構 237 實驗:對用戶虛擬地址空間進行分析 238 映像隨機化 239 棧的隨機化 240 堆的隨機化 240 內核地址空間中的ASLR 240 對安全性緩和措施的控制 240 實驗:查看進程上的ASLR保護 241 10.6 地址轉譯 241 x86虛擬地址轉譯 242 頁目錄 245 實驗:檢查頁目錄和PDE 245 頁表和頁表項 246 頁表項中硬件和軟件的“寫”位 247 頁面內的字節 248 地址轉譯快查緩沖區 248 物理地址擴展(PAE) 249 實驗:轉譯地址 251 x64虛擬地址轉譯 253 IA64虛擬地址轉譯 254 10.7 頁面錯誤處理 255 無效PTE 256 原型PTE 258 頁面換入I/O 259 沖突的頁面錯誤 260 聚簇的頁面錯誤 260 頁面文件 261 實驗:查看系統頁面文件 262 提交用量和系統提交限額 263 提交用量和頁面文件的大小 266 實驗:利用任務管理器來查看頁面文件使用量 266 10.8 棧 268 用戶棧 268 實驗:創建最大數量的線程 268 內核棧 269 實驗:觀察內核棧的使用量 269 DPC棧 270 10.9 虛擬地址描述符 270 進程的VAD 271 實驗:查看虛擬地址描述符 272 旋轉VAD 272 10.10 NUMA 273 10.11 內存區對象 274 實驗:查看內存區對象 275 實驗:查看控制區域 277 10.12 驅動程序檢驗器 280 10.13 頁面幀編號數據庫 284 實驗:查看PFN數據庫 287 頁面列表的動態變化 288 實驗:空閑列表和零頁面列表 289 實驗:已修改列表和備用列表 291 頁面優先級 296 實驗:觀察區分優先級的備用列表 298 已修改頁面寫出器 299 PFN數據結構 301 實驗:查看PFN項 304 10.14 物理內存的限制 305 Windows客戶版本的限制 306 32位客戶的有效內存限制 307 10.15 工作集 309 按需換頁 309 邏輯預取器 310 實驗:窺探預取文件內部 312 實驗:觀察預取文件的讀和寫 312 放置策略 313 工作集管理 314 實驗:查看進程工作集大小 316 實驗:工作集與虛擬大小 316 實驗:在調試器中查看工作集列表 317 平衡集管理器和交換器 318 系統工作集 319 內存通知事件 320 實驗:查看內存資源通知事件 321 10.16 主動式內存管理(Superfetch) 322 各個組件 322 跟蹤過程和日志記錄 324 場景 325 頁面優先級和重平衡 326 魯棒性能 328 RAM優化軟件 329 ReadyBoost 330 ReadyDrive 331 統一緩存 332 進程反射 334 實驗:利用Preflect來觀察進程反射的行為 336 10.17 本章總結 337 第11章 緩存管理器 338 11.1 緩存管理器的關鍵特性 338 單個中心化的系統緩存 339 內存管理器 339 緩存一致性 339 虛擬塊緩存 341 流式緩存機制 341 對可恢復文件系統的支持 341 11.2 緩存的虛擬內存管理 342 11.3 緩存的大小 344 緩存的虛擬大小 344 緩存的工作集大小 344 實驗:查看系統緩存的工作集 345 緩存的物理大小 345 11.4 緩存的數據結構 347 系統范圍的緩存數據結構 347 實驗:查看系統緩存的工作集 349 針對每個文件的緩存數據結構 350 實驗:查看共享的和私有的緩存表 353 11.5 文件系統接口 355 從緩存中來回拷貝數據 356 通過映射和鎖定接口進行緩存 356 通過直接內存訪問接口進行緩存 357 11.6 快速I/O 357 11.7 預讀(Read Ahead)和滯后寫(Write Behind) 359 智能預讀 359 回寫緩存(Write-Back Caching)和延遲寫(Lazy Writing) 361 實驗:觀察緩存管理器的活動情況 362 禁止一個文件的延遲寫出行為 367 強迫緩存被直寫(write-through)到磁盤上 367 刷新映射文件 367 實驗:觀察緩存的刷新 368 寫節流(Write Throttling) 369 實驗:查看寫節流參數 370 系統線程 370 11.8 本章總結 371 第12章 文件系統 372 12.1 Windows文件系統格式 373 CDFS 373 UDF 374 FAT12、FAT16和FAT32 374 exFAT 377 NTFS 377 12.2 文件系統驅動程序總體結構 378 本地FSD 379 遠程FSD 380 鎖定 381 實驗:查看已注冊文件系統的列表 383 文件系統操作 387 顯式文件I/O 388 內存管理器的修改頁面寫出器和映射頁面寫出器 392 緩存管理器的延遲寫出器(Lazy Writer) 392 緩存管理器的預讀線程 392 內存管理器的頁面錯誤處理器 393 文件系統過濾型驅動程序 393 進程監視器 393 實驗:查看進程監視器的過濾型驅動程序 394 12.3 診斷文件系統的問題 395 進程監視器的基本和高級模式 395 實驗:在一個空閑系統上查看文件系統的活動 395 進程監視器診斷技巧 396 12.4 公用日志文件系統 397 列集操作 397 日志的類型 398 日志的布局結構 400 日志序列號 401 日志塊 401 所有者頁面 402 虛擬LSN到物理LSN的轉譯 403 管理策略 404 12.5 NTFS設計目標和特性 404 高端(High-End)文件系統的需求 404 可恢復性 405 安全性 405 數據冗余和容錯能力 405 NTFS的高級特性 406 多數據流 406 實驗:查看數據流 408 基于Unicode的名稱 408 通用的索引設施 409 動態的壞簇重新映射 409 硬鏈接(link)和交接(junction) 409 實驗:創建一個硬鏈接 410 符號(軟)鏈接和交接(junction) 410 實驗:創建一個符號鏈接 412 壓縮文件和稀疏文件 412 變化日志 413 針對每個用戶的卷配額 413 鏈接跟蹤 414 加密 415 POSIX支持 416 碎片整理 416 動態分區 417 12.6 NTFS文件系統驅動程序 419 12.7 NTFS在磁盤上的結構 421 卷(volume) 421 簇(cluster) 422 主文件表(MFT) 423 實驗:查看NTFS信息 425 文件記錄號 426 文件記錄 426 文件名 429 隧道傳輸 431 駐留的和非駐留的屬性 432 數據壓縮和稀疏文件 435 壓縮稀疏數據 435 壓縮非稀疏數據 437 稀疏文件 439 變化日志文件 439 實驗:讀取變化日志 441 索引 442 對象ID 444 配額跟蹤 444 統一的安全性 445 重解析點 447 事務支持 447 隔離性 448 實驗:理解和管理事務 449 事務型API 450 資源管理器 451 實驗:查詢資源管理器的信息 452 磁盤上的實現 453 日志的實現 454 恢復的實現 455 12.8 NTFS的恢復支持 455 設計 456 元數據日志記錄 457 日志文件服務(LFS) 457 日志記錄類型 459 恢復 461 分析掃描(Analysis Pass) 462 重做掃描(Redo Pass) 463 撤銷掃描(Undo Pass) 463 NTFS的壞簇恢復 465 自我修復 468 12.9 加密文件系統(EFS)安全性 469 第一次加密一個文件 472 加密文件數據 473 解密過程 474 加密文件的備份 474 實驗:查看EFS信息 475 加密文件的復制 475 12.10 本章總結 476 第13章 啟動和停機 477 13.1 引導過程 477 BIOS引導準備 477 BIOS引導扇區和Bootmgr 481 UEFI引導過程 495 從iSCSI引導 496 初始化內核和執行體子系統 497 實驗:加載器參數塊 497 Smss、Csrss和Wininit 504 未完成的文件重命名操作 507 ReadyBoot 509 自動啟動的映像文件 510 實驗:Autoruns 511 13.2 引導和啟動問題的故障檢查 511 最后已知的好配置 512 安全模式 512 安全模式下的驅動程序加載 513 能感知安全模式的用戶程序 514 安全模式下的引導日志 515 Windows恢復環境(WinRE) 516 引導狀態文件 519 解決常見的引導問題 520 MBR損壞 520 引導扇區損壞 520 BCD的錯誤配置 520 系統文件損壞 521 Windows資源保護 522 System儲巢損壞 523 啟動屏幕之后的崩潰或者掛起 523 13.3 停機 525 實驗:驗證HungAppTimeout值 526 13.4 本章總結 528 第14章 崩潰轉儲分析 529 14.1 Windows為什么會崩潰 529 14.2 藍屏 530 Windows崩潰的原因 531 14.3 診斷崩潰問題 533 14.4 崩潰轉儲文件 535 實驗:查看轉儲文件的信息 539 崩潰轉儲的生成 540 14.5 Windows錯誤報告 542 14.6 在線崩潰分析 543 14.7 基本的崩潰轉儲分析 545 Notmyfault 545 基本的崩潰轉儲分析 546 詳細的分析 547 14.8 使用崩潰診斷工具 549 緩沖區溢出、內存破壞和特殊內存池 550 實驗:通過驅動程序檢驗器啟用特殊內存池 552 代碼改寫和系統代碼寫保護 553 14.9 高級的崩潰轉儲分析 554 棧破壞 555 掛起的或無響應的系統 557 實驗:利用LiveKd來生成Hyper-V客戶的轉儲 559 當沒有崩潰轉儲時 561 實驗:附載一個內核調試器 562 14.10 對常見停止代碼的分析 564 0xD1 - DRIVER_IRQL_NOT_LESS_OR_EQUAL 564 0x8E - KERNEL_MODE_EXCEPTION_NOT_HANDLED 566 0x7F - UNEXPECTED_KERNEL_MODE_TRAP 567 0xC5 - DRIVER_CORRUPTED_EXPOOL 569 硬件故障 571 實驗:藍屏屏幕保護程序 572 14.11 本章小結 572
譯者序一
在所有介紹Windows操作系統的圖書中,我相信都離不開Windows Internals系列提供的信息。除了公開可見到的Windows源代碼以外,本書是披露Windows系統機理最為詳盡的一份資料,尤其對于Windows的每一個最新版本。本書第6版專門針對Windows 7和Windows Server 2008 R2進行了大幅度更新。由于篇幅的增加,這一版本改成了上下兩冊來發行,由此也可見本書的“分量”。本書上冊中文版已于2014年4月出版,這幾年間,我經常收到讀者的詢問,本書下冊是否出版。現在,下冊中文版終于要出版了,讀者們可以如愿看到本書了。 在Windows操作系統的發展歷程中,Windows 7是一個具有特殊意義的版本。它可以算得上是最為復雜的單機操作系統,無論是從代碼規模、代碼復雜度,還是從系統適應場景的復雜程度,都超過了以前所有的版本。從某種意義上,Windows 7代表了軟件工程的一個頂峰——人類可以構造出如此復雜且能穩定工作的軟件系統!與此相對應,要用一本書來涵蓋其中的各種機理也同樣是一項艱巨的任務,本書作者基于他們過去所做的大量工作,以及對Windows的深入理解,出色地完成了這一詮釋工作。 本書的權威性毋庸置疑。Mark Russinovich因在Windows內核探索方面所作出的貢獻而成為Microsoft Fellow(現為Azure CTO),本書中用到的大量Sysinternals工具均出自他的手筆。David Solomon長期從事Windows NT內部機理的培訓,他不僅在全球各地培訓Windows系統程序員,甚至也為Microsoft的內部員工提供Windows內核培訓服務,他從本書第2版開始奠定了卓有成效的敘述風格。Alex Ionescu是一名年輕的黑客型Windows專家,曾經為ReactOS(一個開源的操作系統項目,旨在兼容Windows 2000/XP/Server 2003的應用程序)編寫了絕大多數內核代碼。他曾經發現和報告了一些與Windows內核相關的軟件漏洞,也跟David Solomon一起講授Windows內部機理的課程。有如此強大的作者組合,再加上Microsoft的內部支持(包括提供源代碼,以及Windows開發組的細致解釋),本書無疑是Windows最新版本的第一手技術資料。 每一個對Windows操作系統有濃厚興趣的讀者都不應該錯過這本書。本書上冊介紹了Windows的系統架構、系統機制、管理機制、進程與線程、安全性和網絡。下冊是上冊的直接延續,共有7章,分別介紹了Windows I/O、存儲管理、內存管理、緩存管理器、文件系統、啟動與停機,以及崩潰轉儲分析。每一章都是一個重要話題,讀者既可以在上冊的基礎上繼續深入鉆研Windows各個子系統,也可以有選擇地閱讀某些章節。在閱讀過程中,最好能動手做一做書中描述的實驗。做這些實驗的門檻并不高,但效果非常好,既可以讓你直觀地領會Windows內部的一些設計與實現,也可以積累一些洞察Windows內部活動的方法,這些方法對于排查Windows平臺上出現的問題往往很有幫助。 我與本書的淵源是從第4版(針對Windows XP/Server 2003)開始的,后來第5版(針對Windows Vista/Server 2008)錯過了出版周期,直至這次第6版又有機會翻譯。這三個版本,連同后來的第7版(針對Windows 10/Server 2016)都采用同樣的敘述框架,只是針對最新的Windows版本做了更新。本書講述的內容,雖然是針對Windows 7/Server 2008 R2,但更新幅度較大,尤其是有關64位系統的介紹,有較多新內容。即使讀者已經在Windows 8或者Windows 10上工作,本書中的內容仍然對你有價值。另外,如果讀者不滿足于本書Windows系統機理的系列介紹,而希望進一步理解Windows操作系統的源代碼實現以及內核中的各種基礎算法,則推薦閱讀另一本書《Windows內核原理與實現》,這是我在Windows XP/Server 2003 SP1內核代碼基礎上寫作的一本講解Windows內核的書,它幾乎將Windows內核大白于天下。 最后,我要特別感謝范德成先生,他在我第4版譯稿的基礎上,更新到了第6版。也要感謝電子工業出版社的編輯劉皎,依然把第6版的翻譯工作交給了我,使我有機會彌補第5版中文版未能出版之缺憾。
潘愛民 2018年1月于杭州 譯者序二
微軟的Windows操作系統歷經三十年左右的發展,早已成為一個博大精深的桌面及服務器操作系統,并在市場上獲得了很大的成功。但近十年來,以亞馬遜、谷歌、Facebook等為代表的互聯網企業在市場和技術兩方面開疆拓土,極大地推動了移動設備、云計算、大數據和人工智能等行業的發展,顯著影響了包括微軟在內的各大傳統軟件巨頭的發展態勢。繼2006年亞馬遜提出云計算之后,微軟于2008年首度公開Azure虛擬機云平臺,SAP也在2012年公開其應用程序云平臺。盡管各種新的技術不斷涌現,但本書的定位焦點仍然在Windows操作系統本身,在我看來,這本書的價值依然很高,因為技術的本源有共通性,Windows操作系統又可謂是微軟技術的中流砥柱——微軟的Azure云平臺的操作系統就是基于Windows開發的,其上運行的虛擬機管理器正是最早在Windows Server 2008中發布的Hyper-V。 如果你對Windows操作系統有著濃厚的興趣,自然不應該錯過本書。如果你是分布式系統架構師,也同樣能從本書中受益。這是因為,分布式系統和操作系統在許多方面都有著或多或少的相似性,對操作系統設計原理的掌握自然會對分布式系統的設計有重大啟發和幫助。比如,操作系統的線程調度和分布式系統的負載均衡、操作系統的磁盤緩存和分布式系統的緩存設計、操作系統的文件系統和分布式系統的文件系統、虛擬機管理器的VLAN和分布式系統的軟件定義網絡(SDN)、操作系統的性能監視器與分布式系統服務器的性能監視平臺等之間都有不少相似性。 以事務處理為例,Windows Vista中引入了KTM(內核事務管理器,參見本書第12章),它所實現的事務的隔離級別類似于數據庫的READ COMMITTED級別,是一種幾乎所有SQL數據庫都會實現的隔離級別;而分布式系統中的Paxos共識算法所能實現的分布式事務,其隔離級別也類似于READ COMMITTED。又以磁盤緩存為例(參見本書第11章),操作系統的磁盤緩存是強一致性的,而分布式系統緩存可以做成應用服務器內的,或者是專門的緩存層,前一種實現對負載均衡調度有特殊要求,而普通的負載均衡會大大降低緩存命中率從而導致系統性能低下,后一種實現則在網絡延遲上稍差些。兩種實現都要考慮是做成強一致性的還是最終一致性的,前者需要在寫的同時更新緩存,后者則需要自動淘汰舊的緩存數據。緩存的粒度也很重要,粒度過小可能導致索引數據量過大,這和操作系統磁盤緩存的原理是類似的。所以,理解操作系統的知識能拓展眼界,進而對基于這些系統的設計產生正面影響。 此外,理解操作系統的行為有助于設計性能更高的分布式程序。比如,了解操作系統磁盤緩存的原理,有助于設計出高性能的對象存儲服務——可以想辦法提高對象存儲在操作系統上的緩存命中率,或者在必要時禁用操作系統緩存而改為自己實現緩存機制。又如,了解操作系統網絡棧的工作模式,有助于編寫做高速網絡傳輸的程序,甚至可以深入驅動程序層面做進一步的性能優化。 我是Windows操作系統的深度用戶,學習和研究了包括Windows、Linux、FreeBSD、OpenBSD在內的多種操作系統。從1995年首次接觸Windows 3.1開始,就與Windows結下了不解之緣。陸續使用過Windows 3.1、Windows 95、Windows 98、Windows ME、Windows NT 4.0、Windows 2000、Windows XP、Windows Vista、Windows 7、Windows 8、Windows 8.1和Windows 10等各個版本,還接觸過Windows Server 2000、Windows Server 2003、Windows Server 2008、Windows Server 2008 R2等服務器版本,以及其上的Microsoft Virtual PC、Virtual Server和Hyper-V虛擬化技術。我會好奇它們有著怎樣的功能和性能,底層是怎樣工作的,為什么這樣設計而不是那樣設計的;正是因為這種好奇,所以Windows Internals一直是我十分感興趣的一本書。在完成本書上冊的翻譯工作后,我寫了一篇后記(http://www.fandecheng.com/personal/ interests/pwindows/wi_translation_ps.pdf里面講了很多個人的理解和感悟)。2012年,當好友高博打電話告訴我有機會參與《深入解析Windows操作系統》第6版的翻譯時,我非常欣喜。在高博的引薦下,我首次見到了仰慕已久的潘愛民老師。因此我非常感謝高博的引薦和潘愛民老師的認可,感謝電子工業出版社的劉皎和白濤兩位編輯,本書的出版離不開他們的策劃和編輯。
范德成 2018年1月于上海浦東張江
引言
《深入解析Windows操作系統(第6版)》的讀者對象是那些想要理解Microsoft Windows 7和Windows Server 2008 R2操作系統的核心組件內部工作機理的高級計算機專業人員(包括開發人員和系統管理員)。開發人員利用這些知識,可以在構建Windows平臺上的應用程序時更好地理解各種設計決策背后的基本原理,調試復雜的問題。系統管理員也可以從這些信息中獲益,因為理解了操作系統背后的工作原理,有助于理解系統的性能行為,并且在事情變糟時更容易診斷各種系統問題。在閱讀了這本書以后,你應該可以更好地理解Windows是如何工作的,以及它為什么有這樣那樣的表現。 本書的結構 《深入解析Windows操作系統(第6版)》第一次被分成了上下冊來出版。為Windows的每一個版本更新這本書需要花相當多的時間,所以,按照上下冊來組織本書內容使我們可以更快地出版上冊部分。 本書上冊的前兩章為“概念和工具”和“系統結構”:第1章定義了關鍵的概念,并介紹了本書后面用到的工具;第2章講述了總體系統結構和組件。接下來的兩章展示了系統中關鍵的底層機制和管理機制。上冊部分還覆蓋了操作系統的三個核心組件:進程、線程和作業;安全性;網絡。 本書下冊的內容覆蓋了剩余的核心子系統:I/O、存儲、內存管理、緩存管理器和文件系統。下冊最后部分還描述了啟動和停機過程,并介紹了崩潰轉儲分析。 本書的歷史 本書以前的名稱是“Inside Windows NT”(Microsoft Press,1992,中文版的名稱是《Windows NT技術內幕》),現在是第6版。第1版由Helen Custer撰寫(在Microsoft Windows NT 3.1最初發布之前出版)。Inside Windows NT是第一本關于Windows NT的書籍,它提供了有關Windows NT系統架構和設計方面的關鍵要點。Inside Windows NT (Second Edition)(Microsoft Press, 1998)由David Solomon撰寫,在內容上做了更新,涵蓋了Windows NT 4.0,并且大大地提高了技術深度的層次。 “Inside Windows 2000 (Third Edition)”(Microsoft Press,2000)由David Solomon和Mark Russinovich合著完成。第3版增加了許多新的話題,比如啟動和停機、Windows服務的內部機理、注冊表的內部機理、文件系統驅動程序、網絡。它也覆蓋了Windows 2000中內核的變化,比如Windows驅動程序模型(WDM,Windows Driver Model)、即插即用、電源管理、Windows管理設施(WMI,Windows Management Instrumentation)、加密、作業對象和終端服務。Windows Internals (Fourth Edition)是針對Windows XP和Windows Server 2003的更新,它加入了更多的內容,主要集中在幫助IT專業人員更好地利用Windows的內部機理的知識,比如使用Windows Sysinternals (www.microsoft.com/technet/sysinternals)的關鍵工具,以及分析崩潰轉儲。Windows Internals (Fifth Edition)是針對Windows Vista和Windows Server 2008的更新,它包含的新內容有:映像加載器、用戶模式調試設施,以及Hyper-V。 第6版的變化 這一最新的版本在內容上做了更新,以覆蓋Windows 7和Windows Server 2008 R2中所做的內核變化。練習用的實驗也相應地做了更新,以反映出工具中的變化。 練習實驗 即使沒有訪問Windows源代碼,你也可以通過一些工具(比如內核調試器,以及來自Sysinternals和Winsider Seminars & Solutions的工具)獲得許多有關Windows內部機理的知識。當可以通過一個工具來揭示或演示Windows內部行為的某一方面時,本書的“實驗”輔助章節就會列出讓你自己試用該工具時遵從的步驟。這樣的實驗遍布全書,我們鼓勵你在閱讀本書時試一試這些實驗——看一看Windows內部是如何工作的,這比你僅僅讀一遍本書印象要深刻得多。 本書沒有覆蓋的話題 Windows是一個大而復雜的操作系統。本書并沒有覆蓋與Windows內部機理相關的一切內容,而是把焦點集中在基本的系統組件上。例如,本書沒有講述COM+(Windows分布式面向對象編程基礎設施),也沒有講述Microsoft .NET框架(托管代碼應用程序的基礎)。 因為這是一本講述內部機理的書籍,不是一本用戶指南、程序設計或系統管理類型的書籍,所以,本書沒有描述如何使用、編程或配置Windows。 提醒和告誡 因為本書講述的是Windows操作系統中未文檔化的內部結構和內部操作的行為(比如內核結構和函數),所以,這些內容有可能會在不同發行版本之間有所變化。(外部的接口,比如Windows API,則不會受到不兼容變化的影響。) 說到“受版本變化的影響”,我們并不是指本書所講述的細節將在不同發行版本之間一定有所變化,但是你不能認為它們不會改變。任何使用了這些未文檔化接口的軟件都有可能在將來的Windows版本上無法正常工作。更糟的是,在內核模式下運行并且用到了這些未文檔化接口的軟件(比如設備驅動程序)在新的Windows發行版本上運行時可能會導致系統崩潰。 致謝 首先,感謝Azius LLC的Jamie Hanrahan和BrianCatlin加入這一項目——沒有他們的幫助,本書將無法完成。他們對“安全性”和“網絡”這兩章做了大量的更新,也為“管理機制”和“進程和線程”這兩章的更新做出了很多貢獻。Azius提供了Windows內部機理和設備驅動程序的訓練。更多信息參見www.azius.com。 我們想要感謝Alex Ionescu,在這一版本中他是一名完全的聯合作者。這包含了Alex在本書第5版所做的大量工作,以及在這一版本中持續做的工作。 同時感謝Daniel Pearson,他更新了“崩潰轉儲分析”一章。他多年來的轉儲分析經驗,使得本章內容更加貼近真實場景。 感謝Eric Traut和Jon DeVaan,繼續讓David Solomon可以為了寫作本書而訪問Windows源代碼,以及繼續開發他的Windows Internals課程。 有三個關鍵的評審者尚未因為他們對第5版的評審和貢獻而被致以感謝,他們是:Arun Kishan、Landy Wang和Aaron Margosis。再次感謝他們!再次感謝Arun和Landy為這一版本所做的詳細審查和極有幫助的見地。 若沒有來自Microsoft Windows開發組關鍵成員的審查、建議和支持,這本書不會擁有現在這樣的技術細節深度和精確度。因此,我們感謝下面的人員,他們為本書提供了技術審查和建議:Greg Cottingham、Joe Hamburg、Jeff Lambert、Pavel Lebedinsky、Joseph East、Adi Oltean、Alexey Pakhunov、Valerie See。 同時感謝Scott Lee、Tim Shoultz和Eric Kratzer在編寫“崩潰轉儲分析”這章時所提供的協助。 對于“網絡”這一章,特別感謝Gianluigi Nusca和Tom Jolly,他們所做的遠遠超出了他們的責任范圍:Gianluigi在BranchCache的材料方面提供了特別有用的幫助,以及大量的建議(他還寫了許多段落材料);Tom Jolly不僅提供了優秀的審查意見和建議,而且讓許多其他的開發人員幫忙做技術審查。下面是所有對“網絡”這一章做了審查和貢獻的人員:Roopesh Battepati、Molly Brown、Greg Cottingham、Dotan Elharrar、Eric Hanson、Tom Jolly、Manoj Kadam、Greg Kramer、David Kruse、Jeff Lambert、Darene Lewis、Dan Lovinger、Gianluigi Nusca、Amos Ortal、Ivan Pashov、Ganesh Prasad、Paul Swan、Shiva Kumar Thangapandi。 Amos Ortal和Dotan Elharrar對NAP的內容提供了幫助,Shiva Kumar Thangapandi對EAP部分提供了大量幫助。 感謝Gerard Murphy為本書審閱Windows 7停機機制的內容,并清楚地解釋了不同組策略下的行為。 感謝Microsoft電源管理組的Tristan Brown,有好幾天他在辦公室陪Alex一起加班到深夜,仔細解釋處理器核心的停運算法和行為。他還提供了一幅珍貴的插圖。 感謝Apurva Doshi給Alex發了一份詳細解釋了緩存管理器在Windows 7中改變的文檔,本書中所介紹的一些新的行為和改變正是由于該文檔的幫助才研究清楚的。 感謝Matthieu Suiche,是他提供的內核符號文件數據庫讓Alex能發現最核心的內核數據結構中新增和去除的字段,并由此引發了他對底層功能變化的探索和發現。 感謝Cenk Ergan、Michael Fortin和Mehmet Iyigun對Superfetch細節部分的審查和建議。 Christophe Nasarre作為總體技術評審人,他所做的詳細檢查極大地提高了本書的技術精確度和一致性。 我們也要再次感謝Hex-Rays(www.hex-rays.com)的Ilfak Guilfanov,因為他們為Alex Ionescu提供了IDA Pro Advanced and Hex Rays許可,所以Alex可以加快對Windows內核的逆向工程。 最后,作者們要感謝Microsoft Press的同事們,他們在背后做了很多工作,將這本書變成現實。Devon Musgrave作為本書的策劃編輯,承擔了雙重職責:既要考慮成本,也要考慮本書的發展;Carol Dillingham是本書的項目編輯。編輯和產品經理Steve Sagman、版權編輯Roger LeBanc、校對編輯Audrey Marr和索引編輯Christina Yeager都為本書的質量做出了貢獻。 最后,感謝Microsoft Press的發行人Ben Ryan,他始終相信為讀者提供如此詳細程度的Windows知識是極其重要的! 勘誤和本書支持 我們做了各種努力來確保本書的精確性。自本書出版以來已經報告的任何錯誤都將在http://go.microsoft.com/FWLink/?Linkid=245675上列出。 如果你遇到了尚未列出的錯誤,你可以通過以上頁面將錯誤報告給我們。 如果你需要額外的支持,請發送電子郵件給Microsoft Press Book Support:mspinput@microsoft.com。 請注意,通過上述地址并不會提供有關Microsoft軟件產品的支持。 傾聽你的聲音 讓你滿意是我們最高優先級的工作,你的反饋也是我們最有價值的財富。 注冊博文視點社區(www.broadview.com.cn)用戶,即享受以下服務: ? 提勘誤賺積分:可在【提交勘誤】處提交對內容的修改意見,若被采納將獲贈博文視點社區積分(可用來抵扣購買電子書的相應金額)。 ? 交流學習:在頁面下方【讀者評論】處留下您的疑問或觀點,與作譯者和其他讀者共同交流。 頁面入口:http://www.broadview.com.cn/33643。 保持聯系 讓我們保持熱線聯系,我們在Twitter上的地址是:http://twitter.com/MicrosoftPress。
Contents 目錄
第8章 I/O系統 1 8.1 I/O系統組件 1 I/O管理器 3 典型的I/O處理過程 4 8.2 設備驅動程序 5 設備驅動程序的類型 5 WDM驅動程序 6 分層的驅動程序 7 實驗:查看已加載的驅動程序列表 9 驅動程序的結構 11 驅動程序對象和設備對象 13 實驗:看一看設備對象 15 實驗:顯示驅動程序和設備對象 17 打開設備 18 實驗:查看設備句柄 21 實驗:查看Windows設備名稱之間的映射 23 8.3 I/O處理 24 I/O類型 24 同步I/O和異步I/O 24 快速I/O 25 實驗:查看一個驅動程序登記的快速I/O例程 25 映射文件I/O和文件緩存 26 分散/聚集I/O 27 I/O請求包 27 IRP棧單元 28 實驗:查看驅動程序的分發例程 29 實驗:查看一個線程的未完成IRP 29 IRP緩沖區管理 30 針對單層驅動程序的I/O請求 32 為一個中斷提供服務 33 完成一個I/O請求 34 同步 36 針對分層的驅動程序的I/O請求 38 實驗:查看一個設備棧 39 實驗:查看IRP 40 線程無關I/O 45 I/O取消 45 用戶發起的I/O取消 46 線程終止時的I/O取消 47 實驗:調試一個無法被殺死的進程 48 I/O完成端口 49 IoCompletion對象 50 使用完成端口 50 I/O完成端口操作 52 I/O優先級支持 54 I/O優先級 54 優先化策略 55 I/O優先級反轉的避免(I/O優先級繼承) 57 I/O優先級提升和撞升 57 實驗:“非常低”和“正常”I/O吞吐量的對比 58 實驗:I/O優先級提升/撞升的性能分析 59 帶寬預留(計劃的文件I/O) 60 容器通知 60 驅動程序檢驗器(Driver Verifier) 61 8.4 內核模式驅動程序框架(KMDF) 63 KMDF驅動程序的結構和操作 64 實驗:顯示KMDF驅動程序 65 KMDF數據模型 66 KMDF的I/O模型 69 8.5 用戶模式驅動程序框架(UMDF) 72 8.6 即插即用(PnP)管理器 76 即插即用支持的級別 77 驅動程序對于即插即用的支持 77 驅動程序加載、初始化和安裝 79 Start值 80 設備列舉 81 實驗:將設備樹轉儲出來 84 設備棧 85 設備棧的驅動程序加載 86 實驗:在設備管理器中查看詳細的devnode信息 88 驅動程序安裝 90 實驗:檢查一個驅動程序的INF文件 92 實驗:查看目錄(catalog)文件 93 8.7 電源管理器 94 電源管理器的操作 96 驅動程序的電源操作 97 實驗:查看一個驅動程序的電源映射關系 97 實驗:查看系統的電源能力和策略 98 驅動程序和應用程序對于設備電源的控制 100 電源可用性請求 100 實驗:在調試器中查看一個電源可用性請求 101 實驗:利用Powercfg查看電源可用性請求 103 處理器電源管理(PPM) 103 核心停運的策略 104 利用率函數 105 實驗:查看利用率和頻率的信息 106 實驗:查看利用率和頻率的歷史 107 算法覆蓋 108 增加/減少動作 108 各種閾值和策略的設置 109 實驗:查看當前的核心停運策略 111 “性能檢查”算法 112 實驗:查看當前的PPM檢查信息 116 8.8 本章總結 118 第9章 存儲管理 119 9.1 有關存儲的術語 119 9.2 磁盤設備 120 旋轉磁盤 120 磁盤的扇區格式 120 固態硬盤 122 NAND型閃存 122 文件的刪除和irim命令 124 9.3 磁盤驅動程序 125 Winload 125 磁盤類、端口和小端口驅動程序 126 iSCSI驅動程序 127 多路徑I/O(MPIO)驅動程序 128 實驗:觀察物理磁盤I/O 130 磁盤設備對象 130 分區管理器 131 9.4 卷的管理 132 基本磁盤 133 MBR風格的分區 133 GPT(GUID分區表)分區方案 133 基本磁盤卷管理器 134 動態磁盤 135 LDM數據庫 135 實驗:使用LDMDump來查看LDM數據庫 137 LDM和GPT或MBR風格的分區方案 139 動態磁盤的卷管理器 140 多分區卷的管理 140 跨距卷 141 條帶卷 142 實驗:觀察鏡像卷的I/O操作 143 RAID-5卷 145 卷名字空間 145 掛載管理器 146 掛載點 147 卷的掛載 148 實驗:查看VPB 149 卷的I/O操作 152 虛擬磁盤服務 153 9.5 虛擬硬盤(VHD文件)支持 155 附載VHD的操作 156 嵌套的文件系統 156 9.6 BitLocker驅動器加密 157 加密密鑰 159 可信平臺模塊(TPM) 161 BitLocker引導過程 163 BitLocker密鑰的恢復 165 全卷加密驅動程序 166 BitLocker的管理 167 BitLocker To Go 168 9.7 卷影像(shadow)拷貝服務 170 影像拷貝 170 “克隆”影像拷貝 170 “寫時復制”影像拷貝 170 VSS的架構 170 VSS的操作 171 影像拷貝提供者 172 實驗:查看Microsoft影像拷貝提供者的過濾型設備對象 173 Windows中的用途 174 備份 174 實驗:查看影像卷的設備對象 174 “之前的版本”和系統還原 175 實驗:導航到“之前的版本” 176 實驗:映射卷影像設備對象 177 9.8 本章總結 178 第10章 內存管理 179 10.1 內存管理器簡介 179 內存管理器組件 180 內部同步 181 檢查內存的使用情況 182 實驗:查看系統內存信息 182 10.2 內存管理器提供的服務 184 大頁面和小頁面 185 保留頁面和提交頁面 187 實驗:保留的頁面對比提交的頁面 188 提交限額 190 鎖住內存 190 分配粒度 191 共享內存和映射文件 192 實驗:查看內存映射文件 193 保護內存 194 “不可執行”頁面保護 196 實驗:查看進程上的DEP保護 199 軟件的數據執行保護 200 寫時復制 201 地址窗口擴展 203 10.3 內核模式堆(系統內存池) 204 內存池的大小 205 實驗:確定最大的池大小值 206 監視內存池的使用 208 實驗:診斷內存池泄漏 210 快查表(Look-Aside List) 211 實驗:查看系統的快查表 212 10.4 堆管理器 212 堆的類型 213 堆管理器結構 214 堆同步 215 低碎片堆 215 堆的安全特性 216 堆的調試特性 217 pageheap 218 容錯堆 218 10.5 虛擬地址空間的布局結構 219 x86地址空間的布局結構 221 實驗:檢查一個應用程序能否感知大地址空間 222 x86系統地址空間的布局結構 223 x86會話空間 224 實驗:查看會話 224 實驗:查看會話空間的使用情況 225 系統頁表項(PTE,Page Table Entry) 226 實驗:查看會話空間的使用情況 226 64位地址空間布局結構 227 x64虛擬尋址的限制 230 Windows x64的16TB限制 231 動態的系統虛擬地址空間管理 233 實驗:查詢系統虛擬地址的用量 234 實驗:設置系統虛擬地址的限制值 235 系統的虛擬地址空間配額 236 用戶地址空間的布局結構 237 實驗:對用戶虛擬地址空間進行分析 238 映像隨機化 239 棧的隨機化 240 堆的隨機化 240 內核地址空間中的ASLR 240 對安全性緩和措施的控制 240 實驗:查看進程上的ASLR保護 241 10.6 地址轉譯 241 x86虛擬地址轉譯 242 頁目錄 245 實驗:檢查頁目錄和PDE 245 頁表和頁表項 246 頁表項中硬件和軟件的“寫”位 247 頁面內的字節 248 地址轉譯快查緩沖區 248 物理地址擴展(PAE) 249 實驗:轉譯地址 251 x64虛擬地址轉譯 253 IA64虛擬地址轉譯 254 10.7 頁面錯誤處理 255 無效PTE 256 原型PTE 258 頁面換入I/O 259 沖突的頁面錯誤 260 聚簇的頁面錯誤 260 頁面文件 261 實驗:查看系統頁面文件 262 提交用量和系統提交限額 263 提交用量和頁面文件的大小 266 實驗:利用任務管理器來查看頁面文件使用量 266 10.8 棧 268 用戶棧 268 實驗:創建最大數量的線程 268 內核棧 269 實驗:觀察內核棧的使用量 269 DPC棧 270 10.9 虛擬地址描述符 270 進程的VAD 271 實驗:查看虛擬地址描述符 272 旋轉VAD 272 10.10 NUMA 273 10.11 內存區對象 274 實驗:查看內存區對象 275 實驗:查看控制區域 277 10.12 驅動程序檢驗器 280 10.13 頁面幀編號數據庫 284 實驗:查看PFN數據庫 287 頁面列表的動態變化 288 實驗:空閑列表和零頁面列表 289 實驗:已修改列表和備用列表 291 頁面優先級 296 實驗:觀察區分優先級的備用列表 298 已修改頁面寫出器 299 PFN數據結構 301 實驗:查看PFN項 304 10.14 物理內存的限制 305 Windows客戶版本的限制 306 32位客戶的有效內存限制 307 10.15 工作集 309 按需換頁 309 邏輯預取器 310 實驗:窺探預取文件內部 312 實驗:觀察預取文件的讀和寫 312 放置策略 313 工作集管理 314 實驗:查看進程工作集大小 316 實驗:工作集與虛擬大小 316 實驗:在調試器中查看工作集列表 317 平衡集管理器和交換器 318 系統工作集 319 內存通知事件 320 實驗:查看內存資源通知事件 321 10.16 主動式內存管理(Superfetch) 322 各個組件 322 跟蹤過程和日志記錄 324 場景 325 頁面優先級和重平衡 326 魯棒性能 328 RAM優化軟件 329 ReadyBoost 330 ReadyDrive 331 統一緩存 332 進程反射 334 實驗:利用Preflect來觀察進程反射的行為 336 10.17 本章總結 337 第11章 緩存管理器 338 11.1 緩存管理器的關鍵特性 338 單個中心化的系統緩存 339 內存管理器 339 緩存一致性 339 虛擬塊緩存 341 流式緩存機制 341 對可恢復文件系統的支持 341 11.2 緩存的虛擬內存管理 342 11.3 緩存的大小 344 緩存的虛擬大小 344 緩存的工作集大小 344 實驗:查看系統緩存的工作集 345 緩存的物理大小 345 11.4 緩存的數據結構 347 系統范圍的緩存數據結構 347 實驗:查看系統緩存的工作集 349 針對每個文件的緩存數據結構 350 實驗:查看共享的和私有的緩存表 353 11.5 文件系統接口 355 從緩存中來回拷貝數據 356 通過映射和鎖定接口進行緩存 356 通過直接內存訪問接口進行緩存 357 11.6 快速I/O 357 11.7 預讀(Read Ahead)和滯后寫(Write Behind) 359 智能預讀 359 回寫緩存(Write-Back Caching)和延遲寫(Lazy Writing) 361 實驗:觀察緩存管理器的活動情況 362 禁止一個文件的延遲寫出行為 367 強迫緩存被直寫(write-through)到磁盤上 367 刷新映射文件 367 實驗:觀察緩存的刷新 368 寫節流(Write Throttling) 369 實驗:查看寫節流參數 370 系統線程 370 11.8 本章總結 371 第12章 文件系統 372 12.1 Windows文件系統格式 373 CDFS 373 UDF 374 FAT12、FAT16和FAT32 374 exFAT 377 NTFS 377 12.2 文件系統驅動程序總體結構 378 本地FSD 379 遠程FSD 380 鎖定 381 實驗:查看已注冊文件系統的列表 383 文件系統操作 387 顯式文件I/O 388 內存管理器的修改頁面寫出器和映射頁面寫出器 392 緩存管理器的延遲寫出器(Lazy Writer) 392 緩存管理器的預讀線程 392 內存管理器的頁面錯誤處理器 393 文件系統過濾型驅動程序 393 進程監視器 393 實驗:查看進程監視器的過濾型驅動程序 394 12.3 診斷文件系統的問題 395 進程監視器的基本和高級模式 395 實驗:在一個空閑系統上查看文件系統的活動 395 進程監視器診斷技巧 396 12.4 公用日志文件系統 397 列集操作 397 日志的類型 398 日志的布局結構 400 日志序列號 401 日志塊 401 所有者頁面 402 虛擬LSN到物理LSN的轉譯 403 管理策略 404 12.5 NTFS設計目標和特性 404 高端(High-End)文件系統的需求 404 可恢復性 405 安全性 405 數據冗余和容錯能力 405 NTFS的高級特性 406 多數據流 406 實驗:查看數據流 408 基于Unicode的名稱 408 通用的索引設施 409 動態的壞簇重新映射 409 硬鏈接(link)和交接(junction) 409 實驗:創建一個硬鏈接 410 符號(軟)鏈接和交接(junction) 410 實驗:創建一個符號鏈接 412 壓縮文件和稀疏文件 412 變化日志 413 針對每個用戶的卷配額 413 鏈接跟蹤 414 加密 415 POSIX支持 416 碎片整理 416 動態分區 417 12.6 NTFS文件系統驅動程序 419 12.7 NTFS在磁盤上的結構 421 卷(volume) 421 簇(cluster) 422 主文件表(MFT) 423 實驗:查看NTFS信息 425 文件記錄號 426 文件記錄 426 文件名 429 隧道傳輸 431 駐留的和非駐留的屬性 432 數據壓縮和稀疏文件 435 壓縮稀疏數據 435 壓縮非稀疏數據 437 稀疏文件 439 變化日志文件 439 實驗:讀取變化日志 441 索引 442 對象ID 444 配額跟蹤 444 統一的安全性 445 重解析點 447 事務支持 447 隔離性 448 實驗:理解和管理事務 449 事務型API 450 資源管理器 451 實驗:查詢資源管理器的信息 452 磁盤上的實現 453 日志的實現 454 恢復的實現 455 12.8 NTFS的恢復支持 455 設計 456 元數據日志記錄 457 日志文件服務(LFS) 457 日志記錄類型 459 恢復 461 分析掃描(Analysis Pass) 462 重做掃描(Redo Pass) 463 撤銷掃描(Undo Pass) 463 NTFS的壞簇恢復 465 自我修復 468 12.9 加密文件系統(EFS)安全性 469 第一次加密一個文件 472 加密文件數據 473 解密過程 474 加密文件的備份 474 實驗:查看EFS信息 475 加密文件的復制 475 12.10 本章總結 476 第13章 啟動和停機 477 13.1 引導過程 477 BIOS引導準備 477 BIOS引導扇區和Bootmgr 481 UEFI引導過程 495 從iSCSI引導 496 初始化內核和執行體子系統 497 實驗:加載器參數塊 497 Smss、Csrss和Wininit 504 未完成的文件重命名操作 507 ReadyBoot 509 自動啟動的映像文件 510 實驗:Autoruns 511 13.2 引導和啟動問題的故障檢查 511 最后已知的好配置 512 安全模式 512 安全模式下的驅動程序加載 513 能感知安全模式的用戶程序 514 安全模式下的引導日志 515 Windows恢復環境(WinRE) 516 引導狀態文件 519 解決常見的引導問題 520 MBR損壞 520 引導扇區損壞 520 BCD的錯誤配置 520 系統文件損壞 521 Windows資源保護 522 System儲巢損壞 523 啟動屏幕之后的崩潰或者掛起 523 13.3 停機 525 實驗:驗證HungAppTimeout值 526 13.4 本章總結 528 第14章 崩潰轉儲分析 529 14.1 Windows為什么會崩潰 529 14.2 藍屏 530 Windows崩潰的原因 531 14.3 診斷崩潰問題 533 14.4 崩潰轉儲文件 535 實驗:查看轉儲文件的信息 539 崩潰轉儲的生成 540 14.5 Windows錯誤報告 542 14.6 在線崩潰分析 543 14.7 基本的崩潰轉儲分析 545 Notmyfault 545 基本的崩潰轉儲分析 546 詳細的分析 547 14.8 使用崩潰診斷工具 549 緩沖區溢出、內存破壞和特殊內存池 550 實驗:通過驅動程序檢驗器啟用特殊內存池 552 代碼改寫和系統代碼寫保護 553 14.9 高級的崩潰轉儲分析 554 棧破壞 555 掛起的或無響應的系統 557 實驗:利用LiveKd來生成Hyper-V客戶的轉儲 559 當沒有崩潰轉儲時 561 實驗:附載一個內核調試器 562 14.10 對常見停止代碼的分析 564 0xD1 - DRIVER_IRQL_NOT_LESS_OR_EQUAL 564 0x8E - KERNEL_MODE_EXCEPTION_NOT_HANDLED 566 0x7F - UNEXPECTED_KERNEL_MODE_TRAP 567 0xC5 - DRIVER_CORRUPTED_EXPOOL 569 硬件故障 571 實驗:藍屏屏幕保護程序 572 14.11 本章小結 572 |
序: |
|