Новости
|
11/5 Графический пользовательский интерфейс |
11/5 Графический адаптер |
|
11/5 Шрифты |
11/5 Растровые изображения |
| Функции драйвера устройств |
|
На драйвер устройства возлагается несколько функций. Наиболее очевидная из них — восприятие абстрактных запросов на чтение и запись от независимого от конкретных устройств программного обеспечения, находящегося выше них по уровню, и отслеживание порядка их выполнения. Но на них возлагается также ряд других функций. Например, драйвер должен при необходимости инициализировать устройство. Он также может понадобиться для управления энергопотреблением устройства и для регистрации событий.
Многие драйверы устройств имеют сходную общую структуру. Типичный драйвер начинает свою работу с проверки приемлемости входных параметров. Если они не приемлемы, возвращается сообщение об ошибке. Если с параметрами все в порядке, может понадобиться перевод абстрактных понятий в конкретные. Для драйвера диска это может означать преобразование обычного номера блока в номера головки, дорожки, сектора и цилиндра, относящихся к геометрии диска. Затем драйвер может проверить, используется ли устройство в данный момент. Если оно используется, запрос будет поставлен в очередь для последующей обработки. Если устройство простаивает, проверяется состояние аппаратуры, чтобы определить, может ли запрос быть обработан. Перед началом передачи данных может понадобиться включить устройство или запустить его двигатель. Как только устройство включится и будет готово к работе, им можно будет управлять. Управление устройством означает выдачу в его адрес последовательности команд. Именно драйвер определяет последовательность команд в зависимости от того, что должно быть сделано. После того как драйвер поймет, какие команды он собирается выдать, он начнет записывать их в регистры контроллера устройства. После записи каждой команды в контроллер может потребоваться проверка, принял ли контроллер команду и готов ли он к приему следующей команды. Эта последовательность повторяется до тех пор, пока не будут выданы все команды. Некоторым контроллерам можно указывать на связанный список команд (в памяти) и предписывать самостоятельное чтение и обработку всех этих команд без дальнейшей помощи со стороны операционной системы. После того как команды были выданы, может сложиться одна из двух ситуаций.В большинстве случаев драйвер должен ждать, пока контроллер не сделает в его интересах какую-нибудь работу, поэтому он самоблокируется до тех пор, пока не поступит прерывание на его разблокировку. Но в других случаях операция завершается без задержки, и драйверу не нужно блокироваться. Для последней ситуации можно привести пример прокрутки экрана в символьном режиме, требующей лишь записи нескольких байтов в регистры контроллера. Для этого не нужно никаких механических перемещений, поэтому вся операция может быть завершена за несколько наносекунд. В первом случае заблокированный драйвер будет активизирован прерыванием. Во втором случае он никогда не будет переходить в неактивное состояние. В любом случае, по завершении операции драйвер должен провести проверку на отсутствие ошибок. Если все в порядке, у драйвера могут быть данные (например, только что считанный блок) для передачи программному обеспечению, не зависящему от применяемого устройства. И наконец, он возвращает вызывавшей его программе определенную информацию о состоянии устройства, о наличии или об отсутствии ошибок. Если в очереди были какие-нибудь другие запросы, то теперь один из них может быть выбран и запущен на выполнение. Если запросов в очереди не было, драйвер блокируется в ожидании следующего запроса. Эта упрощенная модель дает весьма приблизительное понятие о реальной работе. Па самом деле программный код из-за множества различных факторов куда сложнее. Прежде всего, устройство ввода-вывода может завершить свою работу и прервать работу драйвера. Прерывание может стать причиной запуска драйвера. Между прочим, оно может вызвать запуск текущего драйвера. К примеру, при обработке сетевым драйвером входящего пакета может прибыть еще один пакет. Следовательно, драйверы должны быть реентерабельными, то есть работающий драйвер еще до завершения первого вызова должен ожидать повторного вызова.
|