在當今的數位時代,快速啟動和高效率的系統運作對於使用者來說至為重要。Windows系統能夠在短時間內啟動眾多服務,這背後隱藏著一個名為服務控制管理器(Service Control Manager,簡稱SCM)的系統過程。SCM的運作對於提升系統啟動速度至關重要,讓我們來深入探索這一過程是如何進行的。
SCM 是 Windows NT 系列操作系統下的一個特殊系統過程,它負責啟動、停止及管理 Windows 服務過程。
SCM的可執行檔位於 %SystemRoot%\System32\services.exe
,它的主要任務是啟動所有被配置為自動啟動的服務。當系統啟動時,Wininit過程會早早啟動SCM,開始進行一系列的初始化工作。
在啟動過程中,SCM會首先從註冊表中讀取有關服務的信息。這涉及到兩個關鍵的註冊表項:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ServiceGroupOrder\List
- 包含服務組的名稱和啟動順序。HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services
- 實際的服務和設備驅動程序的數據庫。這些信息幫助SCM確定各個服務的啟動順序以及相互依賴的關係。SCM還會檢查在啟動過程中必須啟動的設備驅動是否成功加載,並將失敗的驅動存儲於一個名為ScFailedDrivers
的列表中。
在處理每一個自動啟動的服務時,SCM會同時考慮負載順序的依賴性,避免循環依賴的發生。
在所有非延遲自動啟動服務處理完成後,SCM將開始加載延遲自動啟動的服務,這是自Windows Vista以來為了加快系統啟動速度所引入的一項新功能。通常情況下,這些延遲服務會在系統啟動後約120秒進行初始化。
對於每一個要啟動的服務,SCM調用ScStartService()
函數來驗證其運行進程的帳戶與服務指定的相符。在這個過程中,若服務不在系統賬戶下運行,則SCM會調用LSASS函數LogonUserEx()
來獲取必需的用戶登錄資訊。這些資訊存儲於HKLM\SECURITY\Policy\Secrets\
註冊表項中,只有全權訪問的服務才能獲得這些“秘密”密碼。
服務過程是在創建時被置於暫停狀態,只有當管道連接建立後其執行才會恢復。
一旦服務的過程成功啟動,SCM會通過創建命名管道來建立與服務過程的通信通道。服務過程透過調用StartServiceCtrlDispatcher()
函數加入此管道,而SCM隨後會向此服務發送“啟動”命令。
延遲自動啟動服務的存在大大改善了系統啟動的平衡性。雖然這些服務在技術上與正常的自動啟動服務沒有太大區別,但它們被設計在系統啟動的不同階段進行初始化,以確保系統運行的平穩性。
SCM同時管理設備驅動,這類服務的類型在註冊表中標記為SERVICE_KERNEL_DRIVER
或SERVICE_FILE_SYSTEM_DRIVER
。在這些情況下,SCM會調用ScLoadDeviceDriver()
函數將相應的驅動程序加載到系統中,這通常需要引發NtLoadDriver
系統調用。
SCM還能夠向GUI應用程序如Windows資源管理器發送消息,通知其有關網絡驅動字母連接的變更。
Windows系統的服務控制管理器在系統啟動過程中扮演著不可或缺的角色,它以高效的方式加載必要的服務及設備驅動,維持整體系統的快速響應和穩定運行。我們在使用這些技術時,是否有考慮到背後隱藏的運作原理和技術挑戰呢?