在当今的数位时代,快速启动和高效率的系统运作对于使用者来说至为重要。 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系统的服务控制管理器在系统启动过程中扮演着不可或缺的角色,它以高效的方式加载必要的服务及设备驱动,维持整体系统的快速响应和稳定运行。我们在使用这些技术时,是否有考虑到背后隐藏的运作原理和技术挑战呢?