Порядок завантаження драйверів і сервісів в Windows.
Тим, кому цікаво внутрішнє устойство операційної системи Windows, пропоную невелике дослідження. Ми спробуємо з'ясувати, що відповідає за порядок завантаження драйверів і сервісів в Windows і чи можна цей порядок змінити.
Насамперед подивимося поточний порядок запуску системи за допомогою програми LoadOrder від Sysinternals.Програма покаже нам, що і в якому порядку завантажується при запуску операційної системи.
Як видно з малюнка, спочатку завантажуються драйвери пристроїв, необхідні для запуску системи, а потім різні Windows-сервіси. Оскільки між завантаженням сервісів і завантаженням драйверів є деякі відмінності, розглядати їх будемо окремо.
Драйвери
В якості піддослідного візьмемо драйвер Microsoft ACPI (Advanced Configuration and Power Interface), який відповідає за виявлення апаратного забезпечення і управління живленням. Завдання ACPI - забезпечити взаємодію між операційною системою і апаратним забезпеченням, тому драйвер ACPI завантажується на самому початку.
Програма Loadorder надає досить обмежену інформацію про порядок завантаження, тому за більш точними даними йдемо до реєстру . У кожного драйвера і Windows-сервісу є свій розділ в галузі реєстру HKLM \ SYSTEM \ CurrentControlSet \ Services. Названі розділи по імені драйвера \ сервісу, відповідно нам потрібен розділ 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-сервісів дещо відрізняється від порядку завантаження драйверів. Як приклад візьмемо сервіс Автоматичне оновлення (wuauserv). Він не особливо критичний для роботи системи і тому вантажиться в останню чергу.
Знову йдемо до реєстру. Параметри запуску сервісу знаходяться в розділі HKLM \ SYSTEM \ CurrentControlSet \ Services \ 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 для сервісів не використовується.
І ще один параметр, який побічно впливає на порядок завантаження сервісів - DependOnService. Він вказує, від яких сервісів залежить даний сервіс. Відповідно сервіс не завантажується, поки не будуть завантажені сервіси, перераховані в DependOnService.
Залежності працюють таким чином - якщо сервіси знаходяться в одній групі, то залежний сервіс переміщається в кінець списку і запускається після сервісів, від яких залежить. Якщо ж групи різні, то сервіс просто не запуститься, а SCM видасть помилку.
Більш наочно це показано в оснащенні Служби, де на вкладці Залежності (Dependency) вказані як сервіси, від яких залежить даний сервіс, так і сервіси, що залежать від нього.
Ось ми і з'ясували, в якому порядку завантажуються драйвери і сервіси в Windows і як цей порядок можна змінити. Але перш ніж кидатися правити реєстр пам'ятайте, що порядок завантаження драйверів і сервісів визначається автоматично, і не варто вносити в нього зміни без вагомої причини.Всього один неправильно виставлений параметр може привести до повної непрацездатності системи, і не факт що її вдасться відновити. Тому, перш ніж приступити до редагування реєстру, обов'язково зробіть його резервну копію, а також бажано мати під рукою завантажувальний носій.П>.