1.05k likes | 1.18k Views
現代作業系統核心 第二組 分組報告. 2.6 Windows 啟動過程. 指導教授 : 許富皓. 2.5 Windows 核心中的公用管理設施. 組員 : 蔣秉芳 蕭少宇 陳逸軒 張勝豪 羅祐民 陳詩姍 陳映全. 2.5.1 Windows 核心中的 物件管理. 995202010 蔣秉芳. Windows 核心的物件管理. 資源管理方式 物件導向思維 物件管理員-執行體中的元件. 執行體 API. 視窗 圖形介面. ……. 檔案系統. 網路. 物件管理員. ( 微 ) 核心. 硬體抽象層 (HAL).
E N D
現代作業系統核心 第二組 分組報告 2.6Windows啟動過程 指導教授 : 許富皓 2.5Windows核心中的公用管理設施 組員 : 蔣秉芳 蕭少宇 陳逸軒 張勝豪 羅祐民 陳詩姍 陳映全
2.5.1Windows核心中的 物件管理 995202010 蔣秉芳
Windows 核心的物件管理 • 資源管理方式 • 物件導向思維 • 物件管理員-執行體中的元件 執行體API 視窗 圖形介面 …… 檔案系統 網路 物件管理員 (微)核心 硬體抽象層 (HAL)
物件管理員 • 設計目的 • 提供統一而可擴充的定義和控制機制 • 提供一致的安全存取機制 • 自由加入新的物件型別 • 提供對物件執行操作的標準 API • 提供命名機制
物件的內容 • 物件標頭 typedefstruct _OBJECT_HEADER { LONG_PTR PointerCount; … … POBJECT_TYPE Type; UCHAR NameInfoOffset; UCHAR HandleInfoOffset; UCHAR QuotaInfoOffset; … … } OBJECT_HEADER, *POBJECT_HEADER;
物件的內容 • 型別物件 typedefstruct _OBJECT_TYPE { … UNICODE_STRING Name; … ULONG TotalNumberOfObjects; ULONG TotalNumberOfHandles; … OBJECT_TYPE_INITIALIZER TypeInfo; … } OBJECT_TYPE, *POBJECT_TYPE;
物件的內容 • 型別物件的建立:函式呼叫 NTSTATUS ObCreateObjectType( __in PUNICODE_STRING TypeName, __in POBJECT_TYPE_INITIALIZER ObjectTypeInitializer, __in_opt PSECURITY_DESCRIPTOR SecurityDescriptor, __out POBJECT_TYPE *ObjectType );
物件的內容 • 型別物件的建立:初始化 typedefstruct _OBJECT_TYPE_INITIALIZER { USHORT Length; … OB_DUMP_METHOD DumpProcedure; OB_OPEN_METHOD OpenProcedure; OB_CLOSE_METHOD CloseProcedure; OB_DELETE_METHOD DeleteProcedure; OB_PARSE_METHOD ParseProcedure; … } OBJECT_TYPE_INITIALIZER, *POBJECT_TYPE_INITIALIZER;
物件的內容 • 物件主體:函式呼叫 NTSTATUS ObCreateObject( … __in POBJECT_TYPE ObjectType, … __in ULONG ObjectBodySize, … __out PVOID *Object );
物件的內容 • 物件主體:實例 • 行程和執行緒物件:行程 Status = ObCreateObject (PreviousMode, PsProcessType, ObjectAttributes, PreviousMode, NULL, sizeof (EPROCESS), 0, 0, &Process); If(!NT_SUCESS (Status)){ gotoexit_and_deref_parent; }
物件的內容 • 物件主體:實例 • 行程和執行緒物件:執行緒 Status = ObCreateObject (PreviousMode, PsThreadType, ObjectAttributes, PreviousMode, NULL, sizeof (ETHREAD), 0, 0, &Process); If(!NT_SUCESS (Status)){ ObDereferenceObject (Process); return Status; }
物件的管理 • 通用服務 • OpenProcedure • CloseProcedure • DeleteProcedure • …
物件的管理 • 物件層次目錄:系統全域命名空間 • ObpDirectoryObjectType • ObpRootDirectoryObject • ObpLookupDirectoryEntry (搜尋) • ObpInsertDirectoryEntry (插入) • ObpDeleteDirectoryEntry (刪除)
物件的管理 • ObpLookupObjectName • ObOpenObjectByName, ObOpenReferenceByName • 參數檢查 • 指定 RootDirectoryHandle ? yes -> 用它的 Parse 來解析 no -> 從 ObpRootDirectoryObject開始解析 • 名稱以 \??\ 開頭 ?-> 拿取 DeviceMap • 名稱是 \??-> 回傳 DeviceMap • 呼叫 ObpLookupDirectoryEntry,Recursive
物件的管理 • 命名空間的操作 • 自訂全域名稱查詢:Parsing
執行體物件 • 系統位址空間 • 行程位址空間 • 控制代碼
物件的計憶體架構 • 物件標頭的資料結構:OBJECT_HEADER • 物件主體的資料結構:不一定 • QuotaInfo • HandleInfo • NameInfo • CreatorInfo #define OBJECT_TO_OBJECT_HEADER ( o ) \ CONTAINING_RECORE ((o), OBJECT_HEADER, Body)
物件的生命週期 • 引用計數 • 核心中的引用 • 行程的控制代碼引用
2.5.2 登錄和組態管理員 995202102 陳映全
登錄和組態管理員 • 本節大綱 • 討論登錄的整體架構 • 組態管理員的實作機制以及介面
登錄和組態管理員 • 本節大綱 • 討論登錄的整體架構 • 組態管理員的實作機制以及介面
登錄 • Windows作業系統提供了一個稱為”登錄(registry)”的中央儲存機制作為系統的組態和管理中心,應用程式和核心透過存取登錄來讀寫各種設置。 • 在核心中執行體包含一個稱為“組態管理員(configurationmanager)”的元件,它是登錄的真正實作。
登錄的組成 • 登錄是由一組登錄區(hive)的檔案構成,每個登錄區檔案的內部包含了一個樹狀層次架構。 • 可將其想像成一檔案系統,類似目錄和檔案架構。 • 從這層角度來看,組態管理員就像一個檔案系統的驅動程式。
登錄的組成 • Windows 登錄是一個樹狀架構,每個節點是一個機碼(key)或值(value)。 • 機碼(key)可視為一個容器,就像是檔案系統中的目錄,他可以包含其他的機碼(稱子機碼)和值。 • 值(value)存放的是資料,就像是檔案系統中的檔案。 • 登錄的根是一個機碼,稱根機碼。
登錄的組成:值(value) • 登錄的值有不同型態大致上有 • REG_DWORD(32位元整數) • REG_BINARY(二進位資料) • REG_SZ(字串) • REG_LINK(符號連結) • 允許一個機碼或直指向另一個機碼或值
登錄的根機碼 縮寫:HKU 功能:有關該機器上所有使用者帳戶資訊 縮寫:HKCU 功能:有關目前使用者的資訊,這是一個符號連結,指向HKU中對應的子機碼 縮寫:HKCR 功能:有關檔案關聯和COM的設備資訊,這是HKLM\SOFTWARE\Classes和HKCU\SOFTWARE\Classes兩棵子樹經過合併後的一個檢視 縮寫:HKCC 功能:有關目前硬體設置的資訊 縮寫:HKLM 功能:有關目前系統資訊 登錄的最上層有8個根機碼: 其中5個如上述,而剩下3個為顯示效能的資料在regedit.exe中並不顯示。Ex:HKEY_PERFORMANCE_<XXX>
根機碼 • HKLM:存放目前系統的組態資訊 • 有關系統全域的資訊其有5個子機碼 • HARDWARE(硬體設置) • SAM(本機帳戶合群的資訊) • SECURITY(系統全域範圍的安全性原則和使用者權限設置) • SOFTWARE(系統中的全域組態資訊,系統啟動時不需要) • SYSTEM(系統中的全域組態資訊,在系統啟動時需要)
根機碼 • HKU:以系統中的使用者為基礎存放著各個使用者帳戶的設定資訊。 • HKU和HKLM中的架構不隨目前登入帳戶而發生變化,它們代表系統的全域檢視。 • 而其他3個根機碼:HKCU、HKCR、HKCC則會利用HKU和HKLM中的資訊重構出一個特定於目前登入使用者和目前硬體環境檢視 => 每個使用者有自己獨特的設定。
如何建立登錄架構 • 一個系統的登錄清單存放在HKLM\SYSTEM\CurrentControl\hivelist。 • 系統初始化時,HKLM\SYSTEM總是會被先載入進來,然後組態管理員會去找到hivelist機碼,相繼載入其他登錄區,並建立登錄根機碼。 • 將這些登錄區連結起來,從而建立起完整的登錄架構。
登錄區架構 • 登錄區內部架構類似檔案系統 • 登錄區就相當於一個磁碟分割 • 基本分配單元為block,大小為4KB • 登錄區的第一個區塊稱為基本區塊 • 登錄區檔案標示 • 最新序號 • 檢查碼 • 最後操作時間
登錄區架構 • 登錄區的登錄資料是按照儲存格(cell)來組織的。 • 儲存格的大小取決於他的型別和資料。 • 每個儲存格可以存放一個機碼、一個值、 一個安全描述、一個子機碼清單、值清單 • 每個儲存格在檔案中的偏移稱為該儲存格的索引(cellindex),其他儲存格可利用此索引來引用它。
登錄區架構 • 舉例:若父機碼要存取它的一個子機碼 • 1.找到父機碼的子機碼清單儲存格 • 2.從子機碼清單儲存格中找到對應的子機碼 • 子機碼清單依名稱排序過,而值清單的則沒有被排序過。 • 子機碼可利用2元搜尋去尋找想要的項目
儲存箱(bin) • 由於儲存格的大小並非相同,組態管理員根據需要從登錄區中申請特定大小的儲存空間作為一個儲存格。 • 申請一個特殊的儲存單元稱儲存箱(bin) • 儲存箱以區塊(block)為邊界 • 當一個儲存格擴充登錄區檔案時,實際申請的儲存空間要擴充到下一個邊界區塊。
如何方便存取登錄的Data • 將登錄區檔案讀到記憶體中 • 其儲存格索引可看成其檔案在記憶體中的起始位置的偏移。 • 須使用虛擬位址空間 • 組態管理員使用以下的分頁對照表來解決儲存格的位置轉換。 儲存類型 儲存格目錄索引 儲存表格索引 區塊內偏移 1位元 10位元 9位元 12位元 0:stable(穩定的) 1:volatile(揮發的) 32位元儲存格
登錄和組態管理員 • 本節大綱 • 討論登錄的整體架構 • 組態管理員的實作機制以及介面
組態管理員的實作 • 組態管理員是執行體中的元件,它的實作依賴於記憶體管理員和快取管理員=>必須要初始化。 • 在系統初始化的初期,windows需要使用登錄中的組態資訊,但此時組態管理員尚未初始化。 • 在核心初始化前,核心載入器(ntldr)會將整個HKLM\SYSTEM登錄區當作一個唯讀檔載入到記憶體中。
組態管理員的實作 • 組態管理員和登錄初始化過程 • 第一階段 • 可以看作是組態管理員的初始化和登錄的臨時初始化。 • 第二階段 • 登錄中系統部分初始化 • 第三階段 • 登錄中使用者部分初始化
組態管理員和登錄初始化過程 • 第一階段:組態管理員的初始化 • 在核心初始化階段,建立起HKLM\SYSTEM和HKLM\HARDWARE登錄區。 • 時間點:在物件管理員和快取管理員初始化以後,但是在I/O子系統初始化以前。核心在這時間點以前不能存取登錄中任何資訊,而在這時間點後就可以。 • 執行此一初始化過程會使用到函式:CmInitSystem1
組態管理員和登錄初始化過程 • 第二階段:系統部分初始化 • 系統緒程的主常式為CmpLoadHiveThread。 • 由工作階段管理員(smss.exe 行程)建立起HKLM\SAM、HKLM\SECURITY、 HKLM\SOFTWAER和HKU\.DEFAULT登錄區。 • CmpLoadHiveThread會呼叫CmpInitHiveFoemFile將上述尚未載入到登錄區的,作載入和初始化。
組態管理員和登錄初始化過程 • 第三階段:使用者部分初始化 • 當載入是用者設定檔時將建立起HKU\<使用者的SID> 登錄區這個是由登錄行程(winlogon.exe)來完成的。 • 當需要特定於使用者的組態資訊時,登錄的HKU子樹下的使用者登錄區也必須建立起來。 • 這些登錄區是按照個案所載入和初始化,譬如使用者登入到系統中,或者系統以特定身分來啟動,都會不同。 • 其中CmLoadKey函式會完成實際的載入和連結。
組態管理員和登錄區元件 • WRK包含了組態管理員的完整程式碼 • 登錄區的資料型別為CMHIVE • 其內嵌的HIVE成員是他的資料管理架構 • 在組態管理員的實作中,儲存格的資料結構為HCELL,儲存箱的資料結構為HBIN。 • 空閒的儲存箱會形成一個空閒串列。
KEY • 組態管理員定義了一個以“KEY”命名的物件型別,將該命名空間與物件管理員的全域命名空間整合起來。 • 對於每個開啟的登錄機碼,組態管理員分配一個機碼控制區塊(key control block),其資料結構為CM_KEY_CONTROL_BLOCK,它包含了該控制區塊所引用的機碼節點所在的登錄區和儲存格索引。 • 組態管理員為每個登錄機碼在她的機碼控制區塊中保存了一個值的快取,用於存放它值得清單
存取登錄機碼(1) • 涉及到兩個常用操作: • 使用者模式 • NtOpenKey和NtQueryValueKey • 核心的呼叫 • ZwOpenKey和ZwQueryValueKey • 上述兩組的功能是相同的 • NTSTATUS NtOpenKey( _out PHANDLE KeyHandle,//傳回控制代碼 _in ACCESS_MASK DesireAccess,//存取模式 _in POBJECT_ATTRIBUTES ObjectAttributes,//指定物件的屬性
存取登錄機碼(2) NTSTATUS NtQueryValueKey( _in HANDLE KeyHandle, //要操作的登入機碼 (指示要查詢的登錄機碼) _in PUNICODE_STRING ValueName,//登錄機碼下值的名稱 _in KEY_VALUE_INFORMANTION_CLASS KeyValueInformationClass,//指定了待獲取的資訊型別 _out_bcount_opt(Length) PVOID KeyValueInformation,//接收資料的緩衝區 _in ULONG Length,//緩衝區的長度 _out PULONG ResultLength,//實際傳回的長度 );
其他一些服務系統 • 組態管理員除了NtOpenKey和NtQueryValueKey函式外還提供了NtCreateKey, NtDeleteValueKey, NtSaveKey, NtSetValueKey…等 • 關於這些系統服務的定義和實作,參考base\ntos\config\ntapi.c的檔案裡。 • 組態管理員還提供了登錄機碼的變化通知機制。 • 可以一次監視一個或多個登錄機碼的建立、刪除或修改動作
2.5.3 事件追蹤(ETW) 995202039 陳逸軒
ETW • Windows提供了統一的追蹤和紀錄事件的機制,稱為ETW(Event Tracing for Windows) • User mode和kernel mode的驅動程式都可使用它來記錄事件。
ETW • ETW為直接由kernel支援的事件紀錄機制,可分成三個部分 • 控制器:它有啟動、停止和配置事件紀錄的功能 • 提供者:向ETW註冊事件類別,並由控制器控制事件紀錄的啟動或停止 • 消費者:可針對它們想要的事件資料,選擇一個或多個紀錄事件