Что относится к драйверам
Драйвер
В общем случае драйвер не обязан взаимодействовать с аппаратными устройствами, он может их только имитировать (например, драйвер принтера, который записывает вывод из программ в файл), предоставлять программные сервисы, не связанные с управлением устройствами (например, /dev/zero в Unix, который только выдаёт нулевые байты), либо не делать ничего (например, /dev/null в Unix и NUL в DOS/Windows).
Содержание
Идеология построения драйверов
Операционная система управляет некоторым «виртуальным устройством», которое понимает стандартный набор команд. Драйвер переводит эти команды в команды, которые понимает непосредственно устройство. Эта идеология называется «абстрагирование от аппаратного обеспечения». Впервые в отечественной вычислительной технике подобный подход появился в серии ЕС ЭВМ, а такого рода управляющие программы назывались канальными программами.
Драйвер состоит из нескольких функций, которые обрабатывают определенные события операционной системы. Обычно это 7 основных событий:
Интеграция драйверов
По мере развития систем, сочетающих в себе на одной плате не только центральные элементы компьютера, но и большинство устройств компьютера в целом, возник вопрос удобства поддержки таких систем, получивших название «аппаратная платформа», или просто «платформа».
Сначала производители платформ поставляли набор отдельных драйверов для операционных систем, собранный на один носитель (обычно компакт-диск), Затем появились установочные пакеты, называвшиеся 4-in-1 и One touch, и позволявшие упростить установку драйверов в систему. При этом, как правило, можно выбрать либо полностью автоматическую установку всех драйверов, либо выбрать вручную нужные. Однако единого, устоявшегося термина долго не было.
Современный термин, описывающий такие наборы драйверов устройств — Board Support Package, или «пакет поддержки платформы». Помимо собственно драйверов, он может, как и прочие установочные пакеты, содержать модули операционной системы и программы.
Что такое драйвера
Компьютер — устройство сложное. В его состав входит множество компонентов. Ещё больше устройств можно подключить. И для того, чтобы эти устройства и компоненты корректно работали, нужны драйвера. С тем, что это такое, какую функцию они выполняют и как их устанавливать, мы и предлагаем вам разобраться.
Драйвер, что это?
Недостаточно просто подключить устройство к компьютеру и ждать, что умная машина сама поймёт, как с ним работать. Для компьютера каждое новое устройство — просто набор железяк. Но у этого набора железяк есть драйвера, которые также зачастую называют «дровами». Это специальное программное обеспечение, которое устанавливается на компьютер и помогает его системе понять, что к ней подключили и как с этим сотрудничать. Благодаря драйверам неизвестный набор железяк становится распознанным устройством, с которым можно брать и работать.
Не существует какого-то универсального драйвера, который мог бы научить компьютер распознавать абсолютно всё. Для каждого нового устройства нужно своё программное обеспечение. Какие-то девайсы работают без своих драйверов, потому что часть уже встроена в операционную систему. Но если встроенных нет, нужны «родные».
Сегодня о «драйверном рабстве» большинству пользователей компьютеров беспокоиться не приходится. В последних версиях операционных систем уже встроены «дрова» для многих популярных устройств. Конечно, не для всех. Но, например, для USB-флешек больше не приходится ставить драйвера вручную, потому что они уже есть. Поэтому важно работать с последними версиями операционных систем, а также регулярно их обновлять. В противном случае придётся тратить время на дополнительную установку программного обеспечения.
Для каких устройств обязательно нужны драйвера
Для всех новых подключаемых. И даже для внутренних компонентов. Свои драйвера есть у:
Множество драйверов встроено в операционную систему. Но далеко не все. Устройств существует гораздо больше, чем возможностей напичкать ОС дополнительными программами, которые могут не потребоваться пользователю. Поэтому установка совершается при подключении устройства. На современных девайсах «дрова» уже есть. Именно из-за их установки на ваш компьютер первое подключение длится дольше, чем будет в перспективе. Но раньше приходилось дополнительно брать их с установочного диска, который шёл в комплекте с устройством.
Где брать драйвера и как устанавливать
Вы подключаете новое устройство, а оно не работает. В чём проблема? В устройстве или в вашем компьютере? Зависит, конечно, от ситуации. Но прежде, чем пенять на работоспособность устройства, попробуйте поставить драйвера. Если в комплекте их нет, то скачать их, скорее всего, можно напрямую с официального сайта производителя. Они абсолютно доступны и бесплатны. Хотя, скачивать с незнакомых ресурсов не стоит, обычно всё есть по официальным сайтам, достаточно осуществить поиск по модели оборудования. Также найти их можно на установочном диске, который идёт с оборудованием. Но обычно проще скачать — технологический мир потихоньку отходит и от хрупких дисковых носителей, давно распрощавшись с дискетами.
Установка осуществляется через инсталлятор вашей операционной системы. Здесь всё интуитивно понятно, вы просто кликаете по кнопкам «далее», следуете инструкциям инсталлятора на экране. Драйвера встраиваются в систему. И теперь она понимает, как обращаться с новым оборудованием. Обязательно ставьте последнюю версию драйверов и для надёжности перезагружайте компьютер. А если проблемы с подключением после установки актуальных «дров» остаются, то, возможно, вам стоит отнести устройство в ремонт.
Драйвер — что это такое и для чего они нужны
Практически каждый пользователь компьютера и ноутбука при первой установке/переустановке Windows или подключении к системе нового устройства/железа — сталкивается с термином драйвер.
Но не все знают значение данного слова, зачем они вообще нужны и как работают. Если вы хотите закрыть этот пробел в своих знаниях и увеличить свою компьютерную грамотность — данный материал подготовлен именно для вас.
Прочитав прошлую публикацию, вы могли узнать про дефрагментацию диска, эта же статья будет посвящен определению, что такое драйверы в информатике и какую функцию они выполняют для операционной системы.
Что такое драйвер
Драйвер (driver) — это программное обеспечение для операционной системы, чтобы она могла взаимодействовать с подключенным к компьютеру/ноутбуку аппаратным обеспечением. Это может быть принтер, видеокарта, звуковая карта и т.д. С английского языка переводится, как «проводник».
Другими словами — это проводник, который позволяет общаться между собой устройству и операционной системе.
Также, такое ПО может быть только имитацией подключенного устройства. Например, если вы захотите распечатать какой-либо документ, но самого принтера у вас нет, то его можно будет «распечатать» через имитируемый программой-драйвером принтер в файл pdf.
Для чего нужен драйвер
Драйверы являются неотъемлемой частью операционной системы. Без них она попросту не будет работать, ведь именно они обеспечивают взаимодействие между всем аппаратным обеспечением компьютера и ОС. Но, вы можете этого даже не заметить, т.к. при первом запуске Windows все уже исправно функционирует.
А происходит это, потому что такое программное обеспечение для ключевых компонентов системы — процессор, клавиатура, монитор и т.д. уже по умолчанию есть в самой Windows и автоматически устанавливается вместе с самой ОС. Но, для некоторых устройств (принтер, сканер, видеокарта и других) нужно устанавливать свое ПО, которое обычно выпускает сам производитель.
Простыми словами, без установленной для устройства программы-драйвера, например, для сканера — он попросту не будет работать.
Интересно! При подключении к ПК/ноутбуку какого-либо нового оборудования Windows автоматически начинает поиск подходящего для него ПО.
Как посмотреть установленные драйверы на компьютере с Windows
В ОС Windows 10, 8, 8.1 и 7 их список можно посмотреть в диспетчере устройств. Чтобы открыть его разом нажмите клавиши «WIN + R» на клавиатуре и вбейте команду devmgmt.msc.
Откроется окно со списком аппаратных средств системы, разделенных по категориям. Так раскрыв определенную категорию и открыв какой-либо компонент, можно перейти по вкладке «Драйвер» и посмотреть сведения о нем.
Если вы увидите, устройство с восклицательным знаком — значит программное обеспечение к нему работает неправильно или вообще отсутствует. Его будет необходимо переустановить/установить.
Важно! Подробнее прочитать про установку драйверов можно в соответствующей статье. Там же вы найдете подробную инструкцию по их поиску и автоматической установке с помощью специальных программ.
В заключение
Надеюсь, прочитав данный материал, вы подчерпнули для себя, что-то новое и главное, нужное. Постарался все объяснить, как можно более простыми словами. Заходите почаще, будет еще много полезных и интересных статей.
Драйверы внешних устройств.
Драйвер — программа, которая управляет работой внешнего устройства, преобразует данные на входе и выходе.
Чтобы сигнал от внешнего устройства был воспринят и правильно расшифрован процессором или сигнал, передаваемый процессором, был верно отображен, необходима работа драйвера.
Каждое внешнее устройство имеет свой драйвер. Драйверы основных стандартных устройств (таких, как клавиатура, монитор, дисковод дисков и др.) включены в базовую систему ввода/вывода (BIOS) и зашиты в ПЗУ. Драйверы, которые обеспечивают работу новых устройств (лазерного пойнтера, сканера и многих других) или нестандартное использование стандартных устройств, хранятся на системном диске в виде обычных файлов. При начальной загрузке операционной системы они автоматически загружаются в оперативную память, для этого их имена должны быть перечислены в специальном файле config.sys. Таким образом, можно легко добавить или заменить драйверы вновь подключаемых устройств, не затрагивая основных системных файлов.
3. Командный процессор (процессор командного языка, интерпретатор команд) — программа, которая обеспечивает диалог пользователя с компьютерной системой. Она хранится на системном диске в файле со стандартным именем command.com. Диалог ведется на командном языке. Команды, отдаваемые пользователем, обрабатываются командным процессором и затем исполняются.
В функции командного процессора входит также исполнение файла автозапуска (autoexec.bat). В нем указаны команды и программы, которые требуется автоматически выполнить при запуске компьютера. Такой файл пользователь формирует сам, если желает соответствующим образом настроить свой компьютер. Взаимодействие пользователя с операционной системой MS-DOS (пользовательский интерфейс) осуществляется с помощью командной строки в режиме диалога. Операционная система выводит на экран приглашение пользователю, который в ответ вводит с клавиатуры команду, предписывающую выполнить то или иное действие, и, если требуется, имя файла, над которым это действие должно быть совершено. ДОС обеспечивает выполнение команды и вновь выводит приглашение к диалогу. Если по каким-то причинам команда не может быть выполнена, выдается соответствующее сообщение и диалог может быть продолжен.
Такой способ взаимодействия весьма неудобен, особенно если файл имеет длинное полное имя. Для облегчения диалога используются так называемые операционные оболочки, которые выполняют роль посредника уже между операционной системой и пользователем и делают более удобным общение с ней — предоставляют удобный пользовательский интерфейс.
К числу операционных оболочек. получивших наибольшее распространение, можно отнести Norton Commander. Оболочки такого типа можно назвать также диалоговыми. К ним относятся такие оболочки, как Far Manager, Dos Navigator и др.
Диалоговые оболочки обеспечивают
Следующим шагом в развитии и совершенствовании пользовательского интерфейса стали графические операционные оболочки, ярким примером которых является Windows 3.1 (и последующие версии Windows 3.1х). Оболочки, Windows 3.1х работают на базе – MS DOS и в совокупности с ней образуют полноценную операционную систему.
Идеи и концепции, заложенные в графических оболочках Windows 3.1х, получили дальнейшее развитие в разработке Windows 95; которая является самостоятельной операционной системой, как и операционные системы Windows 98 и Windows NT.
Поскольку операционные оболочки Windows 3.1x и операционные системы семейства Windows, идеологически близки, будем для их общего обозначения использовать термин «операционные среды Windows».
Многозадачная операционная система позволяет:
Если в графическом редакторе нарисовать зайца и встроить его в текстовый документ как иллюстрацию, установив соответствующие связи, а затем в графическом редакторе добавить к рисунку лису, то лиса без дополнительных усилий появится и на рисунке, и в текстовом документе.
Хотя преимущества операционных систем Windows наиболее полно проявляются при работе с приложениями Windows, программные средства, разработанные для DOS, вполне совместимы с Windows и могут работать под ее управлением.
Многопользовательские ОС появились исторически раньше других типов ОС. Они были предназначены для работы на мини- и суперкомпьютерах одновременно большого числа программ различных пользователей. В настоящее время многопользовательские ОС широко используются на серверах в информационных сетях. К этому типу ОС относится большинство операционных систем, например, Unix, Linux, Solaris и их многочисленные аналоги.
Системы реального времени обеспечивают гарантированное время реакции на наступление внешнего события (например, появление сигнала от датчика). Такие системы могут использоваться для управления критически важным оборудованием (станками, технологическими процессами, средствами передвижения, военной и космической техникой, энергетическими установками). В персональных компьютерах системы реального времени не применяются, так как они требуют специального аппаратного обеспечения.
Для повышения производительности системы используют объединение нескольких процессоров. Операционные системы, обеспечивающие равномерную нагрузку каждого процессора при выполнении программ, называются многопроцессорными.
Другие распространенные ОС (Unix, Linux, OS/2, Windows NT)
Персональные компьютеры могут работать не только под управлением Windows (которая является самой распространённой системой для ПК), но и других операционных систем. Каждая из них имеет определённые уникальные особенности, вместе с тем, однако, нельзя утверждать, что какая-то ОС является лучшей для всех применений. Среди наиболее популярных ОС следует отметить Unix (и её многочисленные клоны), OS/2 и Windows NT (Windows 2000).
Unix (Юникс) — одна из самых первых ОС, разработанная для больших ЭВМ ещё в 1960-е годы. Обеспечивает многопользовательский, многозадачный режим работы. Отличается большой надёжностью. Реализована на языке С, в связи с чем обладает переносимостью на различные платформы и сравнительной простотой модификации. Существуют версии для практически всех типов ЭВМ, в том числе и для PC. Unix поддерживает также многопроцессорные системы. Используется в основном в системах массового обслуживания (серверы баз данных, WEB-серверы) и управления технологическим оборудованием. Имеются модификации Unix для работы в реальном времени (например, для управления ядерным реактором).
Большое количество самостоятельных модификаций (клонов) Unix позволяет выбрать лучшее решение для каждого конкретного случая использования ЭВМ. В частности, для персонального применения и построения небольших серверов целесообразно использовать операционную систему Linux (Линукс). Linux обладает всеми достоинствами Unix, но предоставляет несколько более дружественный интерфейс (в том числе графический) и, самое главное, является открытым ПО, то есть распространяется в исходных текстах. Разработка н поддержка Linux производится как независимым содружеством программистов, так и многими ведущими производителями ПО (Red Hat, Caldera, Corel и др.). В настоящее время популярность Linux среди администраторов и пользователей небольших сетей стремительно растёт (во многом благодаря бесплатному распространению), однако для полноценной замены Windows в офисах время пока ещё не пришло.
. Всем модификациям Unix свойственны общие достоинства (высокая надёжность, защищенность от умышленных повреждений и вирусов, разумные требования к аппаратуре, огромное количество служебного ПО и утилит) и недостатки (трудоемкость установки и обслуживания, относительно малое количество прикладного ПО, особенно офисного). Таким образом, Unix-подобные системы целесообразно использовать для управления серверами или ответственным оборудованием.
OS/2 — разработана в начале 1990-х годов фирмой IBM (первое время совместно с Microsoft). Получила большую известность к середине 90-х годов. После выхода Microsoft Windows 95 (и особенно NT) OS/2 стала утрачивать популярность. В настоящее время не развивается и новые версии не выпускаются. Обладает графическим интерфейсом (подобный реализован в Windows) и поддержкой многозадачности. В отличие от Windows, более требовательна к производительности и качеству аппаратуры. Имеет смысл использовать OS/2 в старых системах для управления серверами в небольших сетях или управления оборудованием при наличии соответствующего ПО. Многие узлы сети FidoNet работают под управлением этой ОС.
Windows NT — наиболее известная операционная система для небольших компьютерных систем, поддерживаемая большинством производителей аппаратного и программного обеспечения. Безусловные достоинства NT и агрессивная политика Microsoft в области рекламы, распространения и поддержки своей ОС обеспечивают лидерство среди серверных систем в жёсткой конкуренции с основным соперником — Linux. Windows NT и её последние версии Windows 2000 и Windows XP существуют в нескольких модификациях: Workstation (для использования на персональных компьютерах) и Server — для установки на серверах (есть ещё Advanced Server и Enterprise Edition для использования в болышгх системах, но эти задачи здесь не рассматриваются). NT имеет поддержку нескольких процессоров, удалённого управления, развитыми средствами диагностики и обслуживания. Некоторым недостатком NT принято считать повышенные требования к аппаратуре, в частности, к объёму оперативной памяти, но данные особенности совершенно естественны для ОС такого уровня. NT обладает высокой надёжностью и защищенностью (при соответствующей настройке и квалифицированном обслуживании). При всём этом в NT сохранён удобный графический интерфейс, идентичный интерфейсу Windows 9x. Под управлением NT работает большое количество прикладных программ для Windows 9x, кроме того, существуют профессиональные программы, разработанные специально для Windows NT (для обработки трёхмерной графики, видео и аудио информации, бухгалтерское ПО). Большинство систем масштаба небольшого подразделения или предприятия используют Windows NT (или 2000) как на сервере, так и на рабочих местах. Стоимость NT достаточно высока, но недостаток ли это, ведь хороший продукт не может быть слишком дешёвым. Таким образом, Windows NT целесообразно применять для управления персональными компьютерами и серверами в небольших и среднего размера сетях, для обработки текстовой, графической информации, баз данных и других целей. Однако управление критически важным оборудованием NT лучше не доверять: эта ОС не является системой реального времени и не свободна от ошибок.
Статьи к прочтению:
Драйверы Внешних Устройств Относятся К
Похожие статьи:
Функциональные компоненты ОС автономного компьютера 9.1. Управление процессами Управление памятью Управление файлами и внешними устройствами Защита…
Драйвер Windows
Теория
Режимы работы процессора
Внутренняя структура любой операционной системы базируется на аппаратных особенностях платформы, на которой она работает. Центральным звеном является процессор, у процессоров архитектуры x86-64 имеются несколько режимов работы:
На заре эры развития персональных компьютеров архитектуры x86, процессор работал в реальном режиме. Тем не менее, реальным режим постепенно ушел в прошлое, поскольку имел ряд особенностей, делающих затруднительным дальнейшее развитие технологии : однозадачную аппаратную среду, 16-битную шину данных и 20-битную шину адреса (ограничение по адресации), сегментную адресацию с размерами сегментов в 64 килобайта (неудобство использования адресного пространства), отсутствие разграничений доступа к адресному пространству (невозможность создания изоляции процессов). С целью снятия существовавших ограничений был разработан защищенный режим, который предоставлял ряд важных для развития операционных систем особенностей: многозадачность, механизм защиты (доступ к привилегированным командам), обеспечивающий контроль доступа различных участков кода (программ) друг к другу, модель виртуальной памяти. В защищенном режиме процессоров Intel архитектуры x86 реализованы так называемые кольца защиты или уровни привилегий. Всего их четыре: 0 (наиболее привилегированный), 1, 2 и 3 (наименее привилегированный). Уровни привилегий призваны защитить код режима ядра от пользовательских программ и пользовательские программы друг от друга, поскольку это может привести к нарушению работоспособности. Однако операционная система Windows не использует все перечисленные уровни, в ней задействованы лишь два из них: 0-й и 3-й.
Для наглядности понимания приведем упрощенную схему взаимодействия компонентов Windows:
Как вы видите, внутренняя среда операционной системы Windows разделена на две части и поддерживает два режима выполнения:
Это стоит понять, осознать и запомнить раз и навсегда, поскольку, собственно, это одна из базовых, основных концепций очень многих современных операционных систем.
Режимы пользователя и режим ядра обладают следующим различиями:
В пользовательском режиме выполняются следующие процессы (пример для Windows 7):
В режиме ядра выполняются (пример для Windows 7):
Поскольку любая операционная система попросту обязана уметь работать с аппаратными средствами, в дистрибутиве (комплекте установки/системных файлах) присутствуют драйверы ключевых компонентов аппаратного обеспечения, без которых система буквально лишится доступа к аппаратной части со всеми вытекающими из этого проблемами: не сможет функционировать или вовсе не пройдет процедуру собственной установки. Представлены эти «внутренние» драйверы в виде так называемой встроенной библиотеки драйверов, видоизменяющейся по составу от версии к версии, в зависимости от этапов эволюционирования аппаратного обеспечения и рыночных тенденций. Драйвера из состава данной библиотеки, при необходимости, устанавливаются на этапе инсталляции операционной системы в зависимости от обнаружения (идентификации) в компьютере тех или иных устройств. В общем случае, во время инсталляции, код модуля обнаружения оборудования выполняет перечисление (определение) установленных в компьютере устройств и проверяет в своей библиотеке наличие сопоставимых драйверов. Для тех устройств, для которых присутствуют системные драйвера, производится установка в автоматическом (фоновом) режиме. Тем самым «на выходе», после инсталляции операционной системы, мы можем получить минимально-необходимый для функционирования набор системных драйверов, который позволяет организовать работоспособную [начальную] рабочую среду. Но стоит помнить, что ограничиваться встроенными в дистрибутив драйверами не стоит, поскольку для полноценного функционирования большинства устройств могут потребоваться драйвера, предоставляемые производителем устройства.
Уровни запросов прерываний (IRQL)
Среди ключевых внутренних механизмов, определяющих функционирование операционной системы Windows, имеется достаточно важная для понимания принципов работы драйверов тема, обойти которую стороной вряд ли получится. Механизм этот носит название уровня запросов прерываний (Interrupt Request Level, IRQ Level, IRQL) и достаточно сложен для понимания, поэтому углубленное его изучение выходит далеко за рамки излагаемого материала, однако в данной статье мы предпримем попытку краткого изложения (ну а в будущем выделим под него отдельную статью). Откровенно говоря, сам я до сих пор путаюсь в концепции IRQL, поэтому буду излагать собственное понимание планомерно, шаг за шагом, с опорой на знания, полученные на каждом из этапов.
Исторически сложилось так, что термин прерывание всегда ассоциировался у меня с реальным режимом работы процессора, перенося во времена операционной системы MSDOS, когда все было достаточно просто: существовал набор из 256 прерываний, доступных через таблицу векторов прерываний. Часть этих прерываний были аппаратными, соответственно генерировались самостоятельно по каким-либо внешним аппаратурным событиям, другие же являлись программными, то есть могли вызываться из кода приложений. Записи в таблице прерываний могли переопределяться, потому как вектор обработчика прерывания был доступен для изменения по своему усмотрению на адрес собственной процедуры обработки. Таких понятий как уровень запросов прерываний не существовало, все было просто и понятно. Однако, прогресс на месте не стоял и с эволюцией процессоров и операционных систем появился сначала защищенный режим, а затем Microsoft выпустила очередную версию своих операционных систем, которая получила название Windows, и вот с этого самого момента все начало стремительно усложняться.
Буквально внезапно, в первых же версиях Windows 95/NT, возникла какая-то внутренняя таблица (состоящая из 32 уровней запросов прерываний), уровни которой градируются от самого низкого 0 (passive) до самого высокого 31 (high):
Имя | Класс | Назначение | Уровень Intel x86-64 |
---|---|---|---|
HIGH | Аппаратный | Наивысший уровень. Немаскируемое прерывание и другие типы. | 31 |
POWER | Аппаратный | События сбоя питания | 30 |
IPI | Аппаратный | Межпроцессорный сигнал. Сигналы межпроцессорного взаимодействия. | 29 |
CLOCK | Аппаратный | Такт системного таймера | 28 |
PROFILE | Аппаратный | Контроль производительности. Таймер профилирования ядра (механизм измерения производительности системы). | 27 |
DEVICE | Аппаратный | DIRQL (Devices IRQL). Аппаратные прерывания устройств. | 3-26 |
DISPATCH | Программный | Операции планировщика/отложенные вызовы процедур (DPC). | 2 |
APC | Программный | Асинхронные вызовы процедур. | 1 |
PASSIVE | Программный | Пассивный уровень. Нет прерываний. Обычный уровень выполнения кода режима пользователя | 0 |
Как можно заметить, в приведенной таблице присутствует очень интересная особенностью: вместе сведены и программные и аппаратные уровни (0-2 это программные уровни, а с 3-31 это аппаратные). Как позднее выяснилось:
Из этого утверждения следует, что модель собственная, программная, и уровни в ней не привязаны к какой-либо спецификации оборудования, это позволяет системе собрать в единую иерархию приоритетов аппаратные и не аппаратные типы прерываний. Низшие (не аппаратные/программные) уровни IRQL (PASSIVE, APC, DPC/DISPATCH) используются для синхронизации программных подсистем операционной системы: запуска операций планирования, таких как переключение потоков или обработка завершения ввода/вывода. Давайте рассмотрим их подробно:
Пример, поясняющий назначение IRQL
Хорошо, но я так и не понял, почему нельзя было отказаться от всех этих уровней и сделать «плоскую» модель очередей, либо выполнять все эти типы задач по мере поступления? Давайте смоделируем рабочую ситуацию: представим какой-либо код, например небольшую программу, написанную «на коленке». Мы запустили её на выполнение, соответственно в системе сформировался процесс для нашей программы, в контексте которого начал выполняться основной поток. Типовой поток (режима пользователя или режима ядра) исполняется на самом низшем уровне IRQL PASSIVE. На протяжении всего времени выполнения потока, часы (микросхема таймера) периодически генерирует собственные прерывания для отсчета временных интервалов, которые используются для указания операционной системе о прохождении заданного промежутка времени. Процедура обработки прерывания часов выполняется на уровне IRQL CLOCK, который (если посмотреть в таблицу) выше по приоритету большинства уровней: и уровня DISPATCH, на котором выполняется планировщик, и уровня PASSIVE, на котором выполняется наша программа. Таким образом таймер постоянно вытесняет работу и планировщика и нашей программы. С каждым переданным тиком таймера, процедура обработки прерывания таймера уменьшает остающийся у выполняющегося в данный момент нашего пользовательского потока квант времени. В момент, когда квант времени выполняющегося потока уменьшается до нуля, программа обработки прерывания часов генерирует прерывание уровня DISPATCH, тем самым вызывая запуск планировщика для выбора им следующего потока для выполнения. По факту генерирования прерывания уровня DISPATCH, процедура обработки прерывания таймера заканчивает исполнение своего кода и управление возвращается ядру системы. Ядро находит в очереди запросов следующее прерывание с наиболее приоритетным уровнем, находящееся в режиме ожидания. Каждое прерывание обслуживается по очереди. Когда все прерывания выше уровня DISPATCH обслужены, то выполняется процедура обработки прерывания уровня DISPATCH. Эта программа обработки прерывания обрабатывает список DPC и затем вызывает планировщик. Планировщик обнаруживает, что квант времени текущего потока исчерпан, то есть уменьшен до нуля, после чего Планировщик выполняет алгоритм планирования для выбора следующего потока на выполнение. Код поставленного на выполнение потока будет выполнен когда система опустится на уровень IRQL PASSIVE.
Теперь представьте, что вы уберете из системы иерархию уровней запросов прерываний, как в этом случае будет вести себя система? В этой ситуации было бы непонятно что и когда выполнять, система выполняла бы все поступающие задачи в порядке очереди, что привело бы к тому, что потоки запросто могли бы не дать планировщику выполниться, тем самым полностью уничтожить вытесняющую многозадачность, что повлекло бы за собой непредсказуемую работу ОС. Таким образом:
Назначение уровней IRQL в системе следующие:
Тем самым, на глобальном уровне механизм IRQL позволяет подпрограмме операционной системы:
Ну хорошо, а как это воздействует на драйвера? Мы знаем, что драйвера могут быть пользовательского режима и режима ядра, соответственно, выполняются пользовательском режиме и в режиме ядра. Отсюда следует, что:
И отсюда следует два достаточно важных вывода:
Представьте ситуацию, когда код драйвера выполняется на низком уровне IRQL, модифицирует какой-либо объект (например, файл file.txt ), затем другой код на более высоком уровне IRQL внезапно прерывает его выполнение и модифицирует тот же файл file.txt другими данными. Когда управление вернется к нашему драйверу, он продолжит модификацию файла своими данным, тем самым затерев данные, поступившие от другого источника. Таким образом файл войдет в рассогласованное состояние. Для решения подобных проблем были введены различные системные объекты синхронизации. Для того, что бы код уровня ядра мог модифицировать определенные типы данных, объекты взаимного исключения, он должен сперва получить владение блокировками.
Концепция драйвера
Соответственно выводы, следующие из этого утверждения, очевидны: для взаимодействия системы с устройствами требуются отдельные интерфейсы, возможно даже сложная совокупность нескольких интерфейсов. Концепция драйвера была разработана для решения задачи сопряжения и используется в моделях большинства современных систем, она основана на работе в адресном пространстве ядра специального кода, который обеспечивает взаимодействие ядра системы с любым типом логических/физических устройств.
Учитывая общую ориентированность ресурса, в статье мы будем освещать специфику исключительно драйверов операционной системы Windows. Итак, для драйвера Windows, как, в общем то, драйверов других операционных систем, верны следующие утверждения:
то же, но другими словами:
Одно из приведенных определений отмечает немаловажную особенность драйвера: ошибочно представлять драйвер исключительно во взаимодействии с физическим устройством, поскольку драйвер не обязательно должен предоставлять доступ к функциям какого-либо оборудования, он может обеспечивать и исключительно программные функциональные особенности. Примерами подобных решений являются драйвера, устанавливаемые в систему антивирусами, системами шифрования данных, системами мониторинга. Общий алгоритм работы любого драйвера следующий: приложения посредством функций специального пользовательского интерфейса (в Windows это Win32 API) или запросов ввода-вывода опосредовано/напрямую обращаются к функциям драйвера некоего устройства. Драйвер, в свою очередь, предоставляет доступ к функциональным особенностям интересующего устройства, а так же контролирует процесс взаимодействия между запросами приложений и непосредственно устройством. Естественно, что в драйвере должны быть определены (описаны) все принципы взаимодействия с обслуживаемым (подчиненным, собственным) устройством, должен присутствовать набор данных об управляемом объекте, инструкции (набор команд), с помощью которых системный/пользовательский код может корректно инициализировать устройство и начать с ним взаимодействие.
Загрузка драйверов при запуске операционной системы
Очень интересно было бы увидеть, на какой именно стадии загрузки операционной системы начинает загружается и начинает выполняться первый драйвер Windows? Однако в детальном изложении процесс этот достаточно нетривиален и для глубокого понимания требует реверсинга кода многих компонентов загрузки, в дополнение ко всему необходимо учитывать множество сопутствующих моментов, как то: последовательность загрузки, обусловленную зависимостью между драйверами, по причине которой драйвера могут группироваться в так называемые «группы загрузки», сама загрузка драйверов может разделяться на несколько этапов и прочее. При этом, следует учесть, что в Сети имеется большое количество материалов относительно устаревших уже операционных систем, поэтому мы попытаемся актуализировать процесс загрузки драйверов Windows на примере (наиболее близкой мне по духу) операционной системы Windows 7. И для начала не мешало бы рассказать об основных компонентах ядра Windows, активно участвующих в процессе загрузки драйверов:
Эти два менеджера, то есть менеджер ввода-вывода и PnP менеджер, активно взаимодействуют между собой.
Теперь мы опишем процесс загрузки операционной системы, однако сделаем это не в привычной нам форме, а кратко отметим ключевые моменты, касающиеся работы описанных компонентов операционной системы с драйверами:
Из всего этого алгоритма загрузки драйверов нам необходимо уяснить следующие основные правила: драйвер может быть загружен (в зависимости от стадии/класса драйвера) при помощи PnP-менеджера, либо с помощью SCM, а вот в процессе функционирования драйвера активно принимает участие Менеджер ввода-вывода.
Структура драйвера Windows
На что может быть похож драйвер по структуре? Неужели это какой-то особый класс программ, устроенных сугубо специфически? Я тоже так когда-то по наивности полагал, но если подумать, то с какой стати разработчикам операционной системы усложнять себе жизнь и изобретать новый специализированный формат образа исполняемого файла для каких-то ядерных компонентов? Намного проще адаптировать старый, давно уже отлаженный и сто раз проверенный.
Тип подсистемы может быть задан при сборке исполняемого модуля. Сама по себе нативная подсистема характерна для приложений, которые функционируют по иным, отличным от классических, правилам: на стадии подготовки образа к исполнению им не требуется инициализация подсистемы Win32. В числе прочих подсистема native используется для кода режима ядра, коим и являются практически все драйвера.
Сделаем небольшое отступление и поговорим о таком понятии как объект. Дело в том, что весь процесс функционирования драйвера Windows, как и любых других модулей операционной системы, зависит от разнообразных системных структур данных. Эти структуры управляются ядром и могут содержать в себе потоки, события, запросы ввода-вывода, устройства и прочие сущности.
Для более глубокого понимания того, какие функциональные особенности может обеспечивать драйвер, давайте приведем общую схему ключевых процедур драйвера:
Собственно, глядя на приведенную схему, становится понятно, какие именно виды взаимодействия, а именно группы процедур должен реализовывать абстрактный драйвер Windows. Давайте теперь перечислим некоторые из этих процедур:
Становится очевидным, что в процессе разработки драйвера Windows не стоит задачи реализовать весь набор описанных выше процедур, каждый драйвер уникален и разработчик волен обеспечивать собственный набор реализаций, поддерживаемых драйвером. Когда драйвер при помощи PnP-менеджера или SCM загружается в систему, диспетчер ввода-вывода создает в пространстве имен объект «драйвер» (driver object) и вызывает процедуру инициализации драйвера (обычно это DriverEntry ), которая выполняет дальнейшие действия по инициализации.
Объект драйвера представляет код и данные драйвера в ядре: помимо прочего, через этот объект драйвер экспортирует точки входа своих процедур. Процедура инициализации драйвера записывает в атрибуты данного объекта точки входа всех экспортируемых процедур драйвера. После загрузки драйвер может создавать объекты «устройство» для представления устройств или даже для формирования интерфейса драйвера. Большинство драйверов создают объекты «устройство» следующим образом:
Взаимодействие с драйвером
Каким же образом пользовательская программа может взаимодействовать с драйвером в системе? На этот случай имеется два способа:
Ну с первым случаем все достаточно просто, в прикладной программе вызывается какая-либо ординарная функция Win32 API (например, CreateFile ), которая, затем, в зависимости от целевого объекта (файла, каталога) может вызвать в цепочке своих вызовов функцию обмена с драйвером. Фактически, в этом случае код приложения не ставит своей задачей взаимодействовать с каким-либо драйвером, просто по цепочке вызовов процедур, на определенном этапе выполнение уходит в режим ядра и там происходит вызов функции драйвера. Все это остается сокрытым от разработчика, однако возможно отследить взаимодействие при помощи отладочных средств.
Второй случай более интересен, он возникает когда под вызовом драйвера подразумевается не косвенный вызов (посредством вызова типовой функции), а передача при помощи специальной функции (например, DeviceIoControl ) так называемого запроса ввода/вывода (I/O control request), который, в дальнейшем, инициирует формирование блока данных под названием пакета запроса ввода-вывода.
Формально IRP это пакет, но фактически это объект ядра, то есть структура (блок) данных с набором процедур для менеджера ввода-вывода, обеспечивающая обмен данными между программой и драйвером, либо между драйвером и драйвером. Как мы уже упоминали, архитектура Windows построена таким образом, что в ней запрещено прямое взаимодействие программы режима пользователя и драйвера, поэтому подобный обмен сводится к посылке программой кода IOCTL, который уже приводит к формированию менеджером ввода-вывода IRP пакета запроса. Именно менеджер ввода-вывода, как ответственный за взаимодействие с драйверами, оперирует пакетами IRP. Менеджер ввода-вывода получается запрос на ввод-вывод от пользовательской программы, затем формирует IRP и передает его соответствующему драйверу.
Пакет IRP состоит из двух частей:
Виды (типы) драйверов Windows
В процессе эволюционирования и, соответственно, усложнения драйверной концепции, драйверы начали подразделяться на категории (или типы) в зависимости от назначения. Вот основные из них:
По уровню компонетизации драйверы бывают:
PnP драйвера под Windows подразделяются на:
По режиму выполнения драйверы Windows градируются:
Модели драйверов
На протяжении всего времени существования операционной системы, разработчики пытались стандартизировать и упростить разработку драйверов. В следствии чего появились модели.
Модель WDM
Когда-то очень давно существовало две основных направления развития драйверной концепции Windows:
Однако, начиная с версии Windows 98/NT4.0 разработчики предприняли попытку унифицировать (универсализировать) разработку драйверов, в следствии чего на смену упомянутым моделям пришла новая модель WDM.
Модель WDM являлся этапом переопределения классического стека драйвера Windows с целью обеспечения поддержки являющихся в то время революционными технологий Plug-and-Play и ACPI. Модель дает возможность загружать/выгружать драйверы «на лету», без необходимости в перезагрузке операционной системы, разрабатывать драйвера в виде расширений (фильтров) к стандартным системным драйверам, более гибко управлять энергосбережением и конфигурацией устройств и прочее.
В рамках модели WDM любое аппаратного устройство поддерживается, как минимум, двумя драйверами:
Модель WDF
На протяжении всего времени развития, модель WDM претерпевала множество изменений, существенно разрастаясь. Начиная с Windows Vista была предпринята очередная попытка развития концепции драйвера Windows, в сущности уже существовавшей на тот момент модели WDM, результатом чего явилось новой модели (надстройки над WDM) под названием WDF.
Связано это было с тем неоспоримым фактом, что разработчикам не удалось достичь достаточного уровня абстракции модели WDM, а именно недостаточной интеграцией подсистемы ввода-вывода с технологией Plug-and-Play и управлением питанием. Это приводило к тому, что на разработчике драйвера лежала громадная нагрузка по синхронизации этих самых запросов ввода-вывода с событиями Plug-and-Play и запросами энергопотребления. Очевидно, требовалось дальнейшее упрощение драйверной модели. WDF пришла на смену WDM и считается наиболее современной моделью.
WDF реализует следующие возможности:
Модель WDF подразделяется на два направления:
Подразделение сред по режимам пользователя и ядра в модели WDF достаточно условное, поскольку основное предназначение данного разграничения заключается в классификации разработки драйверов для тех или иных классов устройств.