Сожалеем, но текст оригинала доступен только зарегистрированным пользователям. |
Глава 17. Драйвера сетевых устройств
hardorsoft
26.10.10 в 01:12
|
|
Мы обсудили символьные и блочные драйвера, теперь рассмотрим сетевые. Сетевой интерфейс является третьим стандартным классом устройств Linux, в этой главе описано его взаимодействие с ядром.
hardorsoft
26.10.10 в 01:13
|
|
Роль сетевых устройств в системе подобна монтируемым блочным устройствам. Блочное устройство регистрирует диски и методы в ядре, затем передает и принимает блоки данных по запросу с помощью функции request. Аналогично и сетевое устройство регистрирует себя в специальных структурах ядра, для обмена пакетами с внешним миром.
hardorsoft
26.10.10 в 01:13
|
|
Имеются несколько важных отличий между монтированием дисков и интерфейсом доставки пакетов. Диск представлен как специальный файл в каталоге /dev, а сетевой интерфейс не имеет подобного представления. Стандартные файловые операции (чтение, запись и т.п.) не производятся над сетевым интерфейсом, также не применим принцип Unix «все является файлом». Таким образом, сетевой интерфейс существует в своем пространстве, и экспортирует собственный набор операций.
hardorsoft
26.10.10 в 01:13
|
|
Хотя вы можете возразить, что приложения используют системные вызовы read и write для сокетов, но эти вызовы взаимодействуют с программным обеспечением по отдельному интерфейсу. Несколько сотен сокетов могут быть мультиплексированы на одном физическом устройстве.
hardorsoft
26.10.10 в 01:13
|
|
Более важное отличие заключается в том, что блочные устройства выполняют какие-либо действия только по запросу ядра, а сетевые устройства принимают пакеты асинхронно из внешней среды. Таким образом, для передачи буфера, ядро запрашивает драйвер блочного устройства, а сетевое устройство само запрашивает ядро для передачи полученного пакета. Интерфейс ядра для сетевых устройств построен на основе этих отличий.
hardorsoft
26.10.10 в 01:14
|
|
Помимо этого сетевые драйверы должны решать административные задачи: установка адреса, изменение параметров передачи, учет трафика и ведение статистики ошибок. API сетевого драйвера отражает эти требования, поэтому мы можем увидеть серьезные отличия интерфейсов.
hardorsoft
26.10.10 в 01:14
|
|
Сетевая подсистема ядра Linux, спроектирована так, чтобы быть независимой от протокола. Это применимо к сетевым протоколам (Internet protocol [IP], IPX или другие) и аппаратному протоколу (Ethernet, token ring и т.д.). При взаимодействии между сетевым драйвером и ядром одновременно может передаваться только 1 пакет. Это позволяет скрывать от драйвера протокол, и от протокола – физическую среду.
hardorsoft
26.10.10 в 01:14
|
|
Эта глава описывает, как сетевые интерфейсы вписываются в ядро Linux, предоставляет примеры сетевого интерфейса, который называется snull. Для упрощения обсуждения, интерфейс использует аппаратный протокол Ethernet и передает IP-пакеты. Знания, приобретенные вами при рассмотрении snull, могут быть легко применены для не IP-протокола. Написание не Ethernet-драйвера немного отличается в деталях, связанных с сетевым протоколом.
hardorsoft
26.10.10 в 01:14
|
|
В этой главе не рассказывается о схеме назначения IP адресов, сетевых протоколов или других основополагающих концепциях сети. Эти понятия не имеют отношения к написанию драйверов, и нельзя удовлетворительно рассмотреть сетевые технологии в объеме менее чем сотня страниц.
hardorsoft
26.10.10 в 01:15
|
|
Перед началом изучения, сделаем заметку по терминологии. В мире сетевых технологий используется термин «октет», что означает группу из 8 бит, что в большинстве случаев является наименьшей единицей данных в сетевых устройствах и протоколах. Термин байт почти никогда не встречается. Для соблюдения стандартов, мы также будем употреблять «октет», когда говорим о сетевых устройствах.
hardorsoft
26.10.10 в 01:15
|
|
Термин «заголовок» так же заслуживает упоминания. Заголовок – это множество байт (прошу прощения – октет), находящихся в пакете, и позволяющих ему пройти через различные сетевые уровни. Когда приложение посылает блок данных через TCP-сокет, сетевая подсистема разделяет эти данные на пакеты, и добавляет в начало каждого пакета TCP-заголовки, описывающие его местоположение в потоке. Затем, перед заголовком TCP, нижние уровни добавляют IP-заголовок, используемый для доставки пакета к месту назначения. Если пакет выходит за пределы среды Ethernet, заголовки Ethernet, интерпретируемые аппаратно, находятся перед остальными. Обычно сетевой драйвер не должен интересоваться заголовками более высоких уровней, они могут многократно усложнить создание заголовков аппаратного уровня.
hardorsoft
26.10.10 в 01:15
|
|