Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Драйверы коммуникационных устройств
Программирование коммуникационных устройств в USIХ (сетевые карты, терминалы) основано на так называемом механизме «потоков», который является расширением хорошо известной подсистемы ядра операционной системы USIX SУSТЕМ V - SТRЕАМS. Механизм «потоков» определяет правила программирования драйверов коммуникационных устройств, а также предоставляет набор средств для их разработки. Этот механизм полностью совместим с подсистемой SТRЕАМS на уровне системных вызовов, но имеет некоторые дополнительные возможности. Дадим основные термины и определения. Потоком мы будем называть полностью дуплексный путь данных от пользовательского процесса к драйверу «потока». На рис. 4.4 представлен вид потока, образованного путем связывания модуля «заголовок» и модуля «драйвер». Между этими модулями могут располагаться дополнительные модули обработки данных.
Рис. 4.4. К определению механизма «потоков» Модули в потоке являются основными элементами обработки данных, поступающих как от пользовательского процесса, так и от самого драйвера. Стандартный модуль «заголовок» реализует интерфейс с пользовательским процессом, осуществляя первичную обработку данных, поступающих от драйвера к пользователю. Модуль «драйвер» реализует собственно сам драйвер. Драйвер может быть как драйвером некоторого физического устройства, так и программным (или псевдо-) драйвером. Модули представляют собой наборы процедур для обработки данных, а также структур, описывающих сам модуль и определяющих порядок обработки данных. Каждый модуль функционально не зависит от других компонентов потока, за исключением двух соседних модулей. Взаимодействие между соседними модулями осуществляется путем обмена сообщениями, которые могут содержать как сами данные для обработки, так и некоторую управляющую информацию, определенную межмодульными интерфейсами. Каждый поток содержит по крайней мере два стандартных модуля. Дополнительные модули могут быть добавлены или исключены из потока в любое время пользовательским процессом. Каждый модуль состоит из двух частей, каждая из которых ответственна за обработку данных, передаваемых в двух разных направлениях. Основным элементом каждой из частей модуля является структура «очередь», или просто очередь. Очереди наряду с модулями являются одними из важнейших компонентов «потоков». Очереди содержат указатели на процедуры обработки данных, а также список сообщений, поступивших на обработку в данную очередь. Помимо этого очереди включают различную управляющую информацию для организации обработки поступивших сообщений. Как уже было сказано, сообщения, передаваемые между модулями, содержат как данные для обработки, так и управляющую информацию. Сообщения имеют два буфера с указателями на области памяти, называемыми чанками. Чанки, в свою очередь, включают информацию об областях памяти, предназначенных для хранения данных. Чанки могут быть связаны друг с другом, образуя цепочки. Чанки содержат указатели на область памяти, начало данных, длину данных и другую информацию. Такая организация хранения данных в сообщениях позволяет эффективно (во многих случаях без дополнительных перезаписей) их обрабатывать. Сообщения могут быть сформированы любым модулем потока и переданы в необходимом направлении к соседнему модулю. Большинство системных вызовов, относящихся к подсистеме «потоков» (write(), ioctl(), рutmsg(), ...), приводят к созданию сообщений с соответствующими кодами. При этом, если требуется, происходит перезапись данных из адресного пространства пользовательского процесса в область памяти, указанную буфером соответствующего сообщения. Этот процесс называется буферизацией данных. Затем эти сообщения передаются на обработку нижележащим модулям. С другой стороны, модули «драйверов» со здают сообщения с данными, поступающими от физических устройств, которые они обслуживают, и направляют их в выше находящиеся модули. При поступлении таких сообщений в модуль «заголовка» данные могут быть переписаны в адресное пространство процесса, выдавшего системный запрос на чтение данных (геаd(), getmsg(), ...). Другая часть сообщений используется для передачи данных между модулями и организации межмодульных интерфейсов. Важной характеристикой сообщений является приоритет. Приоритет сообщений определяет порядок их обработки. При поступлении сообщений в модули они обрабатываются в соответствии с их приоритетом. Вначале обрабатываются сообщения с более высоким приоритетом, затем — с более низким. Сообщения могут передаваться не только в пределах одного потока. Сами потоки могут быть объединены в сложные иерархические системы. Эта возможность обеспечивается механизмом мультиплексирования. Любой драйвер «потока» состоит, по крайней мере, из одного потока. Потоки, относящиеся к разным драйверам-мультиплексорам, могут быть связаны друг с другом с помощью специального системного вызова. В этом случае сообщения передаются из одного потока в другой, каждый из которых осуществляет их обработку в соответствии со своим функциональным назначением. Данная возможность используется при создании драйверов сетевых протоколов, имеющих также многоуровневую иерархическую структуру. |
Последнее изменение этой страницы: 2019-04-21; Просмотров: 191; Нарушение авторского права страницы