Это конкретная реализация файловой системы устройства в Unix-подобных операционных системах, используемая для представления файлов устройства. Базовый механизм реализации может различаться в зависимости от ОС.
Хранить эти специальные файлы в физически реализованной файловой системе, такой как жесткий диск, неудобно, и, поскольку для этого в любом случае требуется помощь ядра, возникла идея специальной логической файловой системы, которая не хранится физически.
Определить, когда устройства готовы появиться, непросто. Подход devfs заключается в том, что драйвер устройства запрашивает создание и удаление записей devfs, связанных с устройствами, которые он включает и отключает.
Unix и Unix-подобные системы

Узлы устройств соответствуют ресурсам, которые ядро операционной системы уже выделило. Unix идентифицирует эти ресурсы по старшему и младшему номеру , оба из которых хранятся как часть структуры узла . Присвоение этих номеров происходит однозначно в разных операционных системах и на разных компьютерных платформах . Как правило, старший номер идентифицирует драйвер устройства, а младший номер идентифицирует конкретное устройство (возможно, из многих), которым управляет драйвер: в этом случае система может передать младший номер драйверу. Однако при наличии динамического распределения номеров это может быть не так (например, во FreeBSD 5 и выше).
Как и в случае с другими специальными типами файлов, компьютерная система обращается к узлам устройств с помощью стандартных системных вызовов и обрабатывает их как обычные компьютерные файлы. Существует два стандартных типа файлов устройств; к сожалению, их имена довольно нелогичны по историческим причинам, и в результате объяснения разницы между ними часто неверны.
Символьные устройства
Специальные символьные файлы или символьные устройства обеспечивают небуферизованный прямой доступ к аппаратному устройству. Они не обязательно позволяют программам читать или записывать отдельные символы за раз; это зависит от рассматриваемого устройства. Например, символьное устройство для жесткого диска обычно требует, чтобы все операции чтения и записи были выровнены по границам блоков, и наверняка не позволяет читать ни одного байта.
Символьные устройства иногда называют необработанными устройствами , чтобы избежать путаницы, связанной с тем фактом, что символьное устройство для части блочного оборудования обычно требует, чтобы программы читали и записывали выровненные блоки.
Блокировать устройства
Блокировка специальных файлов или блочных устройств обеспечивает буферизованный доступ к аппаратным устройствам и некоторую абстракцию от их особенностей. В отличие от символьных устройств, блочные устройства всегда позволяют программисту читать или записывать блок любого размера (включая отдельные символы/байты) и любого выравнивания. Обратной стороной является то, что, поскольку блочные устройства буферизуются, программист не знает, сколько времени пройдет, прежде чем записанные данные будут переданы из буферов ядра на фактическое устройство, или в каком порядке две отдельные записи поступят на физическое устройство. Кроме того, если одно и то же оборудование предоставляет как символьные, так и блочные устройства, существует риск повреждения данных из-за того, что клиенты, использующие символьное устройство, не знают об изменениях, внесенных в буферы блочного устройства.
Большинство систем создают как блочные, так и символьные устройства для представления оборудования, такого как жесткие диски. В частности, FreeBSD и Linux этого не делают; в первом удалена поддержка блочных устройств, а во втором создаются только блочные устройства. В Linux, чтобы получить символьное устройство для диска, необходимо использовать «необработанный» драйвер, хотя можно получить тот же эффект, что и при открытии символьного устройства, открыв блочное устройство с помощью специфичного для Linux флага O_DIRECT .
Псевдо-устройства
Узлы устройств в Unix-подобных системах не обязательно должны соответствовать физическим устройствам . Узлы, у которых отсутствует это соответствие, образуют группу псевдоустройств . Они предоставляют различные функции, выполняемые операционной системой. Некоторые из наиболее часто используемых (символьных) псевдоустройств включают в себя:
- /dev/null – принимает и отбрасывает весь записанный на него ввод; обеспечивает индикацию конца файла при чтении.
- /dev/zero – принимает и отбрасывает весь записанный на него ввод; создает непрерывный поток нулевых символов (байтов с нулевым значением) в качестве вывода при чтении.
- /dev/full — создает непрерывный поток нулевых символов (байтов с нулевым значением) в качестве вывода при чтении и генерирует ошибку ENOSPC («диск заполнен») при попытке записи на него.
- /dev/random — производит байты, генерируемые криптографически безопасным генератором псевдослучайных чисел ядра. Его точное поведение зависит от реализации, иногда также предоставляютсятакие варианты, как /dev/urandom или /dev/arandom .
- /dev/stdin , /dev/stdout , /dev/stderr — доступ к стандартным потокам процесса .
- /dev/fd/ n – обращается к файловому дескриптору процесса n .
Кроме того, псевдоустройства, специфичные для BSD, с интерфейсом ioctl также могут включать в себя:
- /dev/pf — позволяет процессам пользовательского пространства управлять PF через интерфейс ioctl .
- /dev/bio — обеспечивает доступ ioctl к устройствам, которые иначе не были бы найдены как узлы /dev , используемые bioctl для реализации управления RAID в OpenBSD и NetBSD .
- /dev/sysmon — используется платформой envsys NetBSD для мониторинга оборудования , доступ к которому осуществляется в пользовательском пространстве через proplib(3) утилиты envstat . [8]
Создание узла
Узлы создаются системным вызовом mknod . Программа командной строки для создания узлов также называется mknod . Узлы можно перемещать или удалять с помощью обычных системных вызовов файловой системы ( rename , unlink ) и команд ( mv , rm ).
Некоторые версии Unix включают сценарий makedev или MAKEDEV для создания всех необходимых устройств в каталоге /dev . Это имеет смысл только в системах, устройствам которых статически присвоены старшие номера (например, посредством жесткого кодирования их в модуле ядра).
Некоторые другие системы Unix, такие как FreeBSD, используют управление узлами устройств на основе ядра только через devfs и не поддерживают создание узлов вручную. Системный вызов mknod(2) и команда mknod(8) существуют для обеспечения совместимости с POSIX, но созданные вручную узлы устройств вне devfs вообще не будут работать.
Имена устройств
Следующие префиксы используются в именах некоторых устройств в иерархии /dev для идентификации типа устройства:
- lp : линейные принтеры (сравните lp )
- pt : псевдотерминалы
- tty : терминалы
Некоторые дополнительные префиксы стали широко использоваться в некоторых операционных системах:
- fb : буфер кадра
- fd : (платформа) дискеты , хотя эта же аббревиатура также часто используется для обозначения файлового дескриптора.
- hd : («классический») драйвер IDE (ранее использовался для жестких дисков ATA , приводов оптических дисков ATAPI и т. д.)
- hda : главное устройство на первом канале ATA (обычно обозначается старшим номером 3 и младшим номером 0).
- hdb : ведомое устройство на первом канале ATA.
- hdc : главное устройство на втором канале ATA.
- hdd : ведомое устройство на втором канале ATA.
- parport , pp : параллельные порты
- mem : Основная память (символьное устройство)
- nbd : Сетевое блочное устройство : Абстракция, представляющая блочные устройства, монтируемые через сеть (или из образов с помощью qemu-nbd).
- Драйвер NVMe :
- nvme0 : контроллер устройства первого зарегистрированного устройства (символьное устройство)
- nvme0n1 : первое пространство имен первого зарегистрированного устройства (блочное устройство)
- nvme0n1p1 : первый раздел первого зарегистрированного пространства имен первого зарегистрированного устройства (блочное устройство)
- Драйвер ММС :
- Драйвер SCSI , также используемый libATA (современный драйвер PATA / SATA ), USB , IEEE 1394 и т. д.:
- sd : драйвер запоминающего устройства (блочное устройство)
- sda : первое зарегистрированное устройство
- sdb, sdc и т. д.: второе, третье и т. д. зарегистрированные устройства
- ses : Драйвер корпуса
- sg : общий уровень SCSI.
- sr : драйвер «ROM» (приводы оптических дисков, ориентированные на данные; scd — это всего лишь вторичный псевдоним)
- st : драйвер магнитной ленты
- sd : драйвер запоминающего устройства (блочное устройство)
- tty : терминалы
- ttyS : (платформа) драйвер последовательного порта
- ttyUSB : последовательные преобразователи USB, модемы и т. д.
Канонический список префиксов, используемых в Linux, можно найти в списке устройств Linux , официальном реестре выделенных номеров устройств и узлов каталога /dev для операционной системы Linux. [10]
Для большинства устройств за этим префиксом следует номер, однозначно идентифицирующий конкретное устройство. Для жестких дисков буква используется для идентификации устройств, а за ней следует номер для обозначения разделов . Таким образом, файловая система может, например, «знать» область на диске как /dev/sda3 или «видеть» сеанс сетевого терминала, связанный с /dev/pts/14 .
На дисках, использующих типичную главную загрузочную запись ПК, номера устройств основного и дополнительного расширенного раздела пронумерованы от 1 до 4, а индексы любых логических разделов — от 5 и выше, независимо от структуры предыдущих разделов (их родительских расширенных разделов). раздел не обязательно должен быть четвертым разделом на диске, и не обязательно должны существовать все четыре основных раздела).
Имена устройств обычно не переносятся между различными вариантами Unix-подобных систем, например, в некоторых системах BSD устройства IDE называются /dev/wd0 , /dev/wd1 и т. д.
Источник https://en.wikipedia.org/wiki/Device_file#devfs
Добавить комментарий