Драйвер устройства это контрольная работа
Многие считают что самому создать драйвер для Windows это что-то на грани фантастики. Но на самом деле это не так. Конечно, разработка драйвера для какого-то навороченного девайса бывает не простой задачей. Но ведь тоже самое можно сказать про создание сложных программ или игр. В разработке простого драйвера нет ничего сложного и я попытаюсь на примерах это показать.
Сперва нам нужно определится в чем мы же будем создавать наш первый драйвер. Поскольку материал ориентирован на новичков, то язык программирования был выбран один из простых, и это не Си или ассемблер, а бейсик. Будем использовать один из диалектов бейсика — PureBasic. Из коробки он не обучен создавать драйверы, но у него удачный набор файлов, используемых для компиляции и небольшое шаманство позволяет добавить эту возможность. Процесс компиляции состоит из нескольких этапов. Если кратко, то он происходит следующим образом: Сначала транслятор «перегоняет» basic-код в ассемблер, который отдается FASM'у (компилятор ассемблера), который создает объектный файл. Далее в дело вступает линкер polink, создающий исполняемый файл. Как компилятор ассемблера, так и линкер могут создавать драйверы и если немного изменить опции компиляции, то получим не исполняемый файл, типа EXE или DLL, а драйвер режима ядра (SYS).
Окно IDE с загруженным кодом драйвера показано на скрине.
Компиляция драйвера выполняется через меню «Компилятор» (это если кто не понял).
Теперь определимся что будет делать наш первый драйвер. Обычно при изучении программирования начинают с простых вещей, скажем, выполнения математических операций и вывода результата. Вот пусть наш драйвер делает тоже самое, ведь банальная математика производимая в режиме ядра это очень круто!
Может показаться что это куча бессмысленного кода, но это не так.
У каждого драйвера должна быть точка входа, обычно у нее имя DriverEntry() и выполнена она в виде процедуры или функции. Как видите, в этом драйвере есть такая процедура. Если посмотрите на начало кода, то в первых строках увидите как ей передается управление. В этой процедуре происходит инициализация драйвера. Там же назначается процедура завершения работы драйвера, которая в нашем случае имеет имя UnloadDriver(). Процедуры CreateDispatch() и CloseDispatch() назначаются обработчиками соединения и отсоединения проги из юзермода.
Процедура DeviceIoControl() будет обрабатывать запросы WinAPI функции DeviceIoControl(), являющейся в данном драйвере связью с юзермодом. В конце кода расположена так называемая ДатаСекция (DataSection), в которой находятся имена драйвера, сохраненные в формате юникода (для этого использована одна из фишек ассемблера FASM).
Видите сколько понадобилось кода для выполнения простейшей математической операции — сложения двух чисел?
А теперь рассмотрим программу, работающую с этим драйвером. Она написана на том же PureBasic.
Процедура Plus() осуществляет связь с драйвером. Ей передаются хэндл, доступа к драйверу и слагаемые числа, которые помещаются в структуру и указатель на указатель которой, передается драйверу. Результат сложения чисел будет в переменной «Result».
Далее следует код простейшего GUI калькулятора, скопированного из википедии.
Когда закроют окно, то перед завершением работы программы, закрывается связь с драйвером и производится его деинсталляция из системы.
Результат сложения чисел 8 и 2 на скриншоте.
Исходные коды драйвера и программы, можно найти в папке «Examples», PureBasic на файлопомойке, ссылку на который давал в начале статьи. Там так же найдете примеры драйвера прямого доступа к порам компа и пример работы с памятью ядра.
PS.
Помните, работа в ядре чревата мелкими неожиданностями аля, BSOD (синий экран смерти), поэтому экспериментируйте осторожно и обязательно всё сохраняйте перед запуском драйвера.
Обращаем Ваше внимание, что в соответствии с Федеральным законом N 273-ФЗ «Об образовании в Российской Федерации» в организациях, осуществляющих образовательную деятельность, организовывается обучение и воспитание обучающихся с ОВЗ как совместно с другими обучающимися, так и в отдельных классах или группах.
Рабочие листы и материалы для учителей и воспитателей
Более 2 500 дидактических материалов для школьного и домашнего обучения
Столичный центр образовательных технологий г. Москва
Получите квалификацию учитель математики за 2 месяца
от 3 170 руб. 1900 руб.
Количество часов 300 ч. / 600 ч.
Успеть записаться со скидкой
Форма обучения дистанционная
- Онлайн
формат - Диплом
гособразца - Помощь в трудоустройстве
311 лекций для учителей,
воспитателей и психологов
Получите свидетельство
о просмотре прямо сейчас!
ДРАЙВЕРЫ УСТРОЙСТВ
Драйвер (от английского Driver - водитель) - программа , отвечающая за работу данного устройства или оборудования, которая обеспечивает связь между компьютером и устройством.
Драйверы еще иногда называют «дрова», а любое устройство называют еще «девайсом».
Например, выражение «дрова для камеры» означает «драйверы для камеры», что в свою очередь означает «программы для совместимости работы операционной системы с камерой».
Зачем нужны драйверы?
Появление новых устройств, все более сложных, происходит чрезвычайно быстро и в огромном количестве. Разрабатывают эти устройства различные компании, придерживаясь своих собственных стандартов и взглядов на жизнь. Соответственно, заранее заложить в операционную систему какие-то программы, обеспечивающие совместимость операционной системы со всеми существующими и еще даже не придуманными устройствами, – невозможно.
Вот и получается, что каждый производитель того или иного устройства должен написать драйверы для своих новых устройств, иначе кто же купит такое несовместимое с компьютером устройство? Причем, программисты той компании, где разработано устройство, пишут несколько драйверов, обеспечивающих совместимость нового устройства с разными операционными системами. Тогда одно и то же устройство можно продавать пользователям разных операционных систем.
Как узнать, какие на моем компьютере устройства и драйверы? Для виндовс 7, 8:
Пуск-Панель управления-Диспетчер устройств
Для изменения параметров и обновления драйверов используется Диспетчер устройств . Чтобы открыть Диспетчер устройств (Device Manager) в Windows 7, щелкните кнопку Пуск, в строке Поиска меню Пуск введите «Диспетчер устройств» и щелкните по имени программы.
Другой способ открыть Диспетчер устройств в Windows 7: пройти по маршруту Пуск — Панель управления — Система и безопасность — вкладка «Оборудование и звук» — Устройства и принтеры — Диспетчер устройств:
В Диспетчере устройств выбираем необходимое устройство, кликаем по нему 2 раза левой кнопкой мыши, в выпадающем списке кликаем по нужному устройству правой кнопкой мыши и затем - по кнопке «Свойства».
В результате откроется окно «Свойства», где на вкладке «Драйвер» находим информацию о производителе и драйвере этого устройства
Нужно ли делать обновление драйверов устройств и каким образом?
В приведенном выше окне «Свойства» можно сделать обновление драйверов устройств, а также при неудачном обновлении драйвера сделать откат к старому драйверу.
С другой стороны, если не обновлять некоторые драйверы, то могут перестать нормально функционировать соответствующие этим драйверам устройства. Поэтому приходится пользоваться как кнопкой «Обновить» драйвера на приведенном выше скриншоте, так и кнопкой «Откатить».
Где найти драйверы?
Если коротко отвечать на этот вопрос, то:
драйверы иногда находит операционная система Windows 7 самостоятельно в Интернете и сама устанавливает их,
драйверы можно установить вручную с CD или DVD диска,
либо установить вручную с официального сайта производителя устройства.
А теперь немного подробнее. Обычно с операционной системой поставляются драйверы для устройств, без которых система не сможет функционировать.
Однако для некоторых устройств могут потребоваться специальные драйверы, обычно предоставляемые на лицензионном CD или DVD диске производителем конкретного устройства.
Например, драйвер для стандартной мышки включен в состав операционной системы. Но если приобрести специальную мышку для компьютерных игр с дополнительными кнопками и функциями, то без установки соответствующего драйвера такая мышка полноценно работать не будет. Драйвер обычно при покупке прилагается к мышке на диске. CD или DVD диск с этим драйвером желательно сохранять даже после установки с него соответствующей программы на компьютер во избежание впоследствии недоразумений, например, при переустановке операционной системы.
CD или DVD диск с записанными на него драйверами прилагается также к новому принтеру, к новой веб-камере и т.п. Если такого диска нет, а продавец предлагает Вам поискать необходимый драйвер в Интернете (кстати, это реальный случай), то он что-то мудрит и покупать у него устройство не следует. Поэтому при покупке следует выяснять у продавца наличие диска с драйвером для нового устройства.
Если устройство досталось «бывшим в употреблении», а CD или DVD диск с драйверами отсутствует, то драйвер для такого устройства следует поискать на сайте производителя данного устройства. Для этого в поисковой строке Google или Яндекс следует ввести запрос примерно такого содержания: «официальный сайт Название устройства».
Например, для принтера Hewlett-Packard можно ввести запрос «официальный сайт HP».
Драйверы необходимы не только для внешних устройств типа принтера, веб-камеры или мышки. Драйверы необходимы и для внутренних устройств, например, для материнской (системной) платы, для видеокарты, для звуковой карты. Если видеокарта или звуковая карта встроены в материнскую плату, то драйвера для них не нужны, потому что они встроены в драйвера для материнской платы. Если видеокарта или звуковая карта устанавливаются отдельно, то для каждой карты нужен отдельный диск с драйверами.
Как устанавливать драйверы?
Если есть диск, то вставляем его и ждем, когда он автоматически запустится, загрузит программное обеспечение и на этом установка драйвера завершена.
Если этого по каким-то причинам не произошло, то идем в Пуск – Компьютер, кликаем по вставленному диску, находим и запускаем файл setup.exe.
Если драйвер скачен с официального сайта производителя, то точно также находим и запускаем setup.exe.
Чтобы установить драйвер вручную нужно знать Модель и производителя оборудования.
Иногда нужен серийный номер (платы).
Как правило их выделяют самой жирной крупной надписью на оборудовании, либо на коробке от оборудования, либо на системном блоке (если он покупался в сборе).
Также можно найти драйвера по ID оборудованию.
В Диспетчере устройств выбираем: Устройство- Сведения-Свойства-ИД оборудования.
Что такое ИД оборудования: Identificator (идентификатор) - уникальный номер, как правило в нем зашифрована информация о производителе.
Обращаем Ваше внимание, что в соответствии с Федеральным законом N 273-ФЗ «Об образовании в Российской Федерации» в организациях, осуществляющих образовательную деятельность, организовывается обучение и воспитание обучающихся с ОВЗ как совместно с другими обучающимися, так и в отдельных классах или группах.
Рабочие листы и материалы для учителей и воспитателей
Более 2 500 дидактических материалов для школьного и домашнего обучения
Столичный центр образовательных технологий г. Москва
Получите квалификацию учитель математики за 2 месяца
от 3 170 руб. 1900 руб.
Количество часов 300 ч. / 600 ч.
Успеть записаться со скидкой
Форма обучения дистанционная
- Онлайн
формат - Диплом
гособразца - Помощь в трудоустройстве
311 лекций для учителей,
воспитателей и психологов
Получите свидетельство
о просмотре прямо сейчас!
а) программа, запрашивающая команды и выполняющая их;
б) программа, обеспечивающая управление работой устройств;
в) программа, управляющая файловой системой;
г) программа, обслуживающая диски.
а) Для загрузки графического интерфейса;
б) Для тестирования компьютера и начального этапа загрузки ОС;
в) Для загрузки справочной системы;
г) Не выполняет никаких действий.
а) Текстовый процессор MS WORD;
в) Система автоматизированного проектирования.
- Переведите число 1001111110111,01112 из двоичной системы в восьмеричную
а) Неопасные, опасные, очень опасные;
б) Сетевые, файловые, загрузочные, файлово-загрузочные;
в) Резидентеные и нерезидентные.
- Программа DrWeb относится к категории программ-
- Сложите числа 10111012 и 11101112.
- Переведите число 125 из десятичной в двоичную систему счисления
9. Элементарным объектом, используемым в растровом графическом редакторе, является .
д) палитра цветов
10. В модели RGB в качестве компонентов применяются основные цвета .
а) красный, синий, зеленый
б) красный, голубой, желтый
в) голубой, пурпурный, желтый
г) пурпурный, желтый, черный
а) точках на дюйм
- Какие из графических редакторов являются растровыми?
а) Adobe Photoshop
б) Adobe Illustrator
13. Что такое кегль шрифта?
б) размер высоты буквы
в) начертание буквы
14. Как влияет увеличение масштаба отображения документа на печать документа?
а) требует изменения размеров страницы
б) увеличивает размер шрифта при печати
в) никак не влияет
г) увеличивает размер рисунков при печати
15. Стилем называется:
а) набор параметров форматирования абзаца
б) способ выравнивания текста абзаца
в) набор параметров форматирования, который применяется к тексту, таблицам и спискам, чтобы быстро изменить их внешний вид
г) набор параметров форматирования шрифта
16. В текстовом редакторе основными параметрами при задании шрифта являются.
а) Шрифт, гарнитура, размер, начертание
б) отступ, интервал, выравнивание
в) поля, ориентация
17. Диапазон - это:
а) совокупность клеток, образующих в таблице область прямоугольной формы;
б) все ячейки одной строки;
в) все ячейки одного столбца;
г) множество допустимых значений
18. . Для данной электронной таблицы вычислите результат функции СУММ(А1:В4).
19. Дан фрагмент электронной таблицы. Содержимое ячейки В2 рассчитано по формуле =$А$1*A2. Как будет выглядеть формула, если ее скопировать в нижестоящую ячейку В3?
20. Процесс построения информационных моделей с помощью формальных языков называется:
1. Утилиты – это программы:
а) программа, запрашивающая команды и выполняющая их;
б) программа, обеспечивающая управление работой устройств;
в) программа, управляющая файловой системой;
г) программа, обслуживающая диски.
2. К системам программирования можно отнести программы:
а) Системы управления базами данных;
б) Текстовый процессор MS WORD;
г) Системы автоматизированного проектирования.
3. К программам общего назначения относятся:
а) Текстовый процессор MS WORD;
в) Система автоматизированного проектирования;
г) Adobe Photoshop.
4. Переведите число 10111001,1011001112 из двоичной системы в восьмеричную:
5. Вирусы, активизация которых может привести к потере программ и данных, форматированию винчестера относятся к категории:
в) Очень опасные;
6. Программы, использующие базу данных, содержащую данные о вирусах – это:
7. Сложите числа 1011 ,1 012 и 1 0 1 , 0112.
8. Переведите число 88 из десятичной в двоичную систему счисления.
9. Примитивами в графическом редакторе называют .
а) режим работы графического редактора
б) среду графического редактора
в) операции, выполняемые над операции, выполняемые над файлами, содержащими изображения, созданные в графическом редакторе
г) простейшие фигуры, рисуемые с помощью специальных инструментов графического редактора
10. В какой системе цветопередачи палитра цветов формируется путём наложения голубой, жёлтой, пурпурной и чёрной красок?
11. В процессе сжатия растровых графических изображений по алгоритму JPEG его информационный объем обычно уменьшается в .
б) не изменяется
12. Какие из графических редакторов являются векторными?
а) Adobe Photoshop
б) Adobe Illustrator
13. Ориентация листа бумаги документа MS Word устанавливается
а) в параметрах страницы
б) в параметрах абзаца
в) при задании способа выравнивания строк
г) при вставке номеров страниц
14. В текстовом редакторе при задании параметров страницы устанавливаются…
а) гарнитура, размер, начертание
б) отступ, интервал, выравнивание
в) поля, ориентация, колонтитулы
15. В редакторе MS Word отсутствуют списки:
16. В MS Word невозможно применить форматирование к…
г) номеру страницы
17. Выберите правильные названия столбцов электронной таблицы.
а) А, В, C, … Z, A1, B1, C1…
б) 1, 2, 3, … 9, 10, 11 …
в) А, Б, В, … Я, АА, АБ, АВ,…
г) A, B, C, … Z, AA, AB, AC,…
18. Для данной электронной таблицы вычислите результат функции СРЗНАЧ(А1:А4).
19. В ячейку электронной таблицы введена формула, содержащая абсолютную ссылку. Выберите правильное утверждение:
а) Заданная в формуле абсолютная ссылка при копировании в другие ячейки не изменяется.
б) Заданная в формуле абсолютная ссылка при копировании в другие ячейки изменяется.
в) Заданная в формуле абсолютная ссылка изменяется при копировании в другие ячейки этого же столбца и не изменяется при копировании в другие ячейки этой же строки.
г) Заданная в формуле абсолютная ссылка изменяется при копировании в другие ячейки этой же строки и не изменяется при копировании в другие ячейки этого же столбца.
20. Динамической (описывающей изменение состояния объекта) моделью является:
Как уважаемый хабрапользователь наверняка знает, «драйвер устройства» — это компьютерная программа управляющая строго определенным типом устройства, подключенным к или входящим в состав любого настольного или переносного компьютера.
Основная задача любого драйвера – это предоставление софтового интерфейса для управления устройством, с помощью которого операционная система и другие компьютерные программы получают доступ к функциям данного устройства, «не зная» как конкретно оно используется и работает.
Обычно драйвер общается с устройством через шину или коммуникационную подсистему, к которой подключено непосредственное устройство. Когда программа вызывает процедуру (очередность операций) драйвера – он направляет команды на само устройство. Как только устройство выполнило процедуру («рутину»), данные посылаются обратно в драйвер и уже оттуда в ОС.
Любой драйвер является зависимым от самого устройства и специфичен для каждой операционной системы. Обычно драйверы предоставляют схему прерывания для обработки асинхронных процедур в интерфейсе, зависимом от времени ее исполнения.
Любая операционная система обладает «картой устройств» (которую мы видим в диспетчере устройств), для каждого из которых необходим специфический драйвер. Исключения составляют лишь центральный процессор и оперативная память, которой управляет непосредственно ОС. Для всего остального нужен драйвер, который переводит команды операционной системы в последовательность прерываний – пресловутый «двоичный код».
Как работает драйвер и для чего он нужен?
Основное назначение драйвера – это упрощение процесса программирования работы с устройством.
Он служит «переводчиком» между хардовым (железным) интерфейсом и приложениями или операционными системами, которые их используют. Разработчики могут писать, с помощью драйверов, высокоуровневые приложения и программы не вдаваясь в подробности низкоуровневого функционала каждого из необходимых устройств в отдельности.
Как уже упоминалось, драйвер специфичен для каждого устройства. Он «понимает» все операции, которые устройство может выполнять, а также протокол, с помощью которого происходит взаимодействие между софтовой и железной частью. И, естественно, управляется операционной системой, в которой выполняет конкретной приложение либо отдельная функция самой ОС («печать с помощью принтера»).
Если вы хотите отформатировать жесткий диск, то, упрощенно, этот процесс выглядит следующим образом и имеет определенную последовательность: (1) сначала ОС отправляет команду в драйвер устройства используя команду, которую понимает и драйвер, и операционная система. (2) После этого драйвер конкретного устройства переводит команду в формат, который понимает уже только устройство. (3) Жесткий диск форматирует себя, возвращает результат драйверу, который уже впоследствии переводит эту команду на «язык» операционной системы и выдает результат её пользователю (4).
Как создается драйвер устройства
Для каждого устройства существует свой строгий порядок выполнения команд, называемой «инструкцией». Не зная инструкцию к устройству, невозможно написать для него драйвер, так как низкоуровневые машинные команды являются двоичным кодом (прерываниями) которые на выходе отправляют в драйвер результат, полученный в ходе выполнения этой самой инструкции.
При создании драйвера для Линукса, вам необходимо знать не только тип шины и ее адрес, но и схематику самого устройства, а также весь набор электрических прерываний, в ходе исполнения которых устройство отдает результат драйверу.
Написание любого драйвера начинается с его «скелета» — то есть самых основных команд вроде «включения/выключения» и заканчивая специфическими для данного устройства параметрами.
И чем драйвер не является
Часто драйвер устройства сравнивается с другими программами, выполняющими роль «посредника» между софтом и/или железом. Для того, чтобы расставить точки над «i», уточняем:
- Драйвер не является интерпретатором, так как не исполняется напрямую в софтовом слое приложения или операционной системы.
- Драйвер не является компилятором, так как не переводит команды из одного софтового слоя в другой, такой же.
Ну и на правах рекламы – вы всегда знаете, где скачать новейшие драйвера для любых устройств под ОС Windows.
Опять вернёмся в традиционную область разработки операционных систем (и приложений для микроконтроллеров) — написание драйверов.
Я попробую выделить некоторые общие правила и каноны в этой области. Как всегда — на примере Фантома.
Драйвер — функциональная компонента ОС, ответственная за отношения с определённым подмножеством аппаратуры компьютера.
С лёгкой руки того же Юникса драйвера делятся на блочные и байт-ориентированные. В былые времена классическими примерами были драйвер диска (операции — записать и прочитать сектор диска) и драйвер дисплея (прочитать и записать символ).
В современной реальности, конечно, всё сложнее. Драйвер — типичный инстанс-объект класса, и классов этих до фига и больше. В принципе, интерфейс драйверов пытаются как-то ужать в прокрустово ложе модели read/write, но это самообман. У драйвера сетевой карты есть метод «прочитать MAC-адрес карты» (который, конечно, можно реализовать через properties), а у драйвера USB — целая пачка USB-специфичных операций. Ещё веселее у графических драйверов — какой-нибудь bitblt( startx, starty, destx, desty, xsize, ysize, operation ) — обычное дело.
Цикл жизни драйвера, в целом, может быть описан так:
- Инициализация: драйвер получает ресурсы (но не доступ к своей аппаратуре)
- Поиск аппаратуры: драйвер получает от ядра или находит сам свои аппаратные ресурсы
- Активация — драйвер начинает работу
- Появление/пропадание устройств, если это уместно. См. тот же USB.
- Засыпание/просыпание аппаратуры, если это уместно. В контроллерах часто неиспользуемая аппаратура выключается для экономии.
- Деактивация драйвера — обслуживание запросов прекращается
- Выгрузка драйвера — освобождаются все ресурсы ядра, драйвер не существует.
(Вообще я написал в прошлом году черновик открытой спецификации интерфейса драйвера — см. репозиторий и документ.)
Мне известны три модели построения драйвера:
Драйвер на основе поллинга (циклического опроса) устройства
Такие драйвера применяются только с большого горя или по большой необходимости. Или если это простая встроенная микроконтроллерная система, в которой и есть-то всего два драйвера. Например, конвертор интерфейсов serial port TCP, в котором сеть работает по прерываниям, работу с последовательным портом может, в принципе, выполнять и поллингом. Если не жалко избытка тепла и затрат энергии.
Есть и ещё одна причина: такие драйвера практически неубиваемы. Поэтому, например, в ОС Фантом отладочная выдача ядра в последовательный порт сделана именно так.
В цикле проверяем готовность порта принять байт, передаём байт, закончили упражнение.
Такой драйвер, как нетрудно видеть, пожирает процессор в ожидании готовности устройства. Это можно починить, если скорость работы самого драйвера некритична:
Но, конечно, в целом это никуда не годная (кроме вышеприведённого случая:) модель.
Драйвер на основе прерываний
Общая структура такого драйвера выглядит вот как:
Фактически, такой драйвер порождает для себя псевдо-нить: поток управления, который живёт только на поступлении прерываний от устройства.
Как только драйвер получает очередной запрос на запись, он включает прерывания и «вручную» инициирует отправку в устройство первого байта данных. После чего входящая нить засыпает, ожидая конца передачи. А может и вернуться, если нужна асинхронная работа. Теперь драйвер будет ждать прерывания от устройства. Когда устройство «прожуёт» полученный байт, оно сгенерирует прерывание, при обслуживании которого драйвер или отправит очередной байт (и будет ждать очередного прерывания), или закончит работу, выключит прерывания и «отпустит» ждущую внутри dev_write() нить.
Что забыто
Прежде чем мы перейдём к последней модели драйвера, перечислим вещи, которые я (намеренно) пропустил в предыдущем повествовании.
Обработка ошибок
В нашем псевдокоде никак не проверяется успешность ввода-вывода. Реальное устройство может отказать или сообщить о неисправности носителя. Вынули кабель из порта локалки, на диске случился плохой блок. Драйвер должен обнаружить и обработать.
Таймауты
Устройство может сломаться и просто не ответить на запрос прерыванием, или никогда не выставить бит готовности. Драйвер должен запросить таймерное событие, которое бы вывело его из «ступора» на такой случай.
Смерть запроса
Если окружающая нас ОС это позволяет, то надо быть готовым к тому, что вошедшая в драйвер нить, в рамках которой «пришёл» запрос ввода-вывода, может быть просто убита. Это не должно приводить к фатальным последствиям для драйвера.
Синхронизация
Для простоты я указываю в качестве примитива синхронизации cond. В реальном драйвере это невозможно — cond требует объемлющего mutex в точке синхронизации, а в прерывании какой уж mutex — нельзя! Вот в последней модели, драйвере с собственной нитью, можно применять cond как средство синхронизации нити пользователя и нити драйвера. А вот синхронизация с прерыванием — только spinlock и семафор, причём реализация семафора должна быть готова к возможности активировать (открыть) семафор из прерывания. (В Фантоме это так и есть)
Драйвер на основе нити
От предыдущего он отличается тем, что имеет собственную нить, которая выполняет ввод-вывод.
Преимущество такого драйвера в том, что из нити можно позволить себе куда больше, чем из хендлера прерывания — можно выделять память, управлять таблицами страниц и вообще звать любую функцию ядра. Из прерывания нельзя позволить себе длинные и, тем более, блокирующие операции.
Отметим, что есть третья, промежуточная модель, в которой драйвер не имеет своей нити, а выполняет всё то же самое из нити запроса ввода-вывода. Но, во-первых, см. пункт о том, что её могут убить, во-вторых это жлобство :), а в третьих — не всегда она (нить) такого хочет. Иным бы хотелось асинхронного обслуживания.
Блочный ввод-вывод, сортировка и заборы
Дисковые драйвера обычно имеют на входе очередь запросов — ОС генерирует запросы на ввод-вывод пачками, и все запросы на уровне драйвера асинхронны. При этом хороший драйвер имеет собственную стратегию обслуживания запросов, причём — обслуживания не в порядке поступления.
Действительно, если на обычном дисковом устройстве выполнять запросы в том порядке, в котором они прилетели, головке накопителя придётся совершать хаотичные движения по диску, замедляя ввод-вывод.
Обычно драйвер просто сортирует очередь запросов по номеру блока и обслуживает их так, чтобы головка диска последовательно двигалась от внешней дорожки к внутренней, или наоборот. Это сильно помогает.
Но не всякую пару запросов можно поменять местами. Если файловая система (или её аналог) решила, что ей надо гарантировать целостность данных на диске, она бы очень хотела убедиться в том, что определённая группа запросов завершена. Для этого в очередь запросов вставляется специальный запрос ввода-вывода, который запрещает перемешивать запросы до себя с запросами после себя.
Кроме того, плохая идея переставлять местами запрос на запись блока N и запрос на чтение того же блока. Впрочем, это вопрос договорённостей.
Читайте также: