Что такое драйвер проекта
Что такое драйвер и зачем он нужен
Это виртуальная инструкция к любому «железу» в компьютере
«Слетели драйвера», «У меня нет драйверов на принтер», «Видеокарте нужны драйвера» — если вам непонятно, что это значит и на что влияют драйверы, то эта статья для вас.
Что такое драйвер
Драйвер — это программа, которая работает как инструкция для операционной системы. Драйвер объясняет операционке, как пользоваться каким-то устройством.
Устройство — это то, что физически подключается к компьютеру:
Драйвер рассказывает компьютеру, как этим железом пользоваться, что оно умеет, какие команды понимает и как это железо могут использовать другие программы.
👉 Технически драйвер — это программа, которая висит в памяти компьютера всё время, пока компьютеру нужно это устройство.
Известное и неизвестное железо
Операционная система в компьютере знает и умеет многое, в том числе и работать со стандартным оборудованием. Стандартным — это значит тем, которое предоставляет стандартные возможности.
Например, клавиатура, мышь или веб-камера — это стандартное оборудование, потому что независимо от производителя они делают примерно одно и то же.
Разработчики операционной системы знают про такое оборудование, поэтому могут написать стандартные драйверы, которые подойдут к большинству устройств. Именно поэтому мы можем купить в магазине новую мышь и просто подключить её к компьютеру без установки дополнительных программ — операционная система сама разберётся, что делать.
Но бывает так, что разработчики добавили в устройство нестандартные возможности: переназначение сочетаний клавиш, сделали мышь с несколькими колёсиками или встроенный лазерный дальномер в видеокамеру. В этом случае компьютер не разберётся, как этим всем пользоваться, потому что в стандартных драйверах про это ничего нет.
В таких случаях разработчики устройств пишут свой драйвер, который объяснит компьютеру, как пользоваться всеми возможностями устройства. Этот драйвер нужно будет установить.
Сложное оборудование
Ещё бывает так, что оборудование хоть и стандартное, но сложное, например, видеокарта или принтер. Каждый производитель добавляет свои функции и технологии, которые считает нужными, и чаще всего они не совпадают с другими. Если подключить такое устройство к компьютеру, то компьютер, скорее всего, разберётся, что именно в него воткнули, то как с этим работать — неизвестно.
Здесь тоже нужны драйверы — они идут или в комплекте с устройством на компакт-диске или их качают с официального сайта производителя. Чем сложнее устройство, тем больше вероятность, что без установки дополнительных драйверов оно работать не будет.
Например, если у вас навороченная видеокарта, вы вставляете её в компьютер и сначала видите странную огромную картинку с низким разрешением. Это значит, что компьютер пока не нашёл драйверов на эту карточку и запустил её в «режиме совместимости» — то есть в том режиме, в котором он точно сможет ей управлять. Но возможности видеокарты будут сильно порезаны, пока мы не установим нужные нам драйверы.
Что значит «слетели драйвера»?
Это значит, что компьютер не может найти файлы с инструкциями от какого-то устройства. Так бывает при обновлениях системы, заражении вирусом или просто кто-то случайно мог удалить нужные файлы или папку целиком.
Решение простое: берёте заново драйвер с официального сайта или тот, который шёл в комплекте с устройством, и запускаете программу-установщик заново. А она уже сама разберётся, каких файлов не хватает, и настроит всё заново.
Драйверы нужны только на Windows?
Драйверы нужны на всех компьютерах и для всех операционных систем. Но некоторые операционки идут с кучей драйверов в комплекте, а у других этот набор более скромный.
Общее правило для 2021 года такое: большая часть оборудования, которое нужно для обычной офисной работы, подключится к любому компьютеру без необходимости что-то устанавливать. Операционка сама поймёт, что это за устройство, и, скорее всего, у неё уже будут драйверы.
А вот какое-то более сложное оборудование (например, профессиональная аудиокарта или видеокамера) потребуют установки драйверов от производителя.
В чём проблема с драйверами
Проблема в том, что часто производители не делают новые драйверы для старого оборудования. Например:
Есть диджейский контроллер Numark NS7 — это профессиональное оборудование для диджеев и артистов, оно стоит дорого и нужно примерно 100 тысячам человек на всей планете.
Когда контроллер только вышел, компания Numark выпускала драйвера на все свежие операционные системы, проблем с совместимостью не было.
Потом аппарат сняли с производства, поддержку прекратили. Последняя версия драйверов, которую выпустил Numark, — для Windows 10 и MacOS 10.12 (Sierra). С тех пор у Windows вышло большое обновление до 11, а MacOS обновился раз пять. Причём последние две версии сделаны для процессоров Apple, и уже нет надежды, что Numark обновит драйверы для этой архитектуры.
Так что, если вам достался этот редкий профессиональный прибор, вы вынуждены сидеть на древней MacOS Sierra, которая стремительно перестаёт поддерживаться современным софтом.
Что с этим делать? А ничего ты с этим не сделаешь. Такова жизнь.
Драйвер устройства и с чем его едят
Что такое «драйвер»
Как уважаемый хабрапользователь наверняка знает, «драйвер устройства» — это компьютерная программа управляющая строго определенным типом устройства, подключенным к или входящим в состав любого настольного или переносного компьютера.
Основная задача любого драйвера – это предоставление софтового интерфейса для управления устройством, с помощью которого операционная система и другие компьютерные программы получают доступ к функциям данного устройства, «не зная» как конкретно оно используется и работает.
Обычно драйвер общается с устройством через шину или коммуникационную подсистему, к которой подключено непосредственное устройство. Когда программа вызывает процедуру (очередность операций) драйвера – он направляет команды на само устройство. Как только устройство выполнило процедуру («рутину»), данные посылаются обратно в драйвер и уже оттуда в ОС.
Любой драйвер является зависимым от самого устройства и специфичен для каждой операционной системы. Обычно драйверы предоставляют схему прерывания для обработки асинхронных процедур в интерфейсе, зависимом от времени ее исполнения.
Любая операционная система обладает «картой устройств» (которую мы видим в диспетчере устройств), для каждого из которых необходим специфический драйвер. Исключения составляют лишь центральный процессор и оперативная память, которой управляет непосредственно ОС. Для всего остального нужен драйвер, который переводит команды операционной системы в последовательность прерываний – пресловутый «двоичный код».
Как работает драйвер и для чего он нужен?
Основное назначение драйвера – это упрощение процесса программирования работы с устройством.
Он служит «переводчиком» между хардовым (железным) интерфейсом и приложениями или операционными системами, которые их используют. Разработчики могут писать, с помощью драйверов, высокоуровневые приложения и программы не вдаваясь в подробности низкоуровневого функционала каждого из необходимых устройств в отдельности.
Как уже упоминалось, драйвер специфичен для каждого устройства. Он «понимает» все операции, которые устройство может выполнять, а также протокол, с помощью которого происходит взаимодействие между софтовой и железной частью. И, естественно, управляется операционной системой, в которой выполняет конкретной приложение либо отдельная функция самой ОС («печать с помощью принтера»).
Если вы хотите отформатировать жесткий диск, то, упрощенно, этот процесс выглядит следующим образом и имеет определенную последовательность: (1) сначала ОС отправляет команду в драйвер устройства используя команду, которую понимает и драйвер, и операционная система. (2) После этого драйвер конкретного устройства переводит команду в формат, который понимает уже только устройство. (3) Жесткий диск форматирует себя, возвращает результат драйверу, который уже впоследствии переводит эту команду на «язык» операционной системы и выдает результат её пользователю (4).
Как создается драйвер устройства
Для каждого устройства существует свой строгий порядок выполнения команд, называемой «инструкцией». Не зная инструкцию к устройству, невозможно написать для него драйвер, так как низкоуровневые машинные команды являются двоичным кодом (прерываниями) которые на выходе отправляют в драйвер результат, полученный в ходе выполнения этой самой инструкции.
При создании драйвера для Линукса, вам необходимо знать не только тип шины и ее адрес, но и схематику самого устройства, а также весь набор электрических прерываний, в ходе исполнения которых устройство отдает результат драйверу.
Написание любого драйвера начинается с его «скелета» — то есть самых основных команд вроде «включения/выключения» и заканчивая специфическими для данного устройства параметрами.
И чем драйвер не является
Часто драйвер устройства сравнивается с другими программами, выполняющими роль «посредника» между софтом и/или железом. Для того, чтобы расставить точки над «i», уточняем:
Ну и на правах рекламы – вы всегда знаете, где скачать новейшие драйвера для любых устройств под ОС Windows.
Драйвер — это просто
Многие считают что самому создать драйвер для Windows это что-то на грани фантастики. Но на самом деле это не так. Конечно, разработка драйвера для какого-то навороченного девайса бывает не простой задачей. Но ведь тоже самое можно сказать про создание сложных программ или игр. В разработке простого драйвера нет ничего сложного и я попытаюсь на примерах это показать.
Сперва нам нужно определится в чем мы же будем создавать наш первый драйвер. Поскольку материал ориентирован на новичков, то язык программирования был выбран один из простых, и это не Си или ассемблер, а бейсик. Будем использовать один из диалектов бейсика — PureBasic. Из коробки он не обучен создавать драйверы, но у него удачный набор файлов, используемых для компиляции и небольшое шаманство позволяет добавить эту возможность. Процесс компиляции состоит из нескольких этапов. Если кратко, то он происходит следующим образом: Сначала транслятор «перегоняет» basic-код в ассемблер, который отдается FASM’у (компилятор ассемблера), который создает объектный файл. Далее в дело вступает линкер polink, создающий исполняемый файл. Как компилятор ассемблера, так и линкер могут создавать драйверы и если немного изменить опции компиляции, то получим не исполняемый файл, типа EXE или DLL, а драйвер режима ядра (SYS).
Скачать немного модифицированную бесплатную демо версию PureBasic 4.61 x86 можно на файлопомойке, зеркало.
Если нужно создать драйвер для x64 системы, качайте эту версию, зеркало.
Дистрибутивы имеют небольшие размеры, около 3 МБ каждый. С помощью этой версии можно создавать только драйвера.
Скачиваем, распаковываем и запускаем, кликнув по файлу «PureBasic Portable». При этом запустится IDE и вылезет окошко с сообщением что это демо-версия и списком ограничений. Из него наиболее существенным является ограничение числа строк кода, равное 800, а для создания простых драйверов этого может хватить. Остальные ограничения в нашем случае, не существенны.
Окно IDE с загруженным кодом драйвера показано на скрине.
Компиляция драйвера выполняется через меню «Компилятор» (это если кто не понял).
Теперь определимся что будет делать наш первый драйвер. Обычно при изучении программирования начинают с простых вещей, скажем, выполнения математических операций и вывода результата. Вот пусть наш драйвер делает тоже самое, ведь банальная математика производимая в режиме ядра это очень круто!
Может показаться что это куча бессмысленного кода, но это не так.
У каждого драйвера должна быть точка входа, обычно у нее имя DriverEntry() и выполнена она в виде процедуры или функции. Как видите, в этом драйвере есть такая процедура. Если посмотрите на начало кода, то в первых строках увидите как ей передается управление. В этой процедуре происходит инициализация драйвера. Там же назначается процедура завершения работы драйвера, которая в нашем случае имеет имя UnloadDriver(). Процедуры CreateDispatch() и CloseDispatch() назначаются обработчиками соединения и отсоединения проги из юзермода.
Процедура DeviceIoControl() будет обрабатывать запросы WinAPI функции DeviceIoControl(), являющейся в данном драйвере связью с юзермодом. В конце кода расположена так называемая ДатаСекция (DataSection), в которой находятся имена драйвера, сохраненные в формате юникода (для этого использована одна из фишек ассемблера FASM).
Теперь рассмотрим как драйвер будет взаимодействовать с внешним миром. Это происходит в процедуре DeviceIoControl(). В ней отслеживается одно сообщение, а именно — #IOCTL_MyPlus, которое отправляет юзермодная прога, когда ей нужно сложить два числа в режиме ядра (круто звучит, правда?). Когда такое сообщение получено, то считываем из системного буфера, адрес указателя на структуру со слагаемыми, производим сложение и результат помещаем в системный буфер. Собственно это основная задача нашего первого драйвера.
Видите сколько понадобилось кода для выполнения простейшей математической операции — сложения двух чисел?
А теперь рассмотрим программу, работающую с этим драйвером. Она написана на том же PureBasic.
При старте программы вызывается функция OpenDriver(), которая загружает драйвер. Для упрощения, имя драйвера, имя службы и описание службы заданы одинаковыми — «pbDrPlus». Если загрузка неудачная, то выводится соответствующее сообщение и программа завершает свою работу.
Процедура Plus() осуществляет связь с драйвером. Ей передаются хэндл, доступа к драйверу и слагаемые числа, которые помещаются в структуру и указатель на указатель которой, передается драйверу. Результат сложения чисел будет в переменной «Result».
Далее следует код простейшего GUI калькулятора, скопированного из википедии.
Когда закроют окно, то перед завершением работы программы, закрывается связь с драйвером и производится его деинсталляция из системы.
Результат сложения чисел 8 и 2 на скриншоте.
Исходные коды драйвера и программы, можно найти в папке «Examples», PureBasic на файлопомойке, ссылку на который давал в начале статьи. Там так же найдете примеры драйвера прямого доступа к порам компа и пример работы с памятью ядра.
PS.
Помните, работа в ядре чревата мелкими неожиданностями аля, BSOD (синий экран смерти), поэтому экспериментируйте осторожно и обязательно всё сохраняйте перед запуском драйвера.
За возможную потерю данных, я ответственности не несу!
Драйвер
В общем случае драйвер не обязан взаимодействовать с аппаратными устройствами, он может их только имитировать (например, драйвер принтера, который записывает вывод из программ в файл), предоставлять программные сервисы, не связанные с управлением устройствами (например, /dev/zero в Unix, который только выдаёт нулевые байты), либо не делать ничего (например, /dev/null в Unix и NUL в DOS/Windows).
Содержание
Идеология построения драйверов
Операционная система управляет некоторым «виртуальным устройством», которое понимает стандартный набор команд. Драйвер переводит эти команды в команды, которые понимает непосредственно устройство. Эта идеология называется «абстрагирование от аппаратного обеспечения». Впервые в отечественной вычислительной технике подобный подход появился в серии ЕС ЭВМ, а такого рода управляющие программы назывались канальными программами.
Драйвер состоит из нескольких функций, которые обрабатывают определенные события операционной системы. Обычно это 7 основных событий:
Интеграция драйверов
По мере развития систем, сочетающих в себе на одной плате не только центральные элементы компьютера, но и большинство устройств компьютера в целом, возник вопрос удобства поддержки таких систем, получивших название «аппаратная платформа», или просто «платформа».
Сначала производители платформ поставляли набор отдельных драйверов для операционных систем, собранный на один носитель (обычно компакт-диск), Затем появились установочные пакеты, называвшиеся 4-in-1 и One touch, и позволявшие упростить установку драйверов в систему. При этом, как правило, можно выбрать либо полностью автоматическую установку всех драйверов, либо выбрать вручную нужные. Однако единого, устоявшегося термина долго не было.
Современный термин, описывающий такие наборы драйверов устройств — Board Support Package, или «пакет поддержки платформы». Помимо собственно драйверов, он может, как и прочие установочные пакеты, содержать модули операционной системы и программы.
Сводные таблицы Excel
Поговорим пока о вещах, с Excel не связанных. Прежде чем пытаться что-либо описать па языке формул и цифр, необходимо четко понимать, что именно ты описываешь. Поэтому работу над моделью логичнее всего начинать с ее эскиза на листе бумаге.
Какова бизнес-модель описываемого процесса? Откуда деньги приходят, как используются, как создается добавленная стоимость, как она потом распределяется? Если вы пытаетесь описать процесс, который сами понимаете слабо, обратитесь за помощью к тому, кто его придумал или хорошо понимает.
Типичная ситуация: есть холдинг, в который входит материнская управляющая компания и одна или несколько дочерних производственных (оказывающих услуги и т.д.). Как оценить денежные потоки такого холдинга? Ответ зависит от того, какие бизнес-единицы предполагается делать центрами затрат (скорее всего, это будут именно «дочки»> и какие — центрами прибыли (может быть любая из компаний, входящих в структуру холдинга, но часто прибыль аккумулируют на материнской фирме). Все это надо четко понимать с самого начала, чтобы моделировать деятельность именно такого холдинга, где выручка «дочек» складывается исключительно из продаж в управляющую компанию. При этом ценообразование на этом уровне, скорее всего, построено таким образом, чтобы покрывать затраты каждой из производственных «дочек» и обеспечивать им какую-то минимальную рентабельность деятельности (1-5%).
Как в этом случае строится модель? У производственных компаний есть плановая себестоимость — для пас ото некая данность, менять которую мы не будем. Аргументом (т.е. такими же «синими» цифрами) мы здесь можем
выбрать процент наценки (mark up), который будет обеспечивать заданную небольшую (1-5%) прибыльность. Поскольку товар продается напрямую в материнскую компанию, то выручка производственных предприятий становится автоматически прямой себестоимостью материнской компании (т.е. визуально в модели это цифры зеленого цвета — прямые ссылки).
Выручка материнской компании складывается из продаж третьим лицам, т.е. это уже не внутрихолдинговый оборот, а реальная выручка всего холдинга. Вся разница между выручкой и себестоимостью па уровне материнской компании является львиной долей прибыли всего холдинга (как вы помните, производственные «дочки» получили свою небольшую долю прибыли на продаже товаров в материнскую компанию). Что тут нового и необычного? Ничего, за исключение того, что эту простую структуру надо правильно и прозрачно замоделировать, не смешивая выручку и затраты предприятий холдинга в одну кучу. Подробно о консолидации отчетности мы расскажем позже, и данный пример приведен лишь для иллюстрации понимания бизнес-логики.
Таких бизнес-моделей существует великое множество: кроме холдинговых структур типа «матрешек» и «пирамид» есть различные типы совместных предприятий и т. д. И в каждом случае надо четко представлять движение денег: откуда пришли, как использовались и создали стоимость, куда ушли. И понимать это необходимо до того, как принялись писать формулы в Excel. Теперь опустимся на уровень ниже, где нет никакого холдинга, а есть отдельное предприятие, деятельность которого и предстоит представить на формальном языке формул.
Драйверы, метрики — модные словечки из жаргона современных финансистов. Драйверы — это ключевые факторы, влияющие на некий результат, метрики — индикаторы, или показатели, которые рассматриваются как результат. Если вспомнить начала алгебры, то можно сказать, что драйверы — аргументы функции, метрики — сами эти функции. Очевидно, что такое разбиение весьма условно и зависит от уровня рассмотрения вопроса.
Пример из области финансов предприятия — рентабельность производства есть один из драйверов, а стоимость компании при этом будет являться метрикой. Если опуститься на уровень ниже, то для линейного менеджера, отвечающего за производство, рентабельность будет уже метрикой, а драйверами — множество факторов, которыми такой менеджер управляет (производительность труда, обеспеченность ресурсами и пр.). Если же, наоборот, подняться на уровень выше, то для топ-менеджмента стоимость компании может быть драйвером, а метрикой — показатель более высокого уровня (например, коэффициент обмена акций). Словом, как говорил Эйнштейн, все в мире относительно.
Что будет являться драйвером в каждом конкретном случае? Вопрос не так прост, как кажется. Он вытекает из гораздо более глобального вопроса о том, как создается стоимость. После того, как определились с тем, как деньги в компанию приходят, помогают создать добавленную стоимость и уходят (вспомните формулу Маркса «деньги — товар — деньги»), надо понять, что заставляет их двигаться именно в таких объемах, именно по такому маршруту и именно с такой скоростью. Эти движущие силы и являются драйверами.
Причем каждый из этих факторов (драйвер более низкого уровня) влияет на основные драйверы по-своему. Например, количество денег, потраченных на рекламу, влияет на количество новых абонентов, и влияние это описывается некой зависимостью — например, такой: каждые 10 рублей, потраченные на рекламу в январе, обеспечивают двух новых абонентов в феврале и еще одного— в марте. Тогда мы имеем следующее: потратив в январе 10 рублей (абстрагируемся пока от капитальных затрат, связанных с установкой передающих станций и коммутаторов), мы получаем двух новых абонентов в феврале и одного в марте (т.е. в марте у нас будет уже три абонента). Предполагая, что ARPU па одного абонента составляет, скажем, 100 рублей в месяц, получаем, что выручка за февраль составит 200 рублей, а за март — 300 рублей. Откуда мы взяли 100 рублей? Например, отсюда: наш конкурент в этой же отрасли имеет ARPU в 200 рублей в месяц, по этот конкурент работает давно, у него лояльные и обеспеченные клиенты и пр. Вот маркетологи и оценивают, что в обозримом будущем для расчетов следует брать не более 50% от ARPU конкурента.
Похожая логика рассуждений применяется и в отношении капитальных затрат: скажем, па каждую тысячу абонентов надо поставить один новый коммутатор, а для того, чтобы эту тысячу привлечь, надо сделать зону покрытия не меньше, чем такой-то город, например. Тогда получается, что надо вложиться в ретранслятор и коммутатор уже сейчас, пока у нас нет ни одного абонента. Как только их количество достигнет 1001, надо будет моментально вводить в работу еще один коммутатор и одну станцию. И правильнее сделать это заранее, чтобы с появлением 1001-го абонента система не начала сбоить.
Вот так и работают драйверы, вот так и происходит осознание бизнес-логики. Исходя из этого, строится и модель. Само собой разумеется, что работа по созданию и подробному описанию подобных процессов — дело коллективное, в которое вовлечены не только финансисты, но и маркетологи, инженеры, специалисты по продажам и т.д.
Приведенные выше рассуждения во многом упрощены (мы совершенно не учли количество необходимого персонала, накладные расходы, да и много чего еще). Впрочем, мы и не ставим перед собой цель описать реальный бизнес, и эти рассуждения есть лишь примеры представления логики бизнеса. А логика — основа моделирования. В завершение темы метрик и драйверов приведем простую схему-модель драйверов стоимости производственной компании.
Простая схема-модель драйверов стоимости производственной компании
Совершенно очевидно, что подобное разложение драйверов «по винтикам» возможно не только в таком, но и в любом другом виде: например, по клиентам (количество клиентов в отношении к прибыли на одного клиента), по филиалам (количество филиалов в отношении к прибыли на один филиал) и т.п.
Простое, но чрезвычайно важное правило для понимания того, как создается стоимость в любом бизнесе: она образуется по одному и тому же принципу, а именно — по принципу поиска возможности продать продукт по цене, превышающей стоимость ресурсов, потраченных па его производство, причем продать как можно больше таких продуктов. Все меры, нацеленные на увеличение стоимости, так или иначе сводятся к тому, чтобы привлекать более дешевые ресурсы, максимально возможно повышать цены и увеличивать количество проданных продуктов. Собственно, искусство управления и сводится к решению этой задачи.