Windows核心原理與實現--Windows基本結構概述
一、Windows系統結構概述
1、Windows採用雙模式來保護作業系統本身,核心模式和使用者模式。在Windows中,使用者程式碼和核心程式碼有各自的執行環境,而且它們可以訪問的記憶體空間也並不相同。在x86中,核心程式碼可以訪問當前程序的4GB虛擬地址空間,而使用者程式碼只能訪問底端2GB虛擬地址(一般情況下)。
2、Windows子系統與系統核心一起構成了使用者程式的執行環境。Windows子系統既有核心模式部分,也有使用者模式部分。使用者模式部分包括一個單獨的子系統程序和一組連結到各個應用程序中的系統DLL。
3、Windows還包括一組系統程序和服務程序。
二、Windows核心結構概述
1、Windows作業系統的核心分為三層。HAL層,HAL之上的核心層(微核心 micro-kernel,這層包含作業系統原語和功能,例如執行緒和程序,執行緒排程,中斷和異常處理,同步物件和各種同步機制),執行體(executive)層(這一層提供一些可供上層應用程式或核心驅動程式直接呼叫的功能和語義)。Windows核心的執行體包含一個物件管理器,用於一致地管理執行體中的物件。執行體層和核心層位於同一個二進位制模組中,即核心基本模組ntoskrnl.exe。
2、在Windows 32位中使用者模式程式碼只能訪問2GB一下的虛擬記憶體地址孔家,而核心模式程式碼可以訪問當前程序整個4GB虛擬地址範圍。兩者間有一個特殊的64KB地址空間位於0x7FFF0000-0x7FFFFFFF,兩種模式下都不能訪問。這塊地址是給ProbeForRead服務的。
三、Windows核心中的關鍵元件概述
1、HAL hal.dll 支援標準PC HAL的設計是將硬體的差別隱藏起來,給OS提供一個抽象的資源模型
2、微核心
3、執行體
4、裝置驅動程式
5、檔案系統
NTFS是給Windows設計的檔案系統支援。每個檔案系統都有自己的裝置棧,因而可以通過過濾驅動程式來過濾I/O請求。檔案系統底層是對儲存裝置的管理,儲存裝置以partition和volume來管理整個儲存空間。
6、網路
Winsock WinInet 命名管道 郵件槽(廣播訊息) RPC
在Windows中,網路協議與網路介面卡驅動程式是分開的,協議驅動程式獨立於任何一個網路介面卡,真正傳送和接受資料是通過網路介面卡進行的。協議驅動程式通過統一的介面與介面卡驅動程式進行通訊,此介面是NDIS。
四、記憶體管理
在系統地址空間中,不同的區域使用並不完全相同的記憶體頁面管理演算法,較為典型的有以下三種:
非換頁記憶體池。系統用空閒連結串列的方法,將空閒頁面連結起來。
換頁記憶體池。通過點陣圖來管理頁面的分配。
系統PTE區域。這表示這部分地址是以PTE形式管理的。當核心需要一段虛擬地址來對映物理頁面時,它可以使用系統PTE區域中的地址。
程序地址空間是隨程序一起被建立的,每個程序都有它自己的頁目錄頁面,其中有一半PDE是共享的,另一半初始化為0。使用者模式程式碼通過VirtualAlloc和VirtualFree來申請或釋放地址範圍,核心通過一顆平衡二叉搜尋樹來管理程序地址空間被使用的情況。樹的每個節點為VAD(虛擬地址描述符),描述一段連續地址的範圍。
記憶體管理器除了管理系統地址空間和程序地址空間以外,還要管理有限的實體記憶體。PFN資料庫是Windows系統空間中被保留的一塊區域。每個物理頁面對應於PFN資料庫中的一項。當系統程序需要大量工作時,記憶體管理器需要使用Windows工作集管理器。工作集(也就是熟知的WorkingSet)是指一個程序當前正在使用的物理頁面的集合。工作集分為程序工作集,系統工作集,會話工作集。此外,每個程序都有一個工作集連結串列。
五、程序和執行緒管理
程序定義一個執行環境,包括它自己私有的地址空間,一個控制代碼表以及一個安全環境。執行緒則是一個控制流,有自己的呼叫棧。在Windows核心體系中,程序和執行緒的核心機制是在微核心實現的,管理機制是在執行體中實現的。對於執行緒,Windows實現了基於優先順序的搶佔式(preemptive)執行緒排程演算法。
六、中斷和異常
IDT ISR IRQL
七、Windows核心中的公共管理設施
1、Windows核心中的物件管理
2、登錄檔和配置管理器 HIVE
3、事件追蹤(ETW)
4、安全性管理
5、Windows引導過程
核心載入
MBR(硬碟主引導記錄)包含程式碼和資料,Windows從MBR中的引導程式碼讀入Windows的載入程式,即ntldr檔案,然後將控制權交給ntldr的入口函式。ntldr從真實模式跳到保護模式後,將控制權交給os loader(包含在ntldr中).loader首先建立記憶體描述符,開始構造頁表和頁目錄,初始化一系列裝置。接著檢測是否當前為休眠系統的恢復過程(檢查是否有一個有效的hiberfil.sys),如果不是,解析boot.ini中,引導各種引數,執行NTDETECT.COM程式。然後loader載入ntoskrnl.exe及HAL.dll,登錄檔 SYSTEM HIVE,載入裝置驅動。最後,loader將控制權交給核心模組的入口函式,接下來引導過程由核心模組繼續進行,loader使命已經完成。
核心初始化
非常非常複雜的過程。這段旅程從KiSystemStartup出發。
建立使用者登入會話
會話管理器子系統smss smss相當依賴於登錄檔
首先建立全域性變數,載入Windows子系統核心模式模組win32k.sys,啟動Windows子系統程序csrss.exe,建立LPC埠物件,啟動winlogon.exe,建立視窗站、桌面,啟動SCM和lsass,進入登陸介面。至此,引導過程基本結束。