Из Википедии, бесплатной энциклопедии
  (Перенаправлено с узла устройства )
Перейти к навигации Перейти к поиску

В Unix-подобных операционных системах , файл устройства или специальный файл является интерфейс к драйверу , который появляется в файловой системе , как будто это обычный файл . Также есть специальные файлы в DOS , OS / 2 и Windows . Эти специальные файлы позволяют прикладной программе взаимодействовать с устройством, используя его драйвер устройства через стандартные системные вызовы ввода / вывода . Использование стандартных системных вызовов упрощает многие задачи программирования и приводит к согласованным механизмам ввода-вывода в пользовательском пространстве независимо от характеристик и функций устройства.

Файлы устройств обычно предоставляют простые интерфейсы для стандартных устройств (таких как принтеры и последовательные порты), но также могут использоваться для доступа к определенным уникальным ресурсам на этих устройствах, например, к разделам диска . Кроме того, файлы устройств полезны для доступа к системным ресурсам , которые не имеют связи с каким-либо фактическим устройством, таким как приемники данных и генераторы случайных чисел .

В Unix-подобных операционных системах существует два основных типа файлов устройств, известных как специальные символьные файлы и специальные файлы блоков . Разница между ними заключается в том, сколько данных читается и записывается операционной системой и оборудованием. Их вместе можно назвать специальными файлами устройств, в отличие от именованных каналов , которые не подключены к устройству, но также не являются обычными файлами.

MS-DOS заимствовала концепцию специальных файлов из Unix, но переименовала их в устройства . [1] Поскольку ранние версии MS-DOS не поддерживает каталог иерархии, устройства отличались от обычных файлов, сделав их имена зарезервированных слов , выбранных для степени совместимости с CP / M .

В некоторых Unix-подобных системах большинство файлов устройств управляются как часть виртуальной файловой системы, традиционно монтируемой /dev, возможно, связанной с управляющим демоном, который отслеживает добавление и удаление оборудования во время выполнения, внося соответствующие изменения в файловую систему устройства, если это необходимо. не выполняется автоматически ядром и, возможно, вызывает сценарии в системе или в пользовательском пространстве для обработки особых потребностей устройства. Реализации FreeBSD и DragonFly BSD назвали файловую систему виртуального устройства devfs и соответствующий демон devd . Linux в основном использует реализацию пользовательского пространства, известную как udev., но есть много вариантов. Дарвин и операционные системы, такие как macOS на его основе, имеют файловую систему устройства исключительно на основе ядра.

В системах Unix, которые поддерживают изоляцию процессов chroot , таких как контейнеры Solaris , обычно для каждой среды chroot требуется своя собственная /dev; эти точки монтирования будут видны в ОС хоста на различных узлах глобального дерева файловой системы. Ограничивая узлы устройств, помещаемые в экземпляры chroot /dev, аппаратная изоляция может быть обеспечена с помощью среды chroot (программа не может вмешиваться в аппаратное обеспечение, которое она не может ни видеть, ни называть - даже более сильная форма контроля доступа, чем разрешения файловой системы Unix ).

Конкурс аппаратных устройств, управляемый MS-DOS (см. TSR ), путем монопольного открытия каждого файла устройства. Приложение, пытающееся получить доступ к уже используемому устройству, обнаружит, что не может открыть узел файла устройства. В Unix и Linux реализована разнообразная семантика драйверов устройств в отношении одновременного доступа . [2]

Unix и Unix-подобные системы [ править ]

Упрощенная структура ядра Linux. Файловые системы реализованы как часть подсистемы ввода-вывода.

Узлы устройств соответствуют ресурсам, которые ядро операционной системы уже выделило. Unix идентифицирует эти ресурсы по основному номеру и незначительное числом , [3] и сохраняются как часть структуры узла . Назначение этих номеров происходит уникальным образом в разных операционных системах и на разных компьютерных платформах . Как правило, старший номер идентифицирует драйвер устройства, а младший номер идентифицирует конкретное устройство (возможно, из многих), которым управляет драйвер: [4] в этом случае система может передать младший номер драйверу. Однако при наличии динамического распределения номеров, это может быть не так (например, во FreeBSD 5 и выше).

Как и в случае с другими специальными типами файлов, компьютерная система обращается к узлам устройств с помощью стандартных системных вызовов и обрабатывает их как обычные компьютерные файлы. Существуют два стандартных типа файлов устройств; к сожалению, их имена довольно противоречивы по историческим причинам, и в результате объяснения разницы между ними часто неверны.

Устройства персонажей [ править ]

Специальные символьные файлы или символьные устройства обеспечивают небуферизованный прямой доступ к аппаратному устройству. Они не обязательно позволяют программам читать или писать отдельные символы за раз; это зависит от рассматриваемого устройства. Например, символьное устройство для жесткого диска обычно требует, чтобы все операции чтения и записи были выровнены по границам блока и, безусловно, не позволяет читать ни одного байта.

Символьные устройства иногда называют необработанными устройствами, чтобы избежать путаницы, связанной с тем фактом, что символьное устройство для части аппаратного обеспечения на основе блоков обычно требует программ для чтения и записи выровненных блоков.

Заблокировать устройства [ править ]

Специальные файлы или блочные устройства обеспечивают буферизованный доступ к аппаратным устройствам и обеспечивают некоторую абстракцию от их особенностей. [5]В отличие от символьных устройств, блочные устройства всегда позволяют программисту читать или записывать блок любого размера (включая отдельные символы / байты) и любое выравнивание. Обратной стороной является то, что поскольку блочные устройства буферизуются, программист не знает, сколько времени пройдет, прежде чем записанные данные будут переданы из буферов ядра на фактическое устройство, или, действительно, в каком порядке две отдельные записи поступят на физическое устройство. Кроме того, если одно и то же оборудование предоставляет как символьные, так и блочные устройства, существует риск повреждения данных из-за того, что клиенты, использующие символьное устройство, не знают об изменениях, сделанных в буферах блочного устройства.

Большинство систем создают как блочные, так и символьные устройства для представления оборудования, такого как жесткие диски. В частности, FreeBSD и Linux этого не делают; в первом удалена поддержка блочных устройств [6], а во втором создаются только блочные устройства. В Linux, чтобы получить символьное устройство для диска, нужно использовать «необработанный» драйвер, хотя можно получить тот же эффект, что и при открытии символьного устройства, открыв блочное устройство с помощью специфичного для Linux O_DIRECTфлага.

Псевдоустройства [ править ]

Узлы устройств в Unix-подобных системах не обязательно должны соответствовать физическим устройствам . Узлы, не имеющие такого соответствия, образуют группу псевдоустройств . Они предоставляют различные функции, выполняемые операционной системой. Некоторые из наиболее часто используемых (символьных) псевдоустройств включают:

  • / dev / null  - принимает и отбрасывает весь записанный в него ввод; обеспечиваетиндикацию конца файла при чтении из.
  • / dev / zero  - принимает и отбрасывает весь записанный в него ввод; производит непрерывный поток нулевых символов (байтов с нулевым значением) в качестве вывода при чтении из.
  • / dev / full  - создает непрерывный поток нулевых символов (байтов с нулевым значением) в качестве вывода при чтении из и генерирует ошибку ENOSPC («диск заполнен») при попытке записи в него.
  • / dev / random  - производит байты, генерируемые криптографически безопасным генератором псевдослучайных чисел ядра. Его точное поведение зависит от реализации, и иногда также предоставляются такие варианты, как / dev / urandom или / dev / arandom .

Кроме того, специфичные для BSD псевдоустройства с интерфейсом ioctl также могут включать:

  • / dev / pf  - позволяет процессам пользовательского уровня управлять PF черезинтерфейс ioctl .
  • / dev / bio  - обеспечиваетдоступ ioctl к устройствам, которые иначе не обнаруживаются какузлы / dev , используемые bioctl для реализацииуправления RAID в OpenBSD и NetBSD .
  • / dev / sysmon  - используется инфраструктурой NetBSD sysmon_envsys для мониторинга оборудования , доступ к которому осуществляется в пользовательском пространстве через proplib (3) с помощью утилиты envstat . [7]

Создание узла [ править ]

Узлы создаются системным вызовом mknod . Программа командной строки для создания узлов также называется mknod. Узлы могут быть перемещены или удалены обычными системными вызовами файловой системы ( переименование , разъединение связи ) и командами ( mv , rm ).

Некоторые версии Unix включают сценарий с именем makedev или MAKEDEV для создания всех необходимых устройств в каталоге /dev. Это имеет смысл только в системах, устройствам которых статически назначены основные номера (например, посредством жесткого кодирования в их модуле ядра).

Соглашения об именах [ редактировать ]

Следующие префиксы используются для имен некоторых устройств в /devиерархии, чтобы идентифицировать тип устройства:

  • lp: строчные принтеры (сравните lp )
  • pt: псевдотерминалы (виртуальные терминалы)
  • tty: терминалы

Некоторые дополнительные префиксы стали широко использоваться в некоторых операционных системах:

  • fb: буфер кадра
  • fd: (платформа) гибкие диски , хотя эта же аббревиатура также часто используется для обозначения файлового дескриптора.
  • hd: («Классический») драйвер IDE (ранее использовался для жестких дисков ATA, приводов оптических дисков ATAPI и т. Д.)
    • hda: главное устройство на первом канале ATA (обычно обозначается старшим номером 3 и второстепенным номером 0)
    • hdb: ведомое устройство на первом канале ATA
    • hdc: ведущее устройство на втором канале ATA
    • hdd: ведомое устройство на втором канале ATA
  • parport, pp: параллельные порты
  • Драйвер NVMe
    • nvme0: контроллер устройства первого зарегистрированного устройства (символьное устройство)
    • nvme0n1: первое зарегистрированное пространство имен устройства (блочное устройство)
    • nvme0n1p1: первое зарегистрированное устройство первое пространство имен первый раздел (блочное устройство)
  • Драйвер MMC
    • mmcblk: драйвер накопителя для MMC Media ( SD- карты, чипы eMMC на ноутбуках и т. д.)
      • mmcblk0: первое зарегистрированное устройство
      • mmcblk0p1: первый раздел зарегистрированного устройства
  • Драйвер SCSI , также используемый libATA (современный драйвер PATA / SATA ), USB , IEEE 1394 и т. Д.
    • sd: драйвер запоминающего устройства
      • sda: первое зарегистрированное устройство
      • sdb, sdcи т.д .: вторые, третьи и т.д. зарегистрированные устройства
    • ses: Драйвер корпуса
    • sg: общий уровень SCSI
    • sr: Драйвер «ROM» (дисководы оптических дисков, ориентированные на данные; scd - это просто вторичный псевдоним)
    • st: драйвер магнитной ленты
  • tty: терминалы
    • ttyS: (платформа) драйвер последовательного порта
    • ttyUSB: USB последовательные преобразователи, модемы и т. Д.

Канонический список префиксов, используемых в Linux, можно найти в списке устройств Linux, официальном реестре выделенных номеров устройств и /devузлов каталога для операционной системы Linux. [8]

Для большинства устройств за этим префиксом следует номер, однозначно идентифицирующий конкретное устройство. Для жестких дисков для обозначения устройств используется буква, за которой следует номер для обозначения разделов . Таким образом, файловая система может «знать» область на диске /dev/sda3, например, или «видеть» сеанс сетевого терминала, связанный с ней /dev/pts/14.

На дисках, использующих типичную главную загрузочную запись ПК , номера устройств первичного и дополнительного расширенного раздела пронумерованы от 1 до 4, а индексы любых логических разделов - от 5 и выше, независимо от структуры предыдущих разделов (их родительский расширенный раздел не обязательно должен быть четвертым разделом на диске, и при этом не обязательно должны существовать все четыре основных раздела).

Имена устройств обычно не переносятся между различными вариантами Unix-подобных систем, например, в некоторых системах BSD устройства IDE называются / dev / wd0, / dev / wd1 и т. Д.

devfs [ править ]

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

Хранить эти специальные файлы в физически реализованной файловой системе (например, на жестком диске) неудобно, и, поскольку в любом случае требуется помощь ядра, возникла идея создания логической файловой системы специального назначения , которая физически не хранится.

Кроме того, определение того, когда устройства готовы к появлению, не совсем тривиально. Подход «devfs» заключается в том, что драйвер устройства запрашивает создание и удаление записей «devfs», связанных с устройствами, которые он включает и отключает.

Реализации [ править ]

ПК DOS, TOS, OS / 2 и Windows [ править ]

Файл устройства - это зарезервированное ключевое слово, используемое в системах ПК DOS , TOS , OS / 2 и Windows для разрешения доступа к определенным портам и устройствам.

MS-DOS заимствовала концепцию специальных файлов из Unix, но переименовала их в устройства . [1] Поскольку ранние версии MS-DOS не поддерживали иерархию каталогов , устройства отличались от обычных файлов, делая их имена зарезервированными словами . Это означает, что определенные имена файлов были зарезервированы для устройств и не должны использоваться для именования новых файлов или каталогов. [13] Зарезервированные имена сами по себе были выбраны , чтобы быть совместимыми с «специальными файлами» обработкой из PIPкоманды в CP / M . В DOS было два типа устройств: блочные устройства (используемые для дисководов) и символьные устройства (обычно все другие устройства, включая устройства COM и PRN). [14]

DOS использует файлы устройств для доступа к принтерам и портам. Большинство версий Windows также содержат эту поддержку, что может вызвать путаницу при попытке создать файлы и папки с определенными именами, поскольку они не могут иметь эти имена. [15] Версии 2.x MS-DOS предоставляют параметр AVAILDEV CONFIG.SYS, который, если установлен в FALSE, делает эти специальные имена активными только с префиксом \DEV\, что позволяет создавать обычные файлы с этими именами. [16]

GEMDOS , DOS-подобная часть Atari TOS , поддерживала имена устройств, аналогичные DOS, но в отличие от DOS требовался завершающий символ ":" (в DOS это необязательно), чтобы идентифицировать их как устройства, а не обычные имена файлов (таким образом, " CON: "будет работать как в DOS, так и в TOS, но" CON "будет называть обычный файл в TOS, но консольное устройство в DOS). В MiNT и MagiC специальный UNIX-подобный вид унифицированной файловой системы, доступ к которому осуществляется через букву диска «U:», также помещает файлы устройств в «U: \ DEV».

Используя перенаправление оболочки и каналы, данные можно отправлять на устройство или получать от него. Например, если ввести следующее, файл будет отправлен c:\data.txtна принтер:

ТИП c: \ data.txt> PRN

PIPE, MAILSLOT и MUP - это другие стандартные устройства Windows. [22]

IOCS [ править ]

8-битная операционная система карманных компьютеров Sharp, таких как PC-E500 , PC-E500S и т. Д., Состоит из интерпретатора BASIC , системы управления файлами (FCS), подобной DOS 2, реализующей элементарную 12-битную файловую систему, подобную FAT , и BIOS-подобная система управления вводом / выводом (IOCS), реализующая ряд стандартных драйверов символьных и блочных устройств, а также специальные файловые устройства, включая STDO: / SCRN: (дисплей), STDI: / KYBD: (клавиатура), COM: ( последовательный ввод / вывод), STDL: / PRN: (принтер), CAS: (кассета), E: / F: / G: (файл памяти), S1: / S2: / S3: (карта памяти), X: / Y: (гибкий диск), SYSTM: (система) и NIL: (функция). [23]

См. Также [ править ]

  • devfsd
  • sysfs
  • Размер блока
  • Блокировка
  • Буфер
  • Файловая система
  • Аппаратная абстракция
  • Сеть хранения данных
  • Пользовательское пространство
  • Типы файлов Unix
  • udev

Ссылки [ править ]

  1. ^ a b «Windows для рабочих групп: как VSHARE.386 управляет общим доступом к файлам» . Support.microsoft.com. 1999-09-22 . Проверено 22 января 2014 .
  2. Корбет, Джонатан; Кроа-Хартман, Грег; Рубини, Алессандро (2005). «Контроль доступа к файлу устройства». Драйверы устройств Linux, 3-е издание . О'Рейли . Проверено 28 апреля 2017 . Следующим шагом после открытия устройства с одним открытием является разрешение одному пользователю открывать устройство в нескольких процессах, но разрешить только одному пользователю открывать устройство одновременно.
  3. ^ Керниган, Брайан В .; Пайк, Роб (1984). Среда программирования UNIX . Прентис-Холл . п. 66 . ISBN 0-13-937681-X.
  4. ^ Нил Браун (2010-10-27). «Призраки прошлого Unix: исторический поиск шаблонов проектирования» . LWN.net . Проверено 30 марта 2014 .
  5. ^ «IEEE Std 1003.1, издание 2013 г.» . Проверено 24 апреля 2014 .
  6. ^ "Справочник по архитектуре FreeBSD" . Проверено 7 марта 2013 .
  7. ^ "usr.sbin / envstat / envstat.c" . Перекрестная ссылка BSD . NetBSD . Выложите резюме .
  8. ^ Linux Assigned Names and Numbers Authority (2009-04-06). «Linux выделенные устройства (версия 2.6+)» . Ядро Linux (Документация / devices.txt) . Архивировано из оригинала на 2016-04-24 . Проверено 8 июня 2013 .
  9. ^ "Ядро драйвера: devtmpfs - поддерживаемый ядром tmpfs-based / dev" . LWN . Проверено 10 августа 2009 .
  10. ^ "Журнал изменений Project Black" . Проверено 15 мая 2016 .
  11. ^ "Диск U: в MagiC" . 2016-03-28. Архивировано 15 января 2017 года . Проверено 9 января 2017 .
  12. ^ "FreeMiNT-Portal - mint.doc" . 2000-04-27. Архивировано 15 января 2017 года . Проверено 9 января 2017 .
  13. ^ «Избегайте создания имен файлов Macintosh, которые являются именами устройств NT» . Support.microsoft.com. 2006-11-01 . Проверено 22 января 2014 .
  14. ^ "атрибуты устройства" . Stanislavs.org . Проверено 22 января 2014 .
  15. ^ a b «Имена драйверов устройств MS-DOS не могут использоваться в качестве имен файлов» . Редакция 2.0. Microsoft . 2003-05-12. KB74496, Q74496. Архивировано из оригинала на 2012-07-21.
  16. ^ «Недокументированные команды» . 4dos.info . Кевтроника. 2002-04-12 . Проверено 16 мая 2014 .
  17. ^ a b c d e f IBM Operating System / 2 Технический справочник - Семейство программирования (PDF) . 1 (1-е изд.). IBM . Сентябрь 1987 [1986]. Архивировано (PDF) из оригинала 03.01.2017.
  18. ^ a b c d e f g h i Hewlett-Packard - Справочное техническое руководство - Portable PLUS (1-е изд.). Корваллис, Орегон, США: Компания Hewlett-Packard , подразделение портативных компьютеров. Август 1985. 45559-90001 . Проверено 27 ноября 2016 .
  19. ^ a b c d e f g h i Hewlett-Packard - Справочное техническое руководство - Portable PLUS (PDF) (2-е изд.). Подразделение портативных компьютеров, Корваллис, Орегон, США: Компания Hewlett-Packard . Декабрь 1986 г. [август 1985 г.]. 45559-90006. Архивировано (PDF) из оригинала 28 ноября 2016 года . Проверено 27 ноября 2016 .
  20. ^ a b c Пол, Матиас Р. (1997-10-02). "Caldera OpenDOS 7.01 / 7.02 Обновление Alpha 3 IBMBIO.COM README.TXT" . Архивировано из оригинала на 2003-10-04 . Проверено 29 марта 2009 . [1]
  21. ^ Патерсон, Тим ; Microsoft (19 декабря 2013 г.) [1983]. «Microsoft DOS V1.1 и V2.0: /msdos/v20source/SKELIO.TXT, /msdos/v20source/HRDDRV.ASM» . Музей истории компьютеров , Microsoft . Проверено 25 марта 2014 .(Примечание: хотя издатели утверждают, что это будут MS-DOS 1.1 и 2.0, на самом деле это SCP MS-DOS 1.25 и смесь Altos MS-DOS 2.11 и TeleVideo PC DOS 2.11 .)
  22. ^ "REG: CurrentControlSet Entries ЧАСТЬ 2: SessionManager" . Support.microsoft.com. 2006-11-01 . Проверено 22 января 2014 .
  23. ^ Техническое справочное руководство PC-E500 (PDF) . Корпорация Sharp , Группа информационных систем, Подразделение персонального оборудования. Март 1990 г. с. 17. Архивировано (PDF) из оригинала на 2017-03-14 . Проверено 14 марта 2017 .

Дальнейшее чтение [ править ]

  • Филип Стрек (24 сентября 2002). "devfs для управления и администрирования" . Linux Journal .
  • Дэниел Роббинс (2001-10-01). «Часть 4: Введение в devfs» . Общие темы: Расширенное руководство разработчика файловой системы . IBM.
  • Дэниел Роббинс (2001-10-01). «Часть 5: Настройка devfs» . Общие темы: Расширенное руководство разработчика файловой системы . IBM.
  • Дэниел Роббинс (2001-10-01). «Часть 6: Реализация devfs (с использованием оболочки init)» . Общие темы: Расширенное руководство разработчика файловой системы . IBM.
  • Дуг Гилберт (22 января 2001 г.). «DEVFS и SCSI» .
  • «3.3. Имена устройств в devfs» . Подсистема Linux 2.4 SCSI HOWTO: Глава 3. Имена и адреса . Проект документации Linux .
  • «Руководство по файловой системе устройства» . Документация Gentoo Linux . Gentoo Foundation, Inc. архивации от оригинала на 2008-05-21 . Проверено 19 июня 2008 .
  • Марк Эллис (23 сентября 2003 г.). «Как использовать автозагрузку модулей ядра с помощью devfs и devfsd» . Linux с нуля подсказки .
  • Боевой Даум (18 сентября 2003 г.). «Как создать простую команду mk_initrd, которая хорошо работает с LFS и devfs» . Linux с нуля подсказки .
  • Йерун Куманс (19 апреля 2003 г.). «Как настроить devfs с вашей текущей конфигурацией LFS с помощью devfsd. Как вы можете использовать devfs с нуля» . Linux с нуля подсказки .
  • Тушар Тередесай (05.03.2003). «Использование devfs и devfsd» . Linux с нуля подсказки .