Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лек СРВ от Анн.doc
Скачиваний:
11
Добавлен:
09.11.2019
Размер:
2.26 Mб
Скачать

15.2 Драйверы коммуникационных устройств

Программирование коммуникационных устройств в USIХ (сетевые карты, терминалы) основано на так называемом меха­низме «потоков», который является расширением хорошо изве­стной подсистемы ядра операционной системы USIX SУSТЕМ V

- SТRЕАМS.

Механизм «потоков» определяет правила программирования драйверов коммуникационных устройств, а также предоставляет набор средств для их разработки. Этот механизм полностью сов­местим с подсистемой SТRЕАМS на уровне системных вызовов, но имеет некоторые дополнительные возможности.

Дадим основные термины и определения.

Потоком мы будем называть полностью дуплексный путь данных от пользовательского процесса к драйверу «потока». На рис. 4.4 представлен вид потока, образованного путем связыва­ния модуля «заголовок» и модуля «драйвер». Между этими моду­лями могут располагаться дополнительные модули обработки данных.

Рис. 4.4. К определению механизма «потоков»

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

Стандартный модуль «заголовок» реализует интерфейс с пользовательским процессом, осуществляя первичную обработку данных, поступающих от драйвера к пользователю. Модуль «драйвер» реализует собственно сам драйвер. Драйвер может быть как драйвером некоторого физического устройства, так и программным (или псевдо-) драйвером.

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

Каждый модуль состоит из двух частей, каждая из которых от­ветственна за обработку данных, передаваемых в двух разных на­правлениях.

Основным элементом каждой из частей модуля является структура «очередь», или просто очередь. Очереди наряду с моду­лями являются одними из важнейших компонентов «потоков». Очереди содержат указатели на процедуры обработки данных, а также список сообщений, поступивших на обработку в данную очередь. Помимо этого очереди включают различную управляю­щую информацию для организации обработки поступивших со­общений. Как уже было сказано, сообщения, передаваемые меж­ду модулями, содержат как данные для обработки, так и управля­ющую информацию. Сообщения имеют два буфера с указателями на области памяти, называемыми чанками. Чанки, в свою оче­редь, включают информацию об областях памяти, предназначен­ных для хранения данных. Чанки могут быть связаны друг с дру­гом, образуя цепочки. Чанки содержат указатели на область па­мяти, начало данных, длину данных и другую информацию. Та­кая организация хранения данных в сообщениях позволяет эф­фективно (во многих случаях без дополнительных перезаписей) их обрабатывать.

Сообщения могут быть сформированы любым модулем пото­ка и переданы в необходимом направлении к соседнему модулю. Большинство системных вызовов, относящихся к подсистеме «потоков» (write(), ioctl(), рutmsg(), ...), приводят к созданию со­общений с соответствующими кодами. При этом, если требуется, происходит перезапись данных из адресного пространства поль­зовательского процесса в область памяти, указанную буфером со­ответствующего сообщения. Этот процесс называется буфериза­цией данных. Затем эти сообщения передаются на обработку ни­жележащим модулям. С другой стороны, модули «драйверов» со здают сообщения с данными, поступающими от физических уст­ройств, которые они обслуживают, и направляют их в выше нахо­дящиеся модули. При поступлении таких сообщений в модуль «заголовка» данные могут быть переписаны в адресное простран­ство процесса, выдавшего системный запрос на чтение данных (геаd(), getmsg(), ...). Другая часть сообщений используется для передачи данных между модулями и организации межмодульных интерфейсов.

Важной характеристикой сообщений является приоритет. Приоритет сообщений определяет порядок их обработки. При поступлении сообщений в модули они обрабатываются в соот­ветствии с их приоритетом. Вначале обрабатываются сообщения с более высоким приоритетом, затем — с более низким.

Сообщения могут передаваться не только в пределах одного потока. Сами потоки могут быть объединены в сложные иерархи­ческие системы. Эта возможность обеспечивается механизмом мультиплексирования. Любой драйвер «потока» состоит, по крайней мере, из одного потока. Потоки, относящиеся к разным драйверам-мультиплексорам, могут быть связаны друг с другом с помощью специального системного вызова. В этом случае сооб­щения передаются из одного потока в другой, каждый из которых осуществляет их обработку в соответствии со своим функцио­нальным назначением. Данная возможность используется при создании драйверов сетевых протоколов, имеющих также много­уровневую иерархическую структуру.

Лекция 16. Файловая система USIX. Средства защиты от несанкционированного доступа.