Как именно программа общается с драйвером устройства?


12

Поэтому я не совсем понимаю, как именно мы, программисты, общаемся с устройствами на компьютере. Сейчас я не говорю о больших идеях. Я знаю, что есть драйверы устройств, которые устанавливаются поверх аппаратного обеспечения, чтобы различные программы могли использовать их функции.

А вообще кто конкретно разговаривает с водителями? Записывает ли программист приложение для вызова функции в драйвере? Или программист вызывает функцию через операционную систему, которая затем обрабатывает вызов к драйверу?



1
Немного того и другого, и это зависит от ОС и типа устройства.
whatsisname

Ответы:


12

Там, где задействована операционная система, программы не общаются с драйверами устройств, по крайней мере, напрямую. Программы обращаются к абстракциям, которые, без их ведома, в конечном итоге в конечном итоге обращаются к драйверам устройств посредством одного или нескольких уровней абстракции.

Я собираюсь пропустить сложности современных операционных систем и использовать в качестве примера микрокомпьютерную операционную систему CP / M , разработанную 45 лет назад. CP / M был слоеный пирог с тремя слоями:

Программа. Верхний слой - это программа, которая делает что-то полезное (обработка текста, игра Space Invaders), выполняя вычисления и ввод / вывод. Допустим, в какой-то момент программа хочет отобразить букву «А», чтобы пользователь мог ее увидеть. CP / M предоставляет абстракцию, известную как консоль , где пользователь, взаимодействующий с программой, должен искать. Обычный способ отправить персонажа - несколько инструкций по сборке:

LD C,2   ; Load 2 into register C
LD E,65  ; Load the ASCII code for 'A' into register E
CALL 5   ; Call CP/M's routine for getting things done

(Если вы не знакомы с ними, регистры можно рассматривать как переменные, которые живут в процессоре.) Мы расскажем о том, что такое магические числа 2и 5о чем идет речь, через минуту. Вывод здесь заключается в том, что все, что знает программа, это то, что есть консоль и есть способ записи в нее. Он не знает и не заботится ни о чем, кроме этого. Это первая из двух абстракций, которые CP / M использует для ввода / вывода.

БДОС . Адрес, который 5вызывает программа, является точкой входа для следующего уровня, Базовой Дисковой Операционной Системы или BDOS . BDOS предоставляет целый ряд пронумерованных функций , которые похожи на заказ по номеру из меню ресторана. Вы говорите, что хотите вывод на консоль, загружая Cрегистр с номером функции ( 2для вывода на консоль) и Eрегистр с символом, который нужно отправить. Вывод на консоль - очень простая операция, и BDOS на самом деле не имеет с ней ничего общего, кроме вызова следующего уровня.

BIOS. BIOS, или Basic Input / Output System - это уровень, на котором живет весь аппаратный код. В современных системах это будет считаться набором драйверов устройств. Как и BDOS, BIOS обеспечивает вызовы для стандартного набора очень примитивных операций, которые BDOS использует для своей деятельности. Одна из этих операций называетсяCONOUT, который заботится о том, чтобы получить символ, который программа просила записать двумя слоями выше, на любое аппаратное обеспечение, которое это делает. (В отличие от ПК, в то время вещи не были однородными. У всех систем были разные способы сделать это.) Вывод на консоль - это простой проход для BDOS, но выполнение чего-то более сложного, такого как создание файла на диске, может потребовать многих BIOS вызывает манипулирование носителем. Опять же, поскольку BIOS имеет стандартный абстрактный интерфейс, BDOS всегда знает, как получить то, что хочет, и ему все равно, как это делает BIOS.

Вы, наверное, удивляетесь, почему вместо одной есть две абстракции (программа в BDOS и BDOS в BIOS). Ответ заключается в том, что CP / M и его BDOS могут предоставляться производителям компьютеров в двоичном виде, они будут писать собственный BIOS с драйверами устройств для своего оборудования, соединять их вместе и отправлять как ОС для своих систем. Это было большим делом, потому что BDOS поддерживалась одной организацией и, следовательно, всегда была известной величиной для пользовательских программ, что позволяло запускать одни и те же приложения на очень широком (на тот момент) разнообразном оборудовании. Вот почему существуют операционные системы, и мы не просто пишем программы, которые напрямую работают с оборудованием .

Все, что я здесь описал, относится и к современным операционным системам. Unix, например, абстрагирует все как файлы. Это дает программирует одинаковый набор системных вызовов ( open(), write(), close()и т.д.) , чтобы сообщить , является ли это диск или последовательный порт. Набор решений и абстракций намного сложнее, но все же в конечном итоге он сводится к выбору того, какой код драйвера устройства должен быть запущен на нижнем уровне для выполнения операции.


Я действительно не смотрел на код CP / M раньше (это немного раньше моего времени ... Я использовал компьютеры CP / M, но никогда не писал для них код), но я довольно удивлен использованием call 5здесь. Разве это не rst 8было бы намного эффективнее (оно пожертвовало бы 3 байта памяти по адресу назначения, но сохранило бы 2 при каждом вызове ...)?
Жюль

@Jules: CP / M был разработан для 8080, в котором был только один режим прерывания, в котором устройства прерывания помещали однобайтовую инструкцию (обычно a RST) на шину данных. Я не могу сказать точно, но, возможно, было недостаточно слотов, чтобы обойти потребности всех устройств плюс DDT (который использовал их для создания точек останова) плюс один для входа в BDOS ,
Blrfl

Ах. Это имеет смысл, да. Мой 8-битный опыт разработки ограничен машинами, у которых был только один источник прерываний, поэтому не нужно было так сильно беспокоиться о таких вещах ... :)
Жюль

Быстрый вопрос, как этот процесс больше относится к операционной системе Windows и ядру Windows? Или я должен сделать новый вопрос для этого.
Джейсон

@Jason: В Википедии есть страница, которая описывает архитектуру и дает ответ. Все, что Microsoft производит с 1993 года, использует эту архитектуру. Это почти то же самое, только с большим количеством слоев в торте.
Blrfl

0

Есть куча разных возможностей:

  • Для часто используемых устройств ОС часто включает API, который реализуют драйверы и который адаптирует стандартная библиотека вашего языка. Типичные примеры: файловые системы, принтеры, сеть, MIDI-инструменты.
  • Для более экзотических устройств производитель устройства должен предоставить драйверы, а иногда они также будут включать языковые привязки для популярных языков. Как минимум, будут C-привязки, и почти во всех языках есть способ вызывать C-библиотеки.
  • В некоторой степени между этими двумя случаями простые устройства могут просто использовать универсальное соединение, такое как последовательный порт, и производитель публикует только протокол, который затем можно использовать через универсальный драйвер последовательного порта.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.