какое по запускается сразу после включения компьютера
Этапы загрузки операционных систем
Давным-давно, когда я был маленьким работал в институтской лаборатории на большом компьютере СМ-3 (что-то вроде знаменитой PDP-11), bootstrapping (загрузка) ЭВМ выглядела так. В фотосчитыватель заправлялась коротенькая бумажная перфолента с пробитой на ней программой начальной загрузки, запускался процесс считывания, а дальше … как повезет.
Дело в том, что бумажная ленточка постепенно изнашивалась, начинала плохо читаться, и ЭВМ могла с первого раза «не завестись». В этом случае процесс нужно было повторять, порой несколько раз, до победного конца. Когда ленточка окончательно выходила из строя и машина никак не хотела «оживать», приходилось временно вводить программу начальной загрузки вручную при помощи расположенных на передней панели переключателей. Тут, главное, было не торопиться и не делать ошибок.
В современных компьютерах процесс загрузки большей частью автоматизирован, однако это не означает, что он не заслуживает того, чтобы с ним познакомиться.
Основные определения и этапы загрузки операционной системы
Включение компьютера, POST, BootMonitor
Начальный этап загрузки операционной системы после включения компьютера начинается в BIOS (Basic Input/Output System — базовая система ввода-вывода). В настройках BIOS мы указываем загрузочное устройство, или ряд загрузочных устройств в порядке их приоритета. Возможны различные варианты загрузки и их комбинации: с жесткого диска, CD/DVD – диска, USB-flash и другие.
Сразу после прохождения POST (Power-On Self-Test — самотестирование после включения) BIOS компьютера начнет поочередно перебирать указанные загрузочные устройства до тех пор, пока на одном из них не найдет подходящую специальную запись, в которой содержится информация о дальнейших действиях.
Загрузчик 1-го уровня. Master Boot Record
Master Boot Record — главная загрузочная запись, расположена в первых физических секторах загрузочных устройств хранения. Она содержит таблицу разделов (Partition Table) и исполняемый код.
Главной задачей программы, записанной в MBR, является поиск активного системного раздела диска и передача управления его загрузочному сектору. Таким образом, эту стадию можно назвать подготовительной, в силу того, что непосредственно загрузки самой ОС еще не происходит.
Системным принято называть раздел диска (устройства хранения) на котором расположены файлы операционной системы, отвечающие за процесс загрузки ОС (сама операционная система может размещаться в другом разделе). В принципе, системных разделов может быть несколько, поэтому один из них отмечается как активный. Именно его ищет программа, загруженная с MBR.
Загрузчик 2-го уровня. Partition Boot Sector
Следующим этапом загрузки компьютера является передача управления исполняемому коду, записанному в PBS (Partition Boot Sector — загрузочный сектор активного раздела). PBS расположен в первом секторе (секторах) соответствующего раздела диска. В коде PBS прописано имя файла загрузчика операционной системы, которому и передается управление на этом этапе.
Начальный этап загрузки операционной системы. Менеджер загрузки ОС
Первоначально в Linux загрузчиком являлся LILO (Linux Loader). В силу имевшихся в нем недостатков, главным из которых была неспособность понимать используемые в Linux файловые системы, позднее начал использоваться загрузчик GRUB (GRand Unified Bootloader) в котором недостатки LILO были исправлены.
Если речь идет о версиях Windows до Vista, например, Windows XP, то будет загружен Ntldr. Он, в свою очередь, считывает информацию из текстового файла Boot.ini, в котором записана информация об установленных операционных системах.
Загрузка ядра операционной системы
Завершающим этапом загрузки операционной системы является загрузка ядра ОС и передача ему управления.
Несколько лет назад в моей практике был такой забавный случай.
Меня попросили помочь одному человеку купить и привести в порядок компьютер для дома. Товарищ этот на тот момент времени только-только вышел на пенсию, а до этого работал в должности начальника и компьютер видел, по большей части, издалека, на столе у своей секретарши. После выхода на пенсию у него появилось время и желание компьютер освоить. Ну что, по-моему, замечательно. Компьютер мы ему подобрали недорогой, но добротный и с хорошим, по тем временам, монитором. Я поставил и настроил кое-какие программы, показал как ими пользоваться. Господин обзавелся книжкой из серии «Что-то там для чайников» и мы расстались абсолютно довольные друг другом.
Примерно через неделю мой подопечный позвонил мне по телефону и чуть не плача сообщил, что все пропало и компьютер больше не работает. Благо, запираться он не стал и честно рассказал, как было дело. А дело было так. Товарищ полез исследовать содержимое своего компьютера и нашел в корне диска С:\ несколько подозрительных и «ненужных», на его взгляд, файлов. Он решил освободить место и файлики эти попросту удалил. Думаю, что все уже догадались, что это были boot.ini, ntldr, ntdetect и др. Поправить ситуацию сложности не представляло, разве что пришлось ехать к нему еще раз.
К слову сказать, для того, чтобы получить проблемы с загрузкой Windows XP, можно было и ничего не стирать, а слегка «подправить», например, boot.ini.
Особенности загрузки операционных систем Windows Vista / 7 / 8
Но это еще не все. Откроем “Управление компьютером” –> “Управление дисками” >
Процесс стандартной инсталляции операционной системы Windows Vista / 7 / 8 создает в начале диска дополнительный раздел «Зарезервировано системой». Ему не присваивается буква диска, благодаря чему, если не сделать дополнительных шагов, и сам раздел и его содержимое будут скрыты от пользователя. Этот основной раздел имеет статус «Системный» и «Активный» и, следовательно, удалить его тоже нельзя.
В Windows 7 размер такого раздела составляет 100 МБ, из которых занято около 30 МБ, в Windows 8 – уже 350 МБ, причем занято из них 105 МБ. Такая разница объясняется тем, что в Windows 8 на этот раздел перенесена папка “Recovery”.
Посмотрим содержимое раздела «Зарезервировано системой». Для этого назначим ему букву диска, например, «W» в “Управление дисками”. Дополнительно откроем «Панель управления» –> «Параметры папок» и на вкладке «Вид» снимем галку с «Скрывать защищенные системные файлы» и поставим отметку на «Показывать скрытые файлы, папки и диски».
Если в системе установлен файловый менеджер FAR Manager, то для просмотра можно воспользоваться им и не заниматься настройкой видимости скрытых файлов.
Так выглядит содержимое раздела «Зарезервировано системой» в Windows 8 >
Как и ожидалось, в корне раздела мы видим загрузчик Bootmgr.
А так выглядит часть содержимого папки «Boot» >
В папке мы находим базу хранилища данных конфигурации загрузки BCD и сопутствующие ей папки с языковыми файлами и файлами шрифтов.
Для полноты картины осталось сказать о том, какой раздел называется загрузочным. Ответ уже показан на картинке с томами Windows 7. Очевидно, что это раздел, на котором находятся все основные файлы операционной системы.
Главной задачей загрузчика 3-го уровня, в роли которого выступает, в зависимости от типа ОС, Bootmgr, Ntldr или GRUB, является чтение с загрузочного диска и загрузка ядра операционной системы. Кроме того, в случае множественной загрузки, когда на компьютере установлено несколько операционных систем, загрузчик 3-го уровня позволяет выбирать нужную при каждом запуске компьютера.
Классической ошибкой, которой Microsoft посвятила отдельную статью, является установка Windows XP после Windows Vista / 7 /8. Установщик Windows XP помечает свой раздел как активный, после чего, во время загрузки, MBR передает управление PBS этого раздела а он, в свою очередь, — Ntldr. Загрузчик Windows XP ничего не знает о более поздних версиях операционных систем Windows и их загрузка становится невозможной. Лечится достаточно легко, но неискушенного пользователя такая ситуация может поставить в тупик.
Добавить к этому практически нечего и можно переходить непосредственно к редактированию загрузочного меню. Начнем с загрузочного меню Windows.
При включении компьютера постоянно запускается БИОС
Описание
Каждый раз, при включении компьютера сразу открывается БИОС (окно синего цвета с настройками). После выхода из него либо идет запуск системы, либо опять загружается только БИОС.
Очень часто, такое может происходить с ноутбуками производителей ASUS, MSI или Samsung.
Причина
Как правило, проблема вызвана тем, что BIOS не может найти устройство, с которого должна загрузиться операционная система. Это может произойти по следующим причинам:
Также не исключено, что просто залипла клавиша запуска BIOS (как правило, Del или F2) — из-за этого происходит постоянный базовой системы ввода вывода.
Решение
Решения выстроены в порядке простоты диагностики и вероятности встречаемости.
1. Включаем Launch CSM (режим BIOS / UEFI)
В случае использования систем, которые не поддерживают UEFI (например, Windows 7), необходимо, чтобы была включена опция «Launch CSM» (данная опция отвечает за совместимость со старыми операционными системами). Если она выключена, сначала находим опцию «Secure Boot» — отключаем ее и перезагружаем компьютер. Затем активируем Launch CSM. После уже можно попробовать перезагрузить компьютер.
Проверяем, есть ли раздел Boot Device Control и возможность выбрать между такими параметрами, как: UEFI and Legacy, UEFI Only, Legacy Only. Для старых версий системы стоит выбрать Legacy и UEFI Only или Legacy Only. Для новых систем нужно попробовать разные варианты.
В некоторых версиях BIOS/UEFI есть опция выбора типа операционной системы — могут быть варианты Windows 8 (7) и Other OS. Для системы, не поддерживающих UEFI выбираем последний вариант.
2. Проверяем дисковый накопитель
Проверяем работоспособность диска, на котором установлена операционная система (или загрузчик). Для этого можно:
а) Посмотреть, видит ли диск БИОС в разделе Main.
б) Отключить диск от компьютера и вставить в другой, проверив, что он определяется и с него можно прочитать данные.
в) Загрузить компьютер с загрузочной флешки Windows LiveCD и проверить состояние носителя, на котором стоит система, например, программой CrystalDiskInfo или Victoria.
Если диск не определяется или его состояние определяется, как критическое, то необходимо заменить сам диск.
3. Сбрасываем настройки БИОС
Сначала пробуем сбросить настройки в самом БИОСе. Для этого в разделе «Exit» находим опцию с названием на подобие «Load Default», например:
Если это не помогло, пробуем сбросить настройки, вытащив батарейку на материнской плате.
4. Проверяем подключение дискового накопителя
Проверяем плотность крепления кабеля для подключения дискового накопителя к материнской плате. Он должен плотно держаться.
Отключаем кабели жесткого диска от материнской платы и самого диска, на котором находится загрузчик. Проверяем, чтобы в них не было пыли и подключаем снова:
Также, кабель диска подключаем в другой SATA-разъем на материнской плате. Еще можно попробовать заменить разъем питания накопителя.
5. Меняем батарейку
Если каждый раз после выключения компьютера/электропитания, появляются настройки БИОС, это может говорить о том, что батарейка села. Также, сигналом для необходимости заменить ее может являться ошибка CMOS checksum error.
Для замены батарейки разбираем компьютер и находим ее на материнской плате. Примерно, это выглядит так:
Саму батарейку можно купить во многих магазинах. Маркировки для разных плат могут немного отличаться (как правило, это CR2016, CR2025 или CR2032). Проще всего, вытащить батарейку и прийти с ней в магазин.
6. Настраиваем раздел Boot (приоритет загрузки)
БИОС может постоянно запускаться, так как компьютер не может найти загрузочную область и запустить операционную систему. В этом случае может сразу запускаться «Boot menu».
Переходим в раздел «Boot» и проверяем, чтобы загрузка начиналась с жесткого диска:
* если в списке устройств запуска диск отсутствует, проверьте плотность крепления проводов. Также не исключено, что сам носитель вышел из строя.
* если в системе установлено несколько жестких дисков, нужно загружать систему с того, на котором установлен загрузчик. Если мы не знаем, что это за диск, пробуем задать приоритет каждому из них по очереди.
7. Проверяем клавиатуру
Если на клавиатуре залипли клавиши запуска БИОС (обычно, это Del или F2 — полный список в статье Как зайти в БИОС), это может привести к его запуску при включении.
Для проверки пробуем аккуратно постучать по данным клавишам и, если это не помогло, отключаем клавиатуру (ноутбук придется для этого разобрать).
8. Пустой диск (без операционной системы)
Подобная проблема будет в случае, когда компьютеру не с чего загрузить операционную систему, так как она не установлена на диск. Например, при покупке нового компьютера или замены диска. В некоторых случаях — из-за повреждения файловой системы и, как следствие, потеря на ней системы. В данном случае, необходима установить операционную систему на диск.
Также проблема может быть из-за повреждения операционной системы. Можно попробовать решить проблему, переустановив систему.
9. Выключаем компьютер
В некоторых случаях, может произойти сбой в работе БИОС. Чаще всего, поможет выключение компьютера. Для этого отключаем компьютер, вытаскиваем кабель питания, ждем секунд 10 и включаем его снова.
Для ноутбука также не забывает извлечь батарею.
10. Сохраняем настройки
БИОС может постоянно появляться, так как просто требуется разово сохранить его настройки (например, после замены одного из компонентов). Для этого переходим в раздел «Exit» и выходим с сохранением настроек. Например:
11. Обновляем БИОС
Для обновления БИОС, скачиваем последнюю его версию на сайте разработчика материнской платы. К скачанному архиву прилагается инструкция — внимательно ее изучаем и выполняем пошаговые действия.
Если на компьютере уже установлена последняя версия БИОС, то устанавливаем ее еще раз (перепрошиваем БИОС).
12. Перегрев компьютера
Проверяем на ощупь компьютер. Если он горячий, необходимо дать ему остыть (минут, 30). После включаем ПК.
Сильный перегрев может быть причиной того, что система охлаждения не справляется со своей задачей. Необходимо почистить компьютер от пыли, заменить термопасту, а при необходимости, вентиляторы или кулеры.
13. Настройка даты и времени
Заходим в БИОС и проверяем корректность даты и времени. Если они неверны, то задаем правильные значения. Применяем настройки и выходим из БИОС.
Если при обесточивании компьютера дата и время сбиваются, необходима замена батарейки материнской платы.
14. Восстановление загрузчика
Из-за проблем загрузки системы компьютер будет постоянно запускать БИОС. Операционная система может не запускаться из-за проблем с загрузчиком. Сам загрузчик может быть поврежден из-за системной ошибки, вируса, или быть случайно удален его раздел.
Для решения проблемы запускаем восстановление системы с установочного диска Windows. После в командной строке выполняем 2 команды:
Проверяем запуск системы. Если этого не произошло, выполняем команды:
* с помощью данных команд мы просканируем диск на наличие операционных систем и запишем найденные системы в загрузку.
Снова проверяем запуск системы.
15. Восстановление системы
Проблема может быть решена с помощью инструмента восстановления из контрольной точки. Опять запускаем восстановление системы с установочного диска Windows. После делаем откат системы.
Пробуем выбрать точку на момент, когда система запускалась нормально.
16. Отключение быстрой загрузки
Также может помочь отключение быстрой загрузки в БИОС. Для этого находим опцию Fast Boot и переводим ее в положение Disabled. Саму опцию можно найти в одном из разделах:
* обратите внимание, что похожая по названию опция «Quick Boot» имеет другое назначение и никак не влияет на нашу настройку, поэтому трогать данную опцию не нужно.
Для ноутбуков, также рекомендуется после отключения данной опции вытащить батарейку.
17. Нажатие кнопки Reset до запуска БИОС
Не дожидаясь входа в BIOS, несколько раз подряд (примерно, с интервалом в 1 или 2 секунды) нажимаем Reset 4-5 раз.
В некоторых случаях, данная комбинация приводит к сбросу некоторых настроек, что может привести к положительному результату.
В чем была проблема?
Если вам удалось решить проблему, поделитесь своим опытом для других. Что помогло:
Как узнать, какие программы запускаются при включении компьютера?
Просмотр списка автозагрузки стандартными средствами Windows
Отметим, что стандартный инструментарий Windows показывает не полный список программ, загружающихся при включении компьютера. Для просмотра этого списка в Windows 7:
1
В случае с Windows 10 список автозагрузки находится в системном приложении «Диспетчер задач»:
Многие программы, стартующие при включении компьютера, могут запускаться системой по запланированному заданию. Такие приложения (вернее — системные задания, запускающие их) можно найти в «Планировщике заданий». Чаще всего именно отсюда запускается всевозможное рекламное и вредоносное ПО или отдельные модули обычных программ (например, модули обновления). Чтобы ознакомиться и при необходимости отключить автозапуск таких приложений из «Планировщика заданий», выполните следующие действия:
При помощи «Планировщика заданий» можно найти и выключить различные навязчивые программы, без конца отображающие уведомления, предлагающие что-то скачать или обновить. Но вовсе необязательно, что задания на их запуск будут приведены в разделе «Библиотека планировщика заданий». Если речь идет о рекламном/вредоносном ПО, то задания на их запуск может быть размещено где угодно в «Планировщике». Также необязательно, что название этих заданий будут соответствовать названию запускающейся программы.
Если задача выполняется в данный момент времени (например, на экране виднеется уведомление от какой-нибудь программы), кликните по разделу «Планировщик заданий (Локальный)», затем вызовите меню «Действие» и в нем выберите «Отображать все выполняемые задачи»:
Так можно уточнить название задачи, затем найти и удалить ее. Во всех остальных случаях искать задания придется вручную, посещая каждый из разделов/подразделов всей библиотеки «Планировщика заданий». Ищите триггеры со значениями «При входе в систему», «При входе любого пользователя» или «При запуске компьютера», затем переходите во вкладку «Действия», чтобы определить название запускаемой программы.
Просмотр списка автозагрузки при помощи сторонних утилит
Утилита Autoruns позволяет не только просматривать и управлять программами, запускающимися при включении компьютера, но также и рядом других объектов — DLL-библиотеками, файлами драйверов, службами и даже запланированными заданиями в рассмотренном выше «Планировщике заданий».
Программой Autoruns легко пользоваться:
Остались вопросы, предложения или замечания? Свяжитесь с нами и задайте вопрос.
О работе ПК ч.3: От включения до полной загрузки Windows 10
Мы продолжаем разбираться как работает ПК на примере клавиатуры и Windows 10. В этой статье поговорим о том как происходит единение софта и железа.
Старт системы
Полностью компьютер выключен когда он отключен от питания и конденсаторы на материнской плате разрядились. До эры смартфонов мобильные телефоны часто глючили и если перезагрузка не лечила проблему, то приходилось доставать батарею и ждать 10 секунд, потому что сбрасывалось программное состояние ОС, в то время как чипы на материнской плате и контроллеры устройств оставались активными сохраняя состояние, драйвера ОС к ним просто реконнектились. 10 секунд — время на разрядку конденсаторов, состояние чипов сбрасывается только при полном отключении.
Если же ПК подключен к розетке или батарее, то он находится в режиме Stand-By, это значит что по шине питания подаётся маленькое напряжения (5В) от которого запитываются некоторые чипы на материнке. Как минимум это системный контроллер, по сути это мини-компьютер запускающий большой компьютер. Получив уведомление о нажатии кнопки Power он просит блок питания/батарею подать больше напряжения и после инициализирует весь чип-сет, в том числе и процессор. Инициализация включает в себя перекачку кода и данных прошивки материнки (BIOS/UEFI) в оперативную память и настройку CPU на её исполнение.
Думать что кнопка Power это рубильник который подаёт электричество на CPU и тот начинает исполнять с заранее известного адреса прошивку BIOS неправильно. Возможно старые компьютеры так и работали. Кнопка включения находится на своей плате, вместе со светодиодами состояний и к материнке она подключается через специальный разъём. На картинке ниже видны контакты для кнопки Power, Reset, а также светодиодов с состоянием Power и чтения жёсткого диска. Нажатие кнопки включения переводится в сигнал на контакты материнки, откуда он достигает системный контроллер.
Контакты на материнке для подключения кнопки включения, светодиодов состояния Power, жёсткого диска и динамиков.
Плата ноутбука с кнопкой включения и светодиодом состояния
Прикладная иллюстрация как блок питания получает сигнал от материнки на включение. Если вы задумаете установить мощную видеокарту (Nvidia 2070 S) на офисный ПК, то просто вставить её недостаточно, потому как она требует питание в 600W, в то время как такой ПК имеет блок на
500W. Первое что придёт в голову – купить новый блок питания на 650W с отдельной линией для видеокарты. Но и здесь будут разочарования, потому как разъёмы материнки будут не совпадать с разъёмами БП, а если его отдельно воткнуть в розетку и подключить к видюхе тоже ничего не будет – в блоке питания вентилятор не крутится и изображения нет. Так происходит, потому что БП должен получить сигнал от материнки на полное включение. Очевидное решение – новая материнка с совместимыми разъёмами, однако она стоит
$300. Есть решение проще, хоть оно и вызывает опасения пожаробезопасности. Берём скрепку, разгибаем и вставляем в зелёный (PS_ON) и один из чёрных пинов (COM). Теперь всё должно работать.
Поиск загрузчика ОС
Есть два вида прошивки материнки – BIOS (Basic Input Output System) на старых машинах и UEFI (Unified Extensible Firmware Interface) на новых. Windows 10 поддерживает обе и абстрагирует различия между ними. UEFI правильней называть ОС чем прошивкой, потому как он предлагает больше возможностей, к примеру богатый графический интерфейс вместо текстового, наличие мышки, больший объём доступной памяти, улучшенная модель безопасности и валидации файлов ОС, взаимодействие с железом через API, вместо прерываний как в BIOS.
Пример экрана монитора BIOS.
Программа BIOS хранится на отдельном чипе, подключенном к Южному мосту. Этот чип можно достать и перепрошить новой программой, по факту это просто носитель памяти, а не самостоятельный микрокомпьютер.
Настройки BIOS (системное время, например), хранятся на другом чипе который как правило находится возле круглой батарейки, которая на самом деле является литиевым аккумулятором, подзаряжающимся во время работы ПК. Называется он CMOS, что означает Complementary Metal Oxide Semiconductor, а по-русски просто — КМОП, что есть комплементарная структура металл-оксид-полупроводник.
Если всё прошло успешно, BIOS начинает процесс поиска загрузчика ОС. Для этого он начинает просматривать все подключенные к материнской плате жёсткие диски. Данные на физических дисках адресуются в единицах называемых сектор, обычно он 512 байт, однако современный стандарт – 4096 байт. Установщик Windows в самый первый сектор на диске записывает специальный программный код и данные о разделах. Этот сектор называется Master Boot Record. Диск разбивается на разделы (partitions), отформатированный своей файловой системой. Максимум 4 раздела, каждый из который может быть расширенным (extended partition), такой можно рекурсивно делить на 4 раздела и теоретически их число не ограничено. Как только BIOS находит Master Boot Record он считывает оттуда код и передаёт ему управление. Этот код поочередно просматривает данные о разделах и находит тот который помечен как активный, в нём находится код загрузчика Windows (Это не раздел с C:\Windows\System32!), этот раздел называется system partition. Как правило он занимает 100Мб и скрыт от пользователя. В первом секторе этого раздела хранится загрузочный код, которому передаётся управление. Это volume boot sector, код в нём ищет файл Bootmgr, с которого и начинается процесс загрузки Windows. Файл Bootmgr создан через соединение в один файлов Startup.com и Bootmgr.exe.
Запуск на UEFI
Пример экрана загрузки UEFI
BIOS существует больше 30 лет и в попытках исправить его недостатки компания Intel в 1998 году создала стандарт Intel Boot Initiative, позже переименованный в EFI и в 2005 году пожертвованный организации EFI Forum. Недостатки BIOS:
• Работает только в 16-битном режиме
• Может адресовать только 1Mb оперативной памяти
• Часто имеет проблемы совместимости
• MBR ограничен только четырьмя главными разделами диска
• Диск с ОС не может быть больше чем 2.2Tb.
• Имеет очень ограниченные возможности для валидации загрузчика ОС.
На смену BIOS пришёл UEFI, по сути это миниатюрная ОС которая может работать и в 32-bit и в 64-bit. Для совместимости есть опция Compatibility Support Module, которая включается в настройках и эмулирует работу BIOS.
Инициализация ядра
Запуск подсистем – SMSS, CSRSS, WinInit
SMSS.exe отличается от пользовательских процессов, это нативный процесс и это даёт ему дополнительные полномочия. SMSS.exe работает с ядром в обход Windows API, он использует то что называется Native API. Windows API – обёртка вокруг Native API. SMSS.exe первым делом запускает подсистему Windows (CSRSS.exe – Client Server Runtime Sub System) и заканчивает инициализацию реестра.
Процесс и потоки SMSS.exe помечены как критические, это значит что если они неожиданно завершаться, к примеру из-за ошибки, это приведёт к падению системы. Для общения с подсистемами, к примеру вызову API создающему новую сессию, SMSS создаёт ALPC-порт с именем SmApiPort. Загружаются из реестра переменные среды окружения, запускаются программы такие как Check Disk (autochk.exe, эти программы записаны в реестре HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\BootExecute). SMSS.exe запускается для каждой пользовательской сессии. Глобальные переменные (очередь сообщений например) у каждой сессии своя за счёт механизма виртуальной памяти. В Windows есть контексты потока, процесса и сессии. Каждый SMSS.exe запускает свой экземпляр подсистемы, на данный момент это только CSRSS.exe (Windows), в прошлом поддерживались операционные системы OS/2 (os2ss.exe) и POSIX (psxss.exe), но эта идея была неудачной. Самый первый SMSS.exe засыпает в ожидании процесса WinInit.exe. Остальные экземпляры вместо этого создают процесс WinLogon который показывает UI для входа.
Дерево процессов выглядит следующим образом, на нём можно увидеть кто и кого создал (показаны не все процессы, может немного отличаться от последний версий Windows).
Где здесь клавиатура?
Во время запуска ядро Windows считывает из реестра информацию о контроллере системной шины, как правило это шина PCI (реже MSI), к ней подключены контроллеры портов ввода-вывода, в том числе и USB, PS/2. Информация о нём записывается во время установки Windows. Система загружает для него драйвер и рекурсивно обходит все порты так же загружая для каждого из них свой драйвер. Драйвера могут комбинироваться в узлы (driver node), к примеру драйвер клавиатуры, будет соединён с драйвером порта PS2. А вот порт USB сложнее — сначала драйвер порта, потом драйвер для работы с протоколом HID и только потом клавиатура.
Каждый порт контроллируется своим чипом, который мониторит подключение, принимает/отправляет сигналы между CPU и устройством. Если чип-сет Южный мост не встроен в CPU, как это часто делают в ноутбуках, а существует отдельным чипом на материнке, то правильней говорить: сигнал между Южным мостом и контроллером порта. Чип контроллирующий порт имеет выделенную линию с контроллером прерываний (PIC или APIC), по которой он может попросить обратить на себя внимание CPU, к примеру считать данные от клавиатуры (порт PS/2, с USB другая история). Поскольку ОС загрузила для порта драйвер, она может отдавать ему команды, читать и отправлять данные. В нашем примере был загружен драйвер из C:\Windows\System32\i8042prt.sys. Давайте вспомним предыдущую статью. В старых компьютерах с PIC на чипе Intel 8259 было 15 линий прерываний, где клавиатура была подключена к ножке IRQ1, таймер IRQ0, а мышка к IRQ12, который на самом деле был пятой ножкой второго чипа 8259, который мультиплексировал свои прерывания через ножку IRQ2 первого контроллера. В современных PIC могут быть 255 контактов для сигналов прерываний. Во время загрузки ОС программирует APIC/PIC возвращать определённое число когда скажем пришло прерывание от порта клавиатуры или USB и по этому номеру CPU находит в таблице векторов прерываний функцию которую надо выполнить. Номер прерываний определяют HAL и Plug’n’Play Manager. Контроллер прерываний ищет сигнал на своих ножках в определённом порядке, к примеру в бесконечном цикле проверяет напряжение на ножках от 1 до MAX_PIN. Этот порядок определяет приоритет, к примеру клавиатура будет замечена раньше мышки, а таймер раньше клавиатуры. Чтобы не зависеть от особенностей работы контроллеров прерываний Windows абстрагирует концепцию IRQ (Interrupt Request) в IRQL (Interrupt Request Level). Будь у контроллера прерываний хоть 15 хоть 255 линий они все будут отображены на 32 IRQL для x86 и 15 IRQL для x64 и IA64.
Механизм IRQL реализовывается на уровне софта в Hardware Abstraction Layer (HAL.dll), а не железа. В Windows системах есть драйвер шины (bus driver), который определяет наличие устройств подключенных к шинам – PCI, USB и др. и номера прерываний которые могут быть назначены каждому устройству. Драйвер шины сообщает эту информацию Plug and play manager, который уже решает какие номера прерываний назначить каждому устройству. Далее арбитр прерываний внутри PnP Mgr (PnP interrupt arbiter) устанавливает связи между IRQ и IRQL.
Так вот, драйвер клавиатуры (kbdclass.sys) получает данные от порта (USB, PS2) через прерывание и записывает их через WriteFile, компонент внутри ядра Windows просыпается, считывает их используя API ReadFile и добавляет в очередь сообщений с клавиатуры. API для работы с файлом могут использоваться для чтения данных с драйверов. С этого момента начинается обработка данных стеком ввода Windows, об этом в следующей статье.
Если у вас есть ПК с PS2 портом и вы умеете пользоваться WinDbg в режиме ядра, то можете легко найти обработчик прерываний клавиатуры напечатав команду !idt, которая выведет на экран всю таблицу векторов прерываний. Прерывание вклинивается в ход выполнения программы, слово вектор здесь подразумевает направление, направление исполнения программы. WinDbg был сделан специально для отладки Windows, самая последняя версия называется WinDbgX. Он имеет текстовый интерфейс, который отпугивает людей привыкших к Visual Studio, однако предоставляет гораздо больше возможностей, в частности исполнение скриптов. Прерывание фиолетового порта PS2 выделено красным. Функция которая его обрабатывает называется I8042KeyboardInterruptService, которая находится в файле i8042prt.sys.
Сейчас возникает вопрос, откуда у обработчика прерываний аргумент? Кто его передаёт? Ведь CPU ничего не знает о нём. Если поставите в неё breakpoint, то удивитесь ещё больше увидев несколько функций выше по стеку:
0: kd> kC
# Call Site
00 i8042prt!I8042KeyboardInterruptService
01 nt!KiCallInterruptServiceRoutine
02 nt!KiInterruptSubDispatch
03 nt!KiInterruptDispatch
04 nt!KiIdleLoop
Пару слов о USB
Ознакомление с работой порта USB потребовало бы отдельной статьи описывающей его работу и плюс описание обработки данных HID на Windows. Это очень сильно усложнило бы материал, к тому же уже есть хорошие статьи по теме, поэтому PS2 идеальный пример из-за своей простоты.
USB создавался как универсальный порт для всех устройств, будь то клавиатура, фотоаппарат, сканнер, игровой руль с педалями, принтер и пр. Вдобавок он поддерживает вложенность портов – USB материнки => монитор с USB => клавиатура с USB к которой подключена мышка, флешка и USB-hub к которому подключен жёсткий диск. Взглянув на контакты USB 2.0 вы увидите что они не заточены под передачу каких-то определённых данных, как у PS2. Их всего четыре – витая пара для передачи битов данных, плюс и минус питания.
Провода кабеля USB 2.0
USB 3.0 быстрее за счёт дополнительных пяти контактов. Как видите там нету линии CLOCK для синхронизации, поэтому логика передачи данных сложнее. Слева USB 2.0 и справа USB 3.0 для сравнения.
Все данные передаются через протокол HID (Human Interface Device), который описывает форматы, порядок взаимодействия и передачи данных и всё остальное. Стандарт USB 2.0 занимает 650 страниц, документ HID Class Specification, описывающий работу устройств (мыши, клавиатуры и пр) – 97 страниц, их рекомендуется изучить если вы работаете с USB.
Первым делом подключенное устройство должно рассказать о себе, для этого оно отправляет несколько структур данных, в которых указывается ID устройства и ID производителя по которым Plug’n’Play manager может найти в реестре информацию, загрузить и соединить драйвера. USB устройства пассивны, т.е. хост должен сам с определённым интервалом проверять наличие данных. Частота опроса и размер пакета данных задаются в одном из дескрипторов устройства USB. Максимальный размер пакета – 64 байта, что для информации о нажатых клавишах более чем достаточно.
В Windows есть встроенная поддержка HID, она не такая простая как связь драйвера порта PS2 с драйвером клавиатуры, потому что драйвер HID должен уметь обрабатывать все поддерживаемые протоколом сценарии. Вне зависимости от провайдера данных — порты PS2, USB или Remote Desktop или виртуальная машина – на самом верху driver node будет находится Kbdclass, от которого ядро ОС и будет получать информацию. Уведомление о подсоединении клавиатуры будет обрабатываться через Plug’n’Play Manager, так что для ядра Windows не имеет значение какой порт или источник данных от устройства используется.