每天我們都在使用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支援單處理器、多處理器、***paq systempro),不同的硬體平台上有不同的硬體抽象層實現。在我們通常使用的標準pc上這個檔案就是hal.dll(在***paq 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等等,這些以後慢慢談;再就是系統支援程序,如**ss.exe(會話管理器)、winlogon.exe(登陸程式)、lsass.exe(本機安全許可權子系統)等,這些都是專門的內容,有機會將做專題研究。在這裡提到的程序都是windows系統正常執行必要的一些程序,也就是說它們是安全的,大家不必對其有疑心(當然了,有漏洞那是例外)。大部分使用者級別應用程式的執行要呼叫kernel32.dll,然後再間接呼叫ntdll.dll,系統支援程序等程式有的是直接呼叫ntdll.dll。
每天我們都在使用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的操作想來是很熟練了,可是你又對windows到底了解多少呢?本系列的目的,就是讓你對windows系統有個更直觀 更清楚 更徹底的認識。雖然我們大多數人看不到windows的原始碼,對其記憶體排程演算法這種最深層次的技術內...
機器學習9 10 12 100天 SVM直觀認識
github 100daysofmlcode svm是一種監督學習演算法,可用於分類問題和回歸問題,主要用於分類問題。在該演算法中,將資料的每乙個特徵看作是n維空間的乙個維度,之後對空間中的點進行分類劃分。分類方法是找到乙個超平面,可以將資料劃分在超平面的兩側。最佳超平面是劃分的兩類資料點中距超平面...
單鏡反光機引數的直觀認識
正確的 對攝影非常重要。單鏡反光機可以控制的引數有很多,但是,為了獲得合適的 最重要引數是光圈 快門 iso這3個。為了更直觀的掌握這幾個引數對 過程影響,可以拿水龍頭接水做個比喻。攝影要考慮的因素 被比喻成 控制方法 快門水龍頭開啟的時間 可以設定 光圈水龍頭開的大小 可以設定 iso杯子的大小 ...