Типы устройств по принципам функционирования
1. Блочные, хранящие информацию в виде адресуемых блоков фиксированного размера и позволяющие работать с каждым блоком независимо от других блоков ( дисковые устройства).
2. Символьные, принимающие или предоставляющие поток символов без какой-либо структуры (принтеры, модемы, сетевые карты).
Работа с устройством ос семейства Unix:
Для устройства используются специальные файлы типа b блочные устройства и с – символьные устройства. Это так называемые фиктивные файлы не содержат данных, а позволяют задавать драйверы для данных устройств. Каждому устройству соответствует имя этого устройства в каталоге /dev. Распределение номеров устройств между конкретными типами оборудования –это жестко регламентированное связь
$ ls -l /dev/sd*
brw-rw---T 1 root disk 8, 0 Окт 18 11:15 /dev/sda
brw-rw---T 1 root disk 8, 1 Окт 18 11:16 /dev/sda1
.
Каждое такое именованное устройство в Linux однозначно характеризуется двумя (байтовыми: 0...255) номерами
• major — номер драйвера;
• minor — номер устройства.
Значение major (номер драйвера) определяет выбор драйвера, обслуживающего данный специальный файл, а значение minor (номер устройства) передается драйверу в качестве параметра вызова и указывает ему на одно из нескольких однотипных устройств, которыми драйвер может управлять. Например, для дисковых драйверов номер устройства задает не только диск, но и раздел на диске.
Например, следующая команда создает блочный файл для представления третьего раздела на втором диске четвертого SCSI-контроллера:
mknod /dev/dsk/scsi b 32 33
аргумент b определяет создание специального файла для блок-ориентированного драйвера, аргумент 32 определяет номер драйвера, который будет вызываться при открытии устройства /dev/dsk/scsi, а аргумент 33 декодируется самим драйвером (в нем закодированы данные о том, что нужно управлять третьим разделом на втором диске четвертого SCSI-контроллера).
Структура драйвера UNIX
Работа модуля в интерфейсе /dev реализуется через таблицу файловых операций (структуру file_operations), определенную в файле <linux/fs.h> и содержащую указатели на функции драйвера, которые отвечают за выполнение всех операций с устройством.
Драйвер блочного устройства состоит из следующих функций:
• open — выполняет процедуру логического открытия устройства;
• close — выполняет процедуру логического закрытия устройства;
• strategy — читает или записывает блок;
• print — выводит сообщение об ошибке;
• size — возвращает размер раздела, который представляет данное устройство.
Ядро UNIX вызывает нужную функцию драйвера, передавая ей параметры, необходимые для работы. Например, при вызове функции open ей передается номер устройства (minor), режим открытия (для чтения, для записи, для чтения и записи и т. д.), а также указатель на идентификаторы безопасности процесса, открывающего файл.
Драйвер символьного устройства состоит из следующих стандартных функций:
• open — открывает устройство;
• close — закрывает устройство;
• read — читает данные из устройства;
• write — записывает данные в устройство;
• ioctl — управляет вводом-выводом;
• poll — опрашивает устройство для выяснения, не произошло ли некоторое событие.
Часть драйверов служат для предоставления различных услуг ядра прикладным процессам и не имеют непосредственного отношения к аппаратной части компьютера. Такие драйверы называются программными или драйверами псевдоустройств. Можно привести несколько примеров псевдоустройств и соответствующих им программных драйверов:
• /dev/kmem Обеспечивает доступ к виртуальной памяти ядра. Зная виртуальные адреса внутренних структур ядра, процесс может считывать хранящуюся в них информацию. С помощью этого драйвера может, например, быть реализована версия утилиты ps(1), выводящей информацию о состоянии процессов в системе.
• /dev/null Является "нулевым" устройством. При записи в это устройство данные просто удаляются, а при чтении процессу возвращается 0 байтов. Примеры использования /dev/null можно подавлять вывод сообщений об ошибках.
• /dev/zero Обеспечивает заполнение нулями указанного буфера. Этот драйвер часто используется для инициализации области памяти.
Дата добавления: 2021-01-26; просмотров: 465;