Windows 程式設計/Windows 系統架構
Windows 最初是由微軟開發的,是一個用於 MS-DOS 的 16 點陣圖形層。隨著它的發展,它獲得了處理 32 位程式的能力,最終在 Windows NT 和 2000 釋出時完全變成了 32 位。在 Windows 95 之後,微軟開始移除對 DOS 的依賴,最終在 Windows 2000 中完全實現了分離。Windows 擁有許多高階功能,但也存在許多特定於平臺的問題。它擁有一個應用程式程式設計介面,包含數千個大部分未記錄的 GUI 函式,並且具有不同程度的 MS-DOS 相容性。此外,隨著 NT(新技術)的出現,Windows 完全依賴於 NT 核心而不是它的 MS-DOS 子系統,NT 核心能夠模擬必要的 DOS 功能。除了 NT 核心之外,微軟還引入了許多 API 包裝器,例如 MFC(微軟基礎類)、COM(元件物件模型)和 .NET 技術。
Windows 上最流行的語言包括 Visual Basic/VB6 和 C/C++,儘管 C++ 正在迅速被 .NET 平臺取代,特別是 C#(C Sharp)。
Windows 1.0、2.0 和 3.11 被認為是較舊一代的 Windows 系統,它們被構建為在 MS-DOS 作業系統之上提供一個簡單的圖形層。Windows 95、Windows 98 和 Windows ME 被設計為繞過 MS-DOS(儘管 DOS 仍然存在),它們都基於相同的程式碼結構,稱為“9x 核心”。Windows NT 4.0、Windows 2000、Windows XP、Windows Vista、Windows 7 和 Windows Server 都基於一組稱為“NT 核心”的程式碼。
今天我們開始一個新的系列文章,重點關注瞭解 Windows 系統架構本身。在我們的第一篇文章中,我們將快速回顧一些基本的 Windows 概念和術語,包括對 Windows API 的簡要概述、服務以及程序和執行緒之間的區別。可以將此視為為我們未來的文章打下基礎,這些文章將涵蓋登錄檔、會話空間和桌面堆等主題。因此,事不宜遲,讓我們從介紹 Windows API 開始。
Windows NT 核心被分成幾個部分,這裡我們將簡要討論 Windows 作業系統的組成。最基本的是檔案 NTOSKRNL.EXE,它是 Windows 作業系統的核心,也是您計算機上最重要的檔案。如果您有興趣自己檢視它,您可以在您自己的 Windows NT 機器上的 C:\Windows\System32 資料夾(也可以使用以下路徑 %systemroot%\system32)中找到它。
NTOSKRNL.EXE 提供了 Windows 的一些基本功能,但僅靠一個檔案無法讓整個系統正常工作。NTOSKRNL 嚴重依賴於一個稱為 HAL.DLL 的 **動態連結庫 (DLL)**。HAL 代表“硬體抽象層”,它是允許低階機制(如中斷和 BIOS 通訊)獨立處理的程式碼部分。
如果我們將 Windows 架構視為分層架構,NTOSKRNL.EXE 和 HAL.DLL 位於最底層,下一層向上包含兩個重要的檔案,NTDLL.DLL 和 WIN32K.SYS。NTDLL 包含許多使用者模式函式,如系統呼叫存根和執行時庫 (RTL) 程式碼,統稱為(大部分未記錄的)“本機 API”。大部分執行時庫程式碼在 NTOSKRNL 和 NTDLL 之間共享。WIN32K.SYS 是一個核心模式驅動程式,它實現視窗和圖形,允許建立使用者介面。
下一層向上包含許多我們主要感興趣的庫。這一層構成了所謂的 **Win32 API**,它包含了使用者在 Windows 中程式設計所需的(幾乎)所有函式。Win32 API 分為 4 個組成部分,每個部分都是一個 .DLL
- kernel32.DLL
- 它包含大多數與系統相關的 Win32 API 函式。大多數這些函式只是圍繞底層 NTDLL 函式的包裝器,但一些功能(如國家語言支援 (NLS) 和控制檯處理)在 NTDLL 中不可用。
- advapi32.DLL
- 它包含其他與系統相關的函式,如登錄檔和服務處理。
- gdi32.DLL
- 它包含許多用於繪圖的基本函式。這些函式都比較簡單,允許使用者在螢幕上繪製形狀(圓形、矩形等)、顯示和操作點陣圖等。
- user32.DLL
- 它包含許多實現 Windows 熟悉的使用者介面的函式。程式、訊息框、提示等都使用 User32 函式實現。User32 透過呼叫由 WIN32K.SYS 實現的系統呼叫來執行其任務。
除了 Win32 API 中的 4 個主要庫之外,還有許多其他重要的庫,Windows 程式設計師應該熟悉它們
- MSVCRT.DLL
- MSVCRT.DLL 是一個動態連結庫,它包含 C 程式設計師應該熟悉的 C 標準庫 (**stdlib**) 函式的實現。這些函式是在常見的標頭檔案 stdio.h、string.h、stdlib.h 等中定義的。
- WS2_32.DLL
- 這是 Winsock2 庫,它包含用於在網際網路上進行通訊的標準伯克利套接字 API。我們將在本書的後面部分討論 winsock 程式設計。
Windows 系統,對於一些人來說可能令人驚訝的是,是一個非常主動的系統。對於那些剛開始使用標準庫進行 C 程式設計的人來說,這不是一個熟悉的概念。在正常的軟體專案中,通常會有一個 main 函式,而 main 函式又會呼叫專案中定義的其他函式。在 Windows 函式中,程式設計師通常會向系統提供函式指標,而 Windows 會呼叫 *進入您的程式*。此外,在 Windows 程式中,當沒有事情要做時,您的程式碼會處於空閒狀態。使用 **訊息迴圈架構**,Windows 會在需要處理事件時向您的程式傳送訊息,程式會響應這些訊息。如果程式沒有響應,則會忽略該訊息。
對於每個程式,Windows 會設定一個訊息佇列結構來處理訊息傳輸過程。Windows 會維護一個所有程式使用的物件和系統資源的列表,併為每個資源分配一個 **控制代碼**。這些控制代碼本身沒有用,但可以傳遞給系統來引用特定的物件和資源。