Заметки о Windows и других программных продуктах Microsoft...

Порядок загрузки драйверов и сервисов в Windows

Порядок загрузки драйверов и сервисов в Windows

Тем, кому интересно внутреннее устойство операционной системы Windows, предлагаю небольшое исследование. Мы попробуем выяснить, что отвечает за порядок загрузки драйверов и сервисов в Windows и можно ли этот порядок изменить.


Прежде всего посмотрим текущий порядок запуска системы с помощью программы LoadOrder от Sysinternals. Программа покажет нам, что и в каком порядке загружается при запуске операционной системы.

порядок загрузки

 

Как видно из рисунка, сначала загружаются драйверы устройств, необходимые для запуска системы, а потом различные Windows-сервисы. Поскольку между загрузкой сервисов и загрузкой драйверов есть некоторые различия, рассматривать их будем по отдельности.

Драйверы

В качестве подопытного возьмем драйвер Microsoft ACPI (Advanced Configuration and Power Interface), который отвечает за обнаружение аппаратного обеспечения и  управление питанием. Задача ACPI — обеспечить взаимодействие между операционной системой и аппаратным обеспечением, поэтому драйвер ACPI загружается в самом начале.

драйвер ACPI в программе Loadorder

 

Программа Loadorder предоставляет довольно ограниченную информацию о порядке загрузки, поэтому за более точными данными идем в реестр. У каждого драйвера и Windows-сервиса есть свой раздел в ветви реестра HKLM\SYSTEM\CurrentControlSet\Services. Названы разделы по имени драйвера\сервиса, соответственно нам нужен раздел ACPI.

параметры загрузки драйвера ACPI в реестре

 

За порядок загрузки драйвера отвечают три параметра реестра. Основной параметр  Start — определяет тип запуска драйвера. Вот правила, по которым драйверы устанавливают значение своего параметра Start:

• Драйверы, которые должны загружаться системным загрузчиком при запуске операционной системы, указывают значение Start равное 0 (запуск при загрузке системы). Пример — драйверы системных шин и драйвер файловой системы, используемый при загрузке системы;
• Драйвер, который не требуется непосредственно для загрузки системы, указывает в Start значение, равное 1 (запуск системой). Пример — стандартный драйвер видеокарты (VgaSave);
• Драйвер, не обязательный для загрузки системы, устанавливает значение Start равным 2 (автозапуск). Пример — драйвер многосетевого UNC-npoвайдера (Multiple UNC Provider, MUP), поддерживающий UNC-имена удаленных ресурсов (типа \\Computer\Share);
• Драйверы, не обязательные для работы операционной системы (например, драйверы сетевых адаптеров), указывают значение Start равным 3 (запуск по требованию).

Также драйверы устройств могут использовать параметры Group и Tag для контроля порядка своей загрузки при запуске системы. Параметр Group драйверы\сервисы используют, чтобы указать группу, к которой они принадлежат, а порядок загрузки групп определяется параметром List, находящимся в разделе HKLM\SYSTEM\ CurrentControlSet\Control\ServiceGroupOrder\.

порядок загрузки групп драйверов

Кстати, параметр Group указывать не обязательно. Если драйвер\сервис не входит в какую либо группу, то он загружается в самом конце очереди.

Драйвер может еще больше детализировать порядок своей загрузки с помощью параметра Tag, который указывает конкретную позицию драйвера в группе. Диспетчер ввода-вывода сортирует драйверы в группе по значениям этого параметра, а драйверы, не имеющие параметра Tag, перемещаются в конец списка драйверов группы.

Посмотрев на порядок загрузки, можно подумать что сначала загружаются драйверы с меньшими значениями Tag, потом — с большими, но это не совсем так. Приоритет значений параметров Tag в рамках группы определяется в разделе HKLM\SYSTEM\CurrentControlSet\Control\GroupOrderList.

Для примера откроем двоичный параметр Boot Bus Extender, который соответствует одноименной группе, к которой относится и драйвер ACPI. Параметр представляет из себя набор двойных слов (по 4 байта каждое). Первое слово (выделено красным) задает общую длину переменной (количество двойных слов), в нашем примере 06. Остальные двойные слова как раз и являются тэгами. Драйверу ACPI соответствует тэг, равный 01 (выделен зеленым).

порядок загрузки драйверов в группе

 

Приоритетность тега определяется не значением тега, а его положением: чем выше расположен тэг, тем выше его приоритет в группе, и тем выше приоритет драйвера, которому этот тэг соответствует. А поскольку 01 выше остальных тегов, то и драйвер ACPI загружается первым в группе.

Сервисы

Порядок загрузки Windows-сервисов несколько отличается от порядка загрузки драйверов. В качестве примера возьмем сервис aвтоматического обновления (wuauserv). Он не особо критичен для работы системы и поэтому грузится в последнюю очередь.

wuauserv в программе loadorder

 

Опять идем в реестр. Параметры запуска сервиса находятся в разделе HKLM\SYSTEM\CurrentControlSet\Services\wuauserv. Я выделил два основных параметра, отвечающих за порядок загрузки данного сервиса.

параметры загрузки сервиса wuauserv в реестре

 

Windows-сервисы запускаются диспетчером управления сервисами (Service Control Manager, SCM)  в соответствии со значением параметра Start. Параметр этот для сервисов может принимать следующие значения:

• Авто запуск (2) — сервис запускается автоматически, сразу после запуска основного SCM-процесса Services.exe;
• Запуск по требованию (3) — сервис запускается при необходимости, по требованию какого либо сервиса или программы;
• Отключено (4) — сервис отключен и не запускается ни при каких условиях.

Значения 0 (запуск при загрузке системы) и 1 (запуск системой) для сервисов не могут быть указаны, только для драйверов устройств.

Кроме того, начиная с Windows Vista\Server 2008 для сервисов появился еще один режим запуска — отложенный автозапуск. Отвечает за него параметр DelayedAutoStart = 1, который  который указывает SCM произвести автоматический старт данного сервиса с задержкой. SCM запускает службы, для которых выбран отложенный запуск, после загрузки сервисов, отмеченных для автозапуска.

Режимом запуска сервисов можно управлять не только из реестра, но и в графическом режиме, из консоли Службы (Services).

настройка режима запуска сервиса

 

Так же как и драйверы, Windows-сервисы могут использовать параметр Group в своем разделе реестра, чтобы указать группу, к которой они принадлежат. Сейчас, для наглядности, возьмем наш сервис wuauserv, находящийся в самом конце списка загрузки. С помощью ключа Group поместим его в группу Event Log, перезагрузимся и посмотрим порядок загрузки в Loadorder. Как видите, порядок изменился и wuauserv поднялся с последнего места, загрузившись сразу после своего одногруппника — службы eventlog. Правда порядок размещения внутри группы изменить уже не получится, т.к.  Tag для сервисов не используется.

изменения для сервиса wuauserv

 

И еще один параметр, который косвенно влияет на порядок загрузки сервисов — DependOnService. Он указывает, от каких сервисов зависит данный сервис. Соответственно сервис не загружается, пока не будут загружены сервисы, перечисленные в DependOnService.

Зависимости работают следующим образом — если сервисы находятся в одной группе, то зависимый сервис перемещается в конец списка и запускается после сервисов, от которых зависит. Если же группы разные, то сервис просто не запустится, а SCM выдаст ошибку.

Более наглядно это показано в оснастке Службы, где на вкладке Зависимости (Dependency) указаны как сервисы, от которых зависит данный сервис, так и сервисы, зависящие от него.

зависимости сервиса

 

Вот мы и выяснили, в каком порядке загружаются драйверы и сервисы в Windows и как этот порядок можно изменить. Но прежде чем бросаться править реестр помните, что порядок загрузки драйверов и сервисов определяется автоматически, и не стоит вносить в него изменения без веской причины. Всего один неправильно выставленный параметр может привести к полной неработоспособности системы, и не факт что ее удасться восстановить. Поэтому, прежде чем приступить к редактированию реестра, обязательно сделайте его резервную копию, а также желательно иметь под рукой загрузочный носитель.

 
 
Комментарии

Здравствуйте!
Очень полезная информация, правда, не знаю, как ею грамотно воспользоваться.
Столкнулся с пренеприятнейшей ситуацией, когда «упавший» драйвер видеокарты не даёт винде загрузиться.
Ни в одном из предложенных по F8 вариантов, ни после попыток восстановления.
Переустанавливать опасаюсь, т.к. не всегда восстанавливается работоспособность установленных пограмм.
Собственно, вопрос — как «выпилить» этот драйвер из загрузки (если это возможно, конечно)?

С уважением,
Дмитрий

Стандартное решение — загрузиться в безопасном режиме и удалить драйвер. Если система не грузится вообще никак, то использовать загрузочный диск, например тот же ERD Commander.

Не грузится ни в одном из режимов 🙁
Есть возможность редактирования файлов на диске, чем и хотелось бы воспользоваться, удалив не работающий драйвер из загрузки.

Удалить файл драйвера — не самое хорошее решение, да и не факт что поможет. Настройки останутся прежними и неизвестно, как поведет себя система не найдя нужного файла. Как вариант, можно подцепить файлы реестра к другой системе и отредактировать их, удалив «больное» устройство.
Но проще всего воспользоваться ERD Commander-ом, там есть штатная возможность отключить\удалить драйвер.

Спасибо.
Таки проще переустановить систему.
Всё с нуля 🙁

Андрей

Отличная стать, спасибо! Подскажите, приоритизация служб поможет исправить ситуацию, когда ряд служб не стартуют автоматически? Автоматический запуск выставлен, но видимо сервер слабый…

Для служб есть вариант отложенного запуска, можно попробовать его.

Николай

Что-то не нашёл кто же написал статью. Благодарю, брат!!! Мне статья помогла, сохранил её себе. Её первая часть. Про драйвера.Пользую ноут ASUS N750JK-T4013H, W-10 pro 20H2. После выхода из сна, гибернации отваливался ВТ. В диспетчере устройств, в сведениях драйвера (у меня Qualcomm_BT_driver_AR3012, версия 8.0.1.314) нашёл 3 файла драйверов. По их названиям, в конце строк, нашёл папки в ветке реестра HKLM\SYSTEM\CurrentControlSet\Services и в каждой папке поменял значение параметра Start на 1 (везде стояло 3). Больше ничего не делал. После перезагрузки мышка начала дёргаться. Не было плавности хода. Думал «ну пипец — чего-то нарушил». Однако, начал проверять то, из-за чего весь кипиш. Отправил ноут в сон. Разбудил. Всё работает. И рывки пропали. Мышка по экрану бегает как надо. Отправил ноут в гибернацию. Разбудил. Всё работает.

Leave a Reply to Kirill