Windows核心情景分析

Windows核心情景分析

《Windows核心情景分析》是2009年電子工業出版社出版的圖書,作者是毛德操。《Windows核心情景分析》通過分析ReactOS的原始碼介紹了Windows核心各個方面的結構、功能、算法與具體實現。全書從“記憶體管理”、“進程”、“進程間通信”、“設備驅動”等多個方面進行分析介紹,所有的分析都有ReactOS的原始碼(以及部分由微軟公開的原始碼)作為依據,使讀者能深入理解Windows核心的方方面面,也可以使讀者的軟體開發能力和水平得到提高。

基本介紹

  • 書名:Windows核心情景分析
  • 作者:毛德操
  • 類別:圖書 >> 計算機/windows >> 核心
  • 頁數:1492頁
  • 定價:190.00元
  • 出版社:電子工業出版社
  • 出版時間:2009年5月1日
  • 開本:16開
內容簡介,專家評價,序,前言,目錄,

內容簡介

歷時3年,近1500頁篇幅,毛德操老師重磅著作。本書可供大學有關專業的高年級學生和研究生用做教學參考,也可供廣大的軟體工程師,特別是從事系統軟體研發的工程師用於工作參考或用做進修教材。

專家評價

作業系統是最基礎、最核心的計算機軟體。長期處於技術壟斷地位的Windows作業系統,其源程式代碼是不公開的,可看成一個“黑盒子”。毛德操先生這本書,通過分析ReactOS的源程式代碼,介紹了Windows作業系統核心的結構及其各種機制,使讀者能深入理解Windows作業系統核心這個“黑盒子”的各個方面,這對於打破Windows的技術壟斷,開發具有自主智慧財產權的新型作業系統,實現Windows與Linux作業系統的高度互操作,具有重大的實際價值。毛德操先生在剖析Windows、Linux等作業系統核心的結構與機制方面,走在了國際學術界的前列。本書的出版具有重要的學術價值。
中國開源軟體推進聯盟
陸首群
2009年2月24日

多年來,Windows壟斷了中國桌面作業系統,中國學校中也開設了很多Windows課程,但令人遺憾的是,由於Windows的原始碼不開放,這些課程往往只能使學生了解Windows的外特性和操作方法,卻不能使學生了解和掌握Windows的核心。
有人會問:難道中國人真的需要深入到作業系統的核心,去掌握它的核心技術嗎?有人說:微軟花了上千億美元開發出Windows作業系統,中國人花1000元人民幣就能買到,為什麼還要自己去研究和開發呢?一些外國諮詢公司也為中國政府支招,如麥肯錫公司在2002年所做的《中國軟體產業發展戰略研究報告》就主張中國不必發展作業系統,而應像印度那樣,主要發展面向出口的離岸外包業務。這樣的觀點前些年在中國相當流行,影響了不少人。
2008年10月,有一個事件震驚了中國:微軟宣稱將對其認為是使用盜版Windows和Office的電腦實行了“黑屏”。用戶面對“黑屏”束手無策,這才意識到,自己的電腦被微軟操控了!中國信息安全的軟肋由此暴露無遺。
事實上,在信息安全方面我國歷來要求使用“自主可控”的軟體和硬體,“黑屏”事件更使廣大用戶有了切膚之痛,認識到自主可控的重要性。現今,世界上許多國家也有了這種共識,如俄國、歐洲和拉丁美洲的一些國家都在發展基於開源軟體Linux的自主作業系統。在這方面,現中國的重大進展是起動了“核高基”重大專項,這是按照《國家中長期科學和技術發展規劃綱要(2006-2020年)》所部署的,旨在發展“核心電子器件、高端通用晶片及基礎軟體產品”。其中的“基礎軟體產品”中最重要的就是作業系統。這樣,持續多年的中國要不要發展自主作業系統的爭議終於有了定論。通過“核高基”專項,中國有望在今後三個五年計畫內實現自主作業系統的產業化,將來中國的信息系統再不會被人“黑屏”了。
當然,中國發展自主作業系統的意義不僅僅是為了保障信息安全。作為一個有13億人口的大國,中國擁有自主作業系統將產生巨大的經濟效益,並帶動其下游的整個軟體和信息服務業的發展。
雖然當前以Linux為代表的開源軟體為中國發展自主作業系統提供了很好的支撐,但學習和借鑑Windows也有重要價值。在這個時候,毛德操先生所著的《Windows核心情景分析》出版了,它為廣大讀者打開了通向Windows核心的大門。
正如作者所說,“對於作業系統核心這么複雜的軟體,是一定要結合具體的代碼(哪怕只是用來描述算法的偽代碼)才能說清楚的”。在Windows原始碼不開放的情況下,作者不得不主要地基於開源的ReactOS來作分析。ReactOS被譽為“開源Windows”,它的目標是研發一個開源的Windows核心,這對於打破微軟的技術壟斷很有好處。我們認為,在當前的實際條件下,作者基於ReactOS原始碼並輔以部分由微軟公開的原始碼來編寫本書,是一條切實可行的途徑。
與其說本書是一部單純的學術著作,不如說這更是一篇實踐經驗的總結。本書正是毛德操先生近段時間來領導開發“兼容核心(Unified Kernel)”項目的一篇經驗總結。早在2004年毛先生就提出了開發“兼容核心”的倡議,他提出開發一個既能支持Linux套用軟體運行、也能支持Windows套用軟體運行的核心,這與開源項目Wine有異曲同工之妙。Wine是通過在Linux核心的外面加一個適配層,使得Windows套用軟體的二進制代碼可以直接在Linux核心上運行,但這樣做難免帶來性能的下降,或難以做到完全兼容。相比之下,“兼容核心”採取了更為直接的技術途徑,也有可能做得更好。
不過,這些年這個倡議也受到了不少質疑。有人認為沒有必要,有人懷疑做不出來,有人認為缺乏學術價值等等。儘管這些質疑似乎也有這樣那樣的道理,但如果為廣大用戶著想,那么誰也不能否認“兼容核心”的價值——一個既能運行Windows套用軟體又能運行Linux套用軟體的作業系統,而且又是低價的、自主可控的,這無疑是廣大用戶的福音!
應當感謝國家發改委和浙江省科技廳支持了“兼容核心”這個開源項目。在中國,像他們這樣勇於支持軟體業自主創新的行動還不是很多,因而值得大書特書。正是通過領導“兼容核心”的開發工作,作者取得了剖析Windows核心的實踐經驗,因此這本書將能很好地指導作業系統和其他許多軟體的開發實踐。
本書是毛德操和胡希明先生所著的《Linux核心原始碼情景分析》的姊妹篇。前一篇在短短的時間裡印刷了四次,深受廣大讀者歡迎,因此可以預見,本書也將收到類似於前一篇的歡迎程度。
中國工程院院士
倪光南
2009年3月9日

前言

世上有這么一些人,這些人對於感興趣的事物絕不滿足於僅僅知其然,而非得要知其所以然才能舒服。這些人裡面,如果感興趣的是計算機作業系統、特別是Windows作業系統,那么從這本書里應該能獲得對於許多問題的答案。其實,筆者本人也是這個人群中的一員,筆者閱讀、分析過Linux核心的原始碼,自然就也很想讀一下Windows核心的原始碼,把Windows核心搞搞清楚。以筆者之見,對於像作業系統核心這么複雜的軟體,想要搞搞清楚,就非得要深入到程式代碼中去不可。事實上,筆者有這個願望已經很多年了,可是Windows核心的代碼是不公開的,即便是退而求其次,要找一些深入介紹Windows核心的書籍,也是寥寥無幾,而且看了以後也往往不得要領,覺得實在是語焉不詳甚至模稜兩可。確實,與程式代碼相比,任何自然語言都只能說是模糊而不確切的。幸而現有了ReactOS這個開源項目,這個項目的目標是要研發出一個開源的Windows核心。該項目的參與者們想必對Windows核心下了很深的功夫,在代碼中極力模仿Windows,力求忠實於Windows,然而卻又是自己的實現。讀著ReactOS的代碼,筆者常常回想起一些著作中的有關章節或片段,以前看的時候只好不求甚解,現看到代碼才真的明白了。由此又生出感慨,對於作業系統核心這么複雜的軟體,是一定要結合具體的代碼(哪怕只是用來描述算法的偽代碼)才能說清楚的。把核心的代碼封鎖起來不讓人研究,實際上是對於人類的“知的權利”的蔑視。而對於ReactOS代碼的作者們,筆者則一來是感激,二來是佩服和尊敬,進而覺得應該把自己的理解和體會寫出來與讀者分享。本書所引的代碼基本上都出自ReactOS的0.3.3版,讀者可以自行下載一份代碼,結合本書加以閱讀。
與ReactOS密切相關的另一個開源項目是Wine,這個項目的宗旨是在Linux核心的外面做上一個適配層,由一個服務進程和一些動態連線庫相結合構成的適配層,使得Windows套用軟體的二進制代碼可以直接(不經過移植和重新編譯就)在Linux核心上運行。一言以蔽之,就是“核內差異核外補”。Windows套用軟體本來是要在Windows核心上運行的,而Windows核心與Linux核心顯然有著不小的差異,Wine的目的就是在核外(用戶空間)加以補償和虛擬,使Windows套用軟體得以在Linux核心上運行。在某種意義上,這甚至比ReactOS要做的更難,因為這是要在一個不同的基礎上、不同的環境中重構一個虛擬的Windows核心,沒有對於Windows核心的真正深刻的理解,這顯然是不可能的。筆者曾聽到(看到)一些對ReactOS有所懷疑的說法,說是ReactOS的人怎么能對Windows核心理解得那么深刻?是不是他們拿到了Windows核心的原始碼,而只是在依樣重畫一遍葫蘆?Wine的存在和成功(也許是部分的成功)正好回答了這個問題,正好可以作為佐證。要說對於Windows核心的理解,Wine的作者們絲毫不比ReactOS的作者們差,而Wine的代碼與Windows核心卻相去甚遠、涇渭分明。既然Wine可以一行行代碼從頭寫來,ReactOS又有何不可?
不過,筆者以為,與其研發一個開源的Windows核心,還不如把Linux核心改造成一個“兼容核心(Unified Kernel)”,一個既能支持Linux套用軟體運行,也能支持Windows套用軟體運行的核心。這對於Linux作業系統的普及有著莫大的好處。因為許多用戶已經習慣了Windows作業系統和Windows套用軟體的使用,要使這些用戶改用Linux作業系統,就得為其提供一種平滑過渡的方案,最重要的是使用戶可以繼續使用那些已經在上面投入了種種資源,也已經習慣了的Windows套用軟體。雖然Wine在功能上也能起到相似或者基本相同的作用,但是在核外通過服務進程補償核心差異的做法難免帶來性能的下降,要避免性能的下降,就得在核心中補償核心的差異。筆者的這個主張得到了浙大網新科技股份有限公司的支持,並為此組建了一個研發兼容核心的團隊,後來還得到了國家發改委和浙江省科技廳的項目支持。作為一個開源項目,兼容核心的開發現正在進行之中。筆者由衷地感謝浙大網新科技股份有限公司的支持。此外,無論是兼容核心的開發還是本書的寫作,筆者都得到了中國開源軟體促進會陸首群主席和倪光南院士的鼓勵和支持,在此一併致謝。
所以,驅使筆者寫作本書的動力不僅僅是對Windows核心的研究和介紹,更多地還來自開發兼容核心的需要。從某種意義上說,本書是兼容核心項目的副產品;如果沒有兼容核心項目,恐怕就不會有這本書。事實上,起初電子工業出版社向筆者約稿時,筆者的打算是寫一本五六百頁的Windows與Linux的比較研究。可是,開始寫了以後就覺得不妥,因為既然有了“Linux核心原始碼情景分析”,就不宜再重複那本書中寫過的內容,而應該把篇幅都集中在Windows上。另一方面,更為重要的是,參加兼容核心研發的人對於Linux核心都是比較了解的,而對於Windows核心則往往所知甚少,因而迫切需要有一本對於Windows核心的情景分析。於是本書的寫作計畫一改再改,篇幅愈來愈大,時間愈拖愈長,最後歷時三年才完成了本書的寫作,而篇幅已經達到了一千多頁。為此,筆者要特別感謝電子工業出版社的朱沭紅、白濤兩位編輯,感謝她(他)們的耐心和熱情,更感謝她(他)們對本書的精心編輯。
在本書的寫作過程中,微軟開放了一個縮微的“Windows研究性核心(Windows Research Kernel,即WRK)”的原始碼,供高校用於教學目的。就微軟而言,這當然是個進步,值得歡迎;但是這並不說明WRK是開源的。首先,WRK的公開範圍只是高校,而並不面向公眾,其許可證中明文規定分發的範圍只是“within your educational institution”。而且,許可證雖然允許在文章、書籍中引用代碼中的片段,卻規定“The total amount of source code in each of your snippets should not exceed 50 lines”,即每個片段的長度不能超過50行。更重要的是,WRK其實只是專供教學用的模型,而不是實用意義上的作業系統。筆者認為,實際上WRK離Windows比ReactOS(離Windows)更遠。這樣,即便不考慮許可證所加的限制,如果採用WRK的代碼寫作本書,則本書一半以上的篇幅恐怕就不能存在了。這樣考慮下來,筆者決定還是採用ReactOS的代碼。
然而,ReactOS又畢竟不是Windows本身,並且Windows的有些功能和機制(例如檔案系統中的Notify機制)在ReactOS中迄今尚未實現。所以,筆者衷心希望有朝一日微軟會公開整個Windows核心的代碼,到那時候,如果各方面的條件允許的話,筆者願意再來寫一本“正宗”的Windows核心原始碼情景分析。
當然,我們之所以要研究Windows核心,並不單純是為了滿足知識的欲望。作業系統核心在整個軟體產業鏈中處於上游乃至源頭的位置,對作業系統核心的深入理解對於其他軟體的開發,特別是系統軟體的開發有著重要的影響。我的朋友胡希明教授常常用中醫和西醫來比喻兩種軟體開發的模式,中醫當然也能治病,但是有些病卻只能採用西醫的方法才能奏效。而西醫的最根本的基礎則是對於人體的解剖。實際上,現中醫也要拍片透視照X光了。
電影的人說電影是遺憾的藝術,因為一旦拍成就不能再改了,所以常常留下遺憾。其實,留下遺憾的工作又豈止拍電影。本書尚未付印,但是筆者已經有了遺憾,有些內容本來是應該加以研究並寫入本書的,但是筆者的時間和精力已經不允許了。對於Windows核心這么複雜和龐大的系統,筆者自覺不可能對每一個細節的理解都能正確,所以本書中謬誤之處在所難免,只是筆者再沒有時間和精力細細去摳了,這也是令人遺憾的。

目錄

上 冊
第1章 概述 1
1.1 Windows作業系統發展簡史 1
1.2 用戶空間和系統空間 3
1.3 Windows核心 4
1.4 開源項目ReactOS及其代碼 9
1.5 Windows核心函式的命名 10
第2章 系統調用 12
2.1 核心與系統調用 12
2.2 系統調用的核心入口KiSystemService() 22
2.3 系統調用的函式跳轉 29
2.4 系統調用的返回 32
2.5 快速系統調用 35
2.6 從核心中發起系統調用 42
第3章 記憶體管理 44
3.1 記憶體區間的動態分配 47
3.1.1 核心對用戶空間的管理 48
3.1.2 核心對於物理頁面的管理 60
3.1.3 虛存頁面的映射 67
3.1.4 Hyperspace的臨時映射 78
3.1.5 系統空間的映射 86
3.1.6 系統調用NtAllocateVirtualMemory() 90
3.2 頁面異常 97
3.3 頁面的換出 107
3.4 共享映射區(Section) 115
3.5 系統空間的緩衝區管理 133
第4章 對象管理 136
4.1 對象與對象目錄 136
4.2 對象類型 148
4.3 句柄和句柄表 162
4.4 對象的創建 169
4.5 幾個常用的核心函式 179
4.5.1 ObReferenceObjectByHandle() 179
4.5.2 ObReferenceObjectByPointer() 187
4.5.3 ObpLookupEntryDirectory() 188
4.5.4 ObpLookupObjectName() 192
4.5.5 ObOpenObjectByName() 209
4.5.6 ObReferenceObjectByName() 213
4.5.7 ObDereferenceObject() 214
4.6 對象的訪問控制 218
4.7 句柄的遺傳和繼承 218
4.8 系統調用NtDuplicateObject() 223
4.9 系統調用NtClose() 233
第5章 進程與執行緒 241
5.1 概述 241
5.2 Windows進程的用戶空間 253
5.3 系統調用NtCreateProcess() 273
5.4 系統調用NtCreateThread() 284
5.5 Windows的可執行程式映像 300
5.6 Windows的進程創建和映像裝入 305
5.7 Windows DLL的裝入和連線 329
5.8 Windows的APC機制 358
5.9 Windows執行緒的調度和切換 381
5.9.1 x86系統結構與執行緒切換 382
5.9.2 幾個重要的數據結構 385
5.9.3 執行緒的切換 388
5.9.4 執行緒的調度 395
5.10 執行緒和進程的優先權 409
5.11 執行緒本地存儲TLS 421
5.12 進程掛靠 434
5.13 Windows的跨進程操作 442
5.14 Windows執行緒間的相互作用 450
第6章 進程間通信 467
6.1 概述 467
6.2 共享記憶體區(Section) 469
6.3 執行緒的等待/喚醒機制 470
6.4 信號量(Semaphore) 499
6.5 互斥門(Mutant) 505
6.6 事件(Event) 512
6.7 命名管道(Named Pipe)和信插(Mailslot) 516
6.8 本地過程調用(LPC) 521
6.9 視窗報文(Message) 555
第7章 視窗報文 556
7.1 視窗執行緒與Win32k擴充系統調用 556
7.2 視窗報文的接收 566
7.3 Win32k的用戶空間回調機制 590
7.4 用戶空間的外掛函式 602
7.5 視窗報文的傳送 615
7.6 鍵盤輸入執行緒 628
7.7 滑鼠器輸入執行緒 642
7.8 默認的報文處理 662
第8章 結構化異常處理 665
8.1 結構化異常處理的程式框架 666
8.2 系統空間的結構化異常處理 683
8.3 用戶空間的結構化異常處理 710
8.4 軟異常 720
下 冊
第9章 設備驅動 729
9.1 Windows的設備驅動框架 729
9.2 一個“老式”驅動模組的實例 745
9.3 DPC函式及其執行 769
9.4 核心勞務執行緒 778
9.5 一組PnP設備驅動模組的實例 783
9.6 中斷處理 817
9.7 一個過濾設備驅動模組的示例 828
9.8 設備驅動模組的裝載 830
9.9 磁碟的設備驅動堆疊 858
9.9.1 類驅動disk.sys 860
9.10 磁碟的Miniport驅動模組 887
9.11 命名管道與Mailslot 896
9.12 MDL 918
9.13 同步I/O與異步I/O 932
9.14 IRP請求的完成與返回 946
第10章 網路操作 957
10.1 概述 957
10.2 NDIS及其實現 959
10.3 Windows的網路驅動堆疊 974
10.3.1 NIC驅動 975
10.3.2 LAN驅動模組 997
10.3.3 TCP/IP驅動模組 1014
10.3.4 AFD驅動與Winsock 1035
10.4 Socket的無連線通信 1062
10.5 Socket的有連線通信 1089
10.6 Winsock的實現 1093
第11章 檔案操作 1099
11.1 Win32 API函式CreateFileW() 1099
11.2 NT路徑名 1109
11.3 檔案路徑名的解析 1119
11.4 FAT32檔案系統 1144
11.5 檔案系統驅動的裝載和初始化 1169
11.6 檔案卷的安裝 1175
11.7 檔案的創建 1199
11.8 快取管理 1214
11.9 檔案的讀寫 1237
11.10 NTFS檔案系統簡介 1252
第12章 作業系統的安全性 1278
12.1 概述 1278
12.2 證章 1289
12.3 安全描述塊和ACL 1305
12.4 訪問許可權檢查 1322
第13章 註冊表 1351
13.1 註冊表操作 1351
13.2 註冊表的初始化和裝載 1369
13.3 庫函式RtlQueryRegistryValues() 1376
第14章 系統管理進程與服務進程 1394
14.1 系統管理進程Smss 1394
14.2 Windows子系統的服務進程Csrss 1408
14.3 服務管理進程Services 1424
14.4 服務進程Svchost 1449
跋 1464
參考文獻 1466

相關詞條

熱門詞條

聯絡我們