直觀認識Windows

來源:互聯網
上載者:User

每天我們都在使用Windows系統學習、編程、聽音樂、玩遊戲,Windows的操作想來是很熟練了,可是你又對Windows到底瞭解多少呢?本系列的目的,就是讓你對Windows系統有個更直觀、更清楚、更徹底的認識。雖然我們大多數人看不到Windows的源碼,對其記憶體調度演算法這種最深層次的技術內幕不能明窺,但是我們可以做到比現在知道的更多,瞭解這些之後你會發現在Windows上面開發會輕車熟路,任何木馬病毒到了你機器上不過只會成為你的實驗品。

鑒於Windows 9X核心早已淘汰,技術過時,在此不予討論。主要是針對Windows2000(Windows 5.0)以後版本,尤以2000為主。要知道xp是Windows 5.1版本,2003也才是5.2版本。那麼,對於本系列提到Windows OS技術,統指Windows 5.X技術。

 

一、直觀認識Windows

分析一個軟體,最容易的入手方法就是先搞清楚它的每個檔案都是幹嘛的。我們先來讓大家對自己正在使用的Windows 作業系統有個直觀認識。請在你使用的Windows 2000或Windows XP上,於WINNT/system32或Windows/system32目錄(系統目錄)下,找到以下幾個檔案:HAL.DLL、NTOSKRNL.EXE、NTDLL.DLL、KERNEL32.dll、GDI32.DLL、USER32.DLL。這幾個是Windows系統賴以執行的關鍵,只要你能在圖形介面下操作Windows,這幾個檔案就肯定在發揮作用。值得一提的是Windows的圖形介面子系統是在核心實現的(知道為什麼Linux的圖形介面怎麼著都沒Windows好看好用了吧)。

 

對這幾個檔案的功用給出簡介如下:

HAL.DLL:Hardware Abstraction Layer,硬體抽象層。
Windows 2000也是一個軟體系統,與我們平時從事的項目開發工作一樣,項目初期需要確定開發目標。而Windows2000開發當初制定的開發目標之一就是要能夠在多種硬體平台上移植(Windows2000支援單一處理器、多處理器、Compaq SystemPro),不同的硬體平台上有不同的硬體抽象層實現。在我們通常使用的標準PC上這個檔案就是HAL.DLL(在Compaq SystemPro上是HALSP.DLL,滿足不同硬體平台的硬體抽象層檔案在Windows安裝盤上都有,安裝時根據電腦的平台類型只複製相應的檔案)。
HAL是可載入的核心模式模組(DLL動態連結程式庫檔案),它為Windows系統所啟動並執行硬體平台提供低級介面。它隱藏硬體相關的細節,如I/O介面、中斷控制器和多處理器通訊機制等這些與特定硬體結構機密相關的內容,而向作業系統核心提供統一的硬體介面函數。

 

NTOSKRNL.EXE:NT OS Kernel,毋庸置疑,這就是Windows系統的核心,確切說核心是在這裡面實現的,只有1.6兆,與目前Linux2.4版本核心編譯後的大小差不多。
這個檔案實際上提供兩部分的主要的功能:

一是系統核心,這在硬體抽象層之上,提供系統的基本機制(線程調度和同步、記憶體配置等等一切你在作業系統原理書上可以看到的最複雜的那一部分,如果你覺得作業系統課程學得太抽象又有點跟自己過不去,試著把這個NTOSKRNL.EXE反組譯碼了讀一讀吧,不多,也就300多萬行彙編碼,只是找不著確切的進入點)。同時核心還提供硬體支援,實際上是將驅動程式等上層程式的調用對硬體進行具體化,反過來講就是硬體抽象層再抽象一次,暴露給上層一個統一的介面,寫過Windows驅動程式或是看過DDK的同學一定對Windows WDM驅動的固定編寫入模式有很深的印象。

 
二是執行程式(稱為Executive)。這個執行程式的東東可真是多啊,我在搗騰的時候都有點讓它搞得暈暈的,不過現在來看呢其實也就一句話:執行程式是開發人員與Windows之間互動的視窗,再直觀點說執行程式對外暴露Windows開發函數,經過幾次封裝後供開發人員使用。我們先不管這些函數的功能分類,按功能分類的話東西有點多有點亂,容易讓人puzzled。按開發人員的角度來看,有這麼幾類:Win32 API函數,這是做應用開發用的,我們常說的MFC、ATL是對其進行的物件導向化及封裝;DDK API函數和IFS kit函數,這是供驅動開發用的,DDK還耳熟些,不過如果你瀏覽過DDK並且夠細心的話就會覺得奇怪為啥OS很重要的一部分——檔案系統驅動的開發沒有提供,IFS(Installable File System) Kit就是做這個的啦。

 

我們前面說過Windows把圖形介面處理放在了核心態來執行,因此不得不提一個比較特殊的驅動:Win32k.sys,你看到的漂亮的Windows案頭就是這個檔案畫出來的。

 

講到這裡,前述內容是Windows系統在核心態啟動並執行準系統,也就是說,這是運行於CPU ring0層級的(不懂什麼是ring的話趕緊去Intel的網站download Intel CPU的系統開發參考看,甭翻你手頭的微機原理課本了,那上面沒有)。還有一大堆驅動也是運行在這個層級。在核心層級上,組件之間功能的調用等等與使用者態不同,常用的是LPC,這個我們以後慢慢再講。

 

繼續下面的內容之前,要先說明一點事實:Windows的功能比我們平時所見的要強大的多。通常我們講Win32,實際上這隻是Windows的一個子系統而已,Windows還有另外的兩個子系統:POSIX和OS/2。這麼一說的話似乎Linux上的程式可以在Windows上運行了,其實沒那麼簡單,還需要移植庫以及重新編譯串連,最終還得依賴Win32子系統的實現來完成其功能,意義不大,基本上算是被使用者們喀嚓掉了吧,我們也是只講Win32子系統。點明一點:不同的子系統有專門的子系統支援環境,POSIX子系統是POSIX.EXE,Win32子系統是Csrss.EXE(全稱是Client/Server Run-time SubSystem)。所以,你的機器上總有Csrss.exe這樣一個進程在運行,別無聊的以為它是木馬沒事就Kill著玩。

 

下面是使用者層級的內容。為了方便理解,核心層級的分層介紹我們是從下往上(由硬到軟)開始,在使用者層級,我們從上往下開始介紹,這樣更直觀些。

我們先舉一個應用程式的例子(儘管使用者層級的程式遠不止應用程式這麼多),從IE講起。如果你裝了VC,並且順帶安裝了Depends這個工具,用它開啟IE(或是任何一個windows可執行檔都可),你會發現IE主程式(IEXPLORE.EXE)調用了Kernel32.DLL,而Kernel32.DLL又調用了NTDLL.DLL,同時,IE主程式還調用了USER32.DLL,USER32.DLL又有對GDI32.DLL、KERNEL32.DLL、NTDLL.DLL的調用,期間還有迴圈調用。

 

去繁從簡,Win32應用程式要調用Win32 API函數,這些函數正是有KERNEL32.DLL提供的,而KERNEL32.DLL這個檔案其實並不實現具體的功能,只是做了一個簡單的地址指標轉換,把函數進入點又跳到NTDLL.DLL裡去了,對應到了相應的本機API(NATIVE API)函數上,NTDLL.DLL也不做具體的處理,通過系統功能調用將使用者級的函數調用轉換成核心模式的真正的系統功能調用,由核心執行完畢後返回應用程式進程。也許有人要問Windows為什麼要通過Kernel32.DLL和NTDLL.DLL對執行程式Executive暴露的編程介面做兩次封裝,其實這也是Win32 API和NATIVE API的區別。Win32 API又稱為存檔的API,是供使用者使用的,必須保持一致性和相容性,不能隨隨便便修改函數命名,新函數的增加必須保持對老函數的相容,否則使用老版本的Win32 API開發(直觀的就是我們使用win32 SDK或MFC開發)的程式在新版本的系統上可能就要運行出錯。而NATIVE API則是在系統更新時可能需要進行修改的函數,比如函數名、函數參數的類型和個數等,都有可能隨著系統升級而變更,因此是留給MS自己人來用的,當然不能直接給使用者使用。但這不是說就我們作為開發人員就不能使用NATIVE API,如果你自己定位NTDLL.DLL中的函數並進行調用,只要這個函數未被MS修改,可以肯定這種調用是成功的,你的程式運行也沒有任何問題。與KERNEL32.DLL類似的還有一個ADVAPI32.DLL,提供一些比較進階的應用編程函數。

 

GDI32.DLL和USER32.DLL提供存檔的Win32圖形編程介面,它們也是通過NTDLL.DLL來完成對系統繪圖功能(在win32k.sys中實現)的調用。

KERNEL32.DLL、ADVAPI32.DLL、USER32.DLL和GDI32.DLL統稱為Win32子系統DLL。Win32子系統DLL將存檔的Win32 API函數“翻譯”為相應的對本機API函數調用,NTDLL.DLL將本機API“翻譯”為NTOSKRNL.EXE和Win32k.sys的核心模式系統服務調用,來完成使用者層級功能需求的實現。

 

講過應用程式之後,再看看使用者層級的其它程式。環境子系統(Win32子系統、POSIX子系統、OS/2子系統),這個前面提過了;服務進程,也就是你在服務管理員裡可以看到的那一堆東東,包括Services.EXE這個比較特殊的服務程式、svchost.exe等等,這些以後慢慢談;再就是系統支援進程,如SMSS.EXE(會話管理器)、WINLOGON.EXE(登陸程式)、LSASS.EXE(本機安全許可權子系統)等,這些都是專門的內容,有機會將做專題研究。在這裡提到的進程都是Windows系統正常運行必要的一些進程,也就是說它們是安全的,大家不必對其有疑心(當然了,有漏洞那是例外)。大部分使用者層級應用程式的執行要調用KERNEL32.DLL,然後再間接調用NTDLL.DLL,系統支援進程等程式有的是直接調用NTDLL.DLL。

Windows的基本架構大致如此,下面是Windows 2000的系統架構圖,可作為閱讀上述文字時的參考。

每天我們都在使用Windows系統學習、編程、聽音樂、玩遊戲,Windows的操作想來是很熟練了,可是你又對Windows到底瞭解多少呢?本系列的目的,就是讓你對Windows系統有個更直觀、更清楚、更徹底的認識。雖然我們大多數人看不到Windows的源碼,對其記憶體調度演算法這種最深層次的技術內幕不能明窺,但是我們可以做到比現在知道的更多,瞭解這些之後你會發現在Windows上面開發會輕車熟路,任何木馬病毒到了你機器上不過只會成為你的實驗品。

鑒於Windows 9X核心早已淘汰,技術過時,在此不予討論。主要是針對Windows2000(Windows 5.0)以後版本,尤以2000為主。要知道xp是Windows 5.1版本,2003也才是5.2版本。那麼,對於本系列提到Windows OS技術,統指Windows 5.X技術。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.