Linux Kernel (Ядро линукса) (часть 2)


Инициализация драйвера устройства

Регистрация драйвера устройства и его инициализация — абсолютно разные действия. Драйвер регистрируется как можно раньше, чтобы приложения, выполняющиеся в режиме пользователя, могли работать с ним через файлы устройств. В противоположность этому, инициализируется драйвер как можно позднее. Инициализация драйвера фактически означает выделение ему ценных ресурсов системы, которые вследствие этого станут недоступны другим драйверам.

назначение линий IRQ устройствам обычно происходит динамически, непосредственно перед их использованием, потому что одна линия IRQ может потребоваться нескольким устройствам. Другим примером ресурсов, выделяемых в самый последний момент, являются страничные кадры для буферов DMA и сам канал DMA (для старых устройств, не работающих с PCI, таких как привод гибких дисков).
Для гарантии того, что ресурсы будут получены, когда необходимо, но не затребованы лишний раз, когда они уже выделены, драйверы устройств обычно действуют по следующей схеме:
- счетчик обращений отслеживает количество процессов, обратившихся к файлу устройства. Счетчик увеличивается методом open файла устройства и уменьшается методом release5;
- метод open проверяет значение счетчика перед увеличением. Если счетчик равен нулю, драйвер устройства должен выделить ресурсы и включить прерывания и DMA на аппаратном устройстве;
- метод release проверяет значение счетчика после уменьшения. Если счетчик равен нулю, никакие процессы больше не пользуются данным аппаратным устройством. В таком случае метод отключает прерывания и DMA на контроллере ввода/вывода, а затем освобождает выделенные ресурсы.

Мониторинг операций ввода/вывода

Продолжительность операции ввода/вывода часто непредсказуема. Она может зависеть от механических факторов (текущей позиции головки по отношению к блоку, который должен быть передан), от действительно случайных событий (прихода пакета данных на сетевую карту) или от человеческого фактора (от того, когда пользователь нажмет на клавишу или когда он заметит, что бумага застряла в принтере). В любом случае драйвер устройства, который начал операцию ввода/вывода, должен использовать мониторинг, чтобы понять, что операция ввода/вывода завершена, или закончилось время ожидания.
Если операция завершилась, драйвер читает значение регистра состояния интерфейса ввода/вывода, чтобы определить, удачно ли прошла операция ввода/вывода. В том случае, когда истекло время ожидания, драйвер "понимает", что случилась неприятность, поскольку максимальное время, необходимое для выполнения операции, закончилось, но ничего не произошло.

Для мониторинга завершения операции ввода/вывода применяются две методики. Они называются режимом опроса и режимом прерывания.

Предыдущая страница | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 | Следующая страница




Возможно, Вас также заинтересует:

ОС Knoppix - это Linux без про...

ВведениеЕсли вы цените свое время, умеете считать деньги и знаете стоимость информации, то эта книга...

Linux Kernel (Ядро линукса) (ч...

Спин-блокировкаСпин-блокировка необходима в многопроцессорной системе, потому что могут возникнуть...

Linux Kernel (Ядро линукса) (ч...

Копирование при записи В системах Unix первых поколений создание процесса было реализовано довольно...

Linux Kernel (Ядро линукса) (ч...

Буферы блоков и головы буферовУ каждого буфера есть дескриптор голова буфера, имеющий тип buffer...