Линукс смотрит на устройства различая три основные типа устройств. Каждый модуль обычно принадлежит одному из этих типов, а они классифицируются на символьные модули, блочные модули или сетевые модули. Это разделение модулей на различные типы или классы, не является жестким правилом, программист может выбирать строить огромные модули различных типов осуществляя различные драйвера в одном куске кода. Хороший программист, вне всякого сомнения, обычно создает различные модули для каждой новой функциональности которую они осуществляют, потому что разложение уравновешенный и распространенный ключевой элемент.
Вот эти три класса:
Символьные устройства.
Символьное устройство может быть доступно как поток байтов (такие как файлы); символьный драйвер заведует выполнением этой работы. Так драйвер обычно выполняет как минимум открытие, закрытие, чтение и запись системных вызовов. Текстовая консоль (/dev/console) и последовательный порт (/dev/ttySO и друзья) пример символьных устройств, хорошо объясняют абстракцию потока. Символьное устройство доступно через узел файловой системы, такие как /dev/tty1 и /dev/lp0. Есть только одно различие между файлом и символьным устройством; в файле как правило данные перемещаются в двух направлениях: ввод — запись и вывод — чтение, в символьном устройстве как правило направление одно: поток ввода. Тем не менее, вне всякого сомнения, символьные устройства могут перемещать данные в двух направлениях, например, при сооружении граббера, где приложениям будут доступны все купленные изображения посредством утилит mmap или lseek.
Блочные устройства.
Как и символьные устройства, блочные доступны через узел в файловой системе в /dev директории. Блочные устройства это устройства (такие как диски) которые могут содержатся в файловой системе. В большинстве Unix системах, блочные устройства, могут только руководить операциями ввода\вывод которые перемещать один или больше целых блоков, размер которых обычно 512 байтов (или еще больше в зависимости от возможностей в каждом отдельном случае) в длину. Линукс, вместо того чтобы, разрешать приложениям чтение и запись как в случае блочного устройства у символьных он просто пропускает любое количества байтов за раз (время). В результате, блочные и символьные устройства различаются только в направлении куда перемещаются данные под внутренним управлением ядра и также программным интерфейсом ядро\драйвер. Как и символьное устройство, каждое блочное устройство доступно через узел файловой системы и различия между ними в явно пользователь. Блочный драйвер полностью отличается от символьного интерфейсом взаимодействующим с ядром.
Сетевые интерфейсы.
Любое сетевое соединение осуществляется через интерфейс, вот это устройство должно обмениваться данными с другим хостом. Обычно, интерфейс это аппаратное обеспечение, но это может быть и простое программное устройство, как интерфейс мертвой петли. Сетевой интерфейс заведует отправкой и приемом пакетов данных, управляется сетевая подсистема ядром, не зная какими маршрутами перемещаются пакеты. Многие сетевые соединения (особенно их использование TCP) поточно-ориентированы, но сетевые устройства, обычно, предназначенные для передачи и получения пакетов. Сетевой драйвер не знает ничего о текущем соединении, он только руководит пакетами.
Не будучи потоково ориентированным устройством, сетевой интерфейс не проще(?) отображен как узле в файловой системе, как /dev/tty1. Unix обеспечивает доступ к интерфейсу назначая постоянное и уникальное имя для него (на пример eth0), но это имя не соответствует узлу в файловой системе (/dev/tty02). Связь между ядром и драйвером сетевого устройства полностью отличается от того как это осуществляется в символьных и блочных драйверах. Вместо чтения и записи, ядро вызывает функционально связанную передачу пакета.
С другой стороны классификация модулей драйверов противоположность в основном типам устройств. Обычно, несколько типов драйверов работают с добавлением слоев функций поддержки ядра, которые дают типы устройств. На пример, один может переговариваться с универсальной последовательной шиной (USB), модули последовательного порта, SCSI модули и так далее. Каждое USB устройство управляется модулем который работает с подсистемой USB, но устройство представлено в системе как символьное устройство (последовательный порт USB микрофон), блочное устройство (USB картридер), или сетевое устройство (USB сетевой интерфейс).
Другие классы драйверов устройств добавляются в ядро в последний момент, включая FireWire и I2O драйвера. В тоже время они управляют USB и SCSI драйверами, разработчики ядра собрали широкий класс особенностей и экспортировали их в инструментарий драйверов во избежание двойной работы и ошибок, эта упрощает и делает более строгим процесс написания таких драйверов.
В дополнение у драйверов устройств, есть другая функциональность, и аппаратное и программное обеспечение, представлено в системе модулем ядра. Простой пример файловая система. Тип файловой системы определяет как организована информация на блочном устройстве, представляя дерево каталогов и файлов. Так внутри это не драйвера устройств, вот почему не ясно устройство объединено с тем где лежит информация, тип файловой системы вместо программного драйвера, потому что это отображение структуры низкого уровня на более высокий. Файловая система определяет возможную длину названия файла и какая информация храниться в файле внутри директории. Модуль файловой системы должен выполнять вызовы низкого уровня которые открывают доступ к файлам и директориям, отображая названия файлов и директорий (также как и другая информация, такая как режимы доступа) структуры хранимых данных в блоках данных. Так интерфейс фактически полностью зависит от перемещения данных с диска (или с других носителей информации), которые заканчивают на драйвере блочного устройства.
Если вы поймете как строго Unix система зависит от основной файловой системой, вы поймете какая программная концепция жизненно важна для этой операционной системы. Способность декодировать информации в файловой системе на самом низком уровне ядра иерархически и предельно важно, даже если вы пишите блочный драйвер для вашего нового CD-ROMa это бесполезно если вы не сможете запустить ls и cp для данных этих хостов. Линукс поддерживает концепцию модулей файловой системы, этот программный интерфейс объявляет различные операции которые могут быть сделаны узды, директории, файлы и суперблоки файловой системы. Это достаточно необычно для программиста фактически необходимо писать модули файловой системы, потому что официальное ядро уже включает код для большинства типов файловых систем.
Друзья, если вы заметили ошибки, которых, к сожалению, не мало пока, пожалуста, напишите в комментарях. Да перевод еще далек от идеала. С вашей помощью он может стать намного лучше. Спасибо.
ОтветитьУдалить