Как создать файл устройства в linux

Обновлено: 04.07.2024

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

В Linux вся работа с устройствами ведется через специальные файлы, которые обычно расположены в каталоге /dev . Специальные файлы не содержат данных, а просто служат точками, через которые можно обратиться к драйверу соответствующего устройства. У каждого специального файла есть три характеристики – тип устройства (character или block), старший номер устройства (major number) и младший номер (minor number). Для примера, посмотрим на содержимое каталога /dev :

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

Для поддержки работы с устройствами в ядре хранятся две таблицы, одна для списка символьных устройств, другая для списка блочных устройств. Каждая строка таблицы сопоставлена какой-то разновидности устройств соответствующего типа – например, для типа “символьные устройства” можно выделить следующие разновидности: COM-порты, LPT-порты, PS/2-мыши, USB-мыши и т.д., для типа “блочные устройства” можно выделить SCSI-диски, IDE-диски, SCSI-CD-приводы, виртуальные диски которыми представляются RAID-контролеры и т.п.

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

Пример таблицы символьных и устройств

Диспетчер томов LVM

Микшер первой зв. карты

Первая видеокарта NVidia

Пример таблицы блочных устройств

IDE Primary Master

Раздел 1 на IDE Primary Master

Раздел 2 на IDE Primary Master

Раздел 16 на IDE Primary Master

IDE Primary Slave

Раздел 1 на IDE Primary Slave

Раздел 1 на SCSI-диске 1

Раздел 2 на SCSI-диске 1

Раздел 1 на SCSI-диске 4

При попытке обращения к такому специальному файлу ядро переадресует обращение через нужный драйвер на устройство в соответствии с теми данными, которые указаны в таблице устройств, причем конкретная таблица устройств будет выбрана в зависимости от типа устройства, строка из таблицы будет выбрана по major number, и столбец будет выбран по minor number. Если мы посмотрим на примеры наших таблиц, то увидим, что обращение на специальный файл /dev/ttyS1 , который представляет символьное устройство со старшим номером 4 и младшим номером 65 будет адресовано на последовательный порт COM2, а обращение к файлу /dev/hda2 (блочное устройство со старшим номером 3 и младшим номером 2) будет адресовано на 2-й раздел жесткого диска IDE, работающего в режиме primary master.

13.1. Статическая организация каталога /dev

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

Процесс работы со статическим /dev особых проблем не вызывает – системный администратор при необходимости просто создает отсутствующие файлы командой mknod или MAKEDEV . В том случае, когда какая-либо программа обращается к устройству, чей драйвер не загружен (или загружен, но ни одного соответствующего устройства не было обнаружено), операционная система возвращает ошибку при попытке открытия файла такого “неверного” устройства. Ниже приведен пример создания специального файла, соответствующего блочному устройству с мажором 8 и минором 33 и попытка его использования (отметим, что этот специальный файл соответствует разделу на жестком диске, который не существует на тестовой машине, где выполнялись эти команды):

Ядро Linux совместно с некоторыми системными утилитами поддерживает такую интересную возможность, как загрузка драйверов “по требованию”. Реализуется это следующим образом – в момент, когда какая-либо программа пытается открыть специальный файл, не связанный ни с каким драйвером, ядро делает попытку подобрать соответствующий драйвер самостоятельно. Необходимый драйвер для каждого специального файла определяется в файле /etc/modules.conf путем задания специального алиаса (alias) для модуля. Для активизации автоматической загрузки драйвера какого-либо символьного устройства в большинстве случаев достаточно просто записать в /etc/modules.conf строку следующего вида:

Для блочных устройств соответствующая запись слегка меняет свою форму:

X и Y – это major и minor специального файла, попытка открыть который должна активизировать автоматическую загрузку драйвера. Владельцы видеокарт на чипе nVidia могут увидеть этот подход в действии – программа инсталляции драйвера nVidia автоматически прописывает в modules.conf запись для загрузки «по требованию» той части драйвера, которая работает в режиме ядра.

Вместо X или Y может также быть подставлен символ “*” , означающий “любое число”. Например, пусть в modules.conf будет написан следующий текст:

Тогда при обращении к любому символьному устройству с major number равным 81 и которое не ассоциировано ни с каким драйвером, система попытается загрузить драйвер bttv (драйвер TV-тюнера на основе чипа bt848).

Эта возможность обеспечивает Linux возможность плавной загрузки и эффективного использования ресурсов – драйвер не загружается, пока в нем не возникнет необходимости. К сожалению, за простоту этой схемы приходится платить большим количеством специальных файлов в /dev .

13.2. Что такое DevFS

Для того, чтобы избавить администратора от ручного создания специальных файлов и для уменьшения количества файлов в /dev был реализован второй способ организации /dev – динамическое создание специальных файлов процессе загрузки драйверов. Реализовано это было следующим образом:

Ядро монтирует к каталогу /dev специальную файловую систему, называемую devfs – эта файловая система хранится целиком в оперативной памяти и не занимает никакого места на диске. Когда какой-либо драйвер в процессе загрузки или работы обнаруживает обслуживаемое им устройство, он регистрирует это устройство и сообщает о нем драйверу devfs. Драйвер devfs создает специальный файл, который виден прикладным программам и может быть корректно открыт. При выгрузке же драйвер устройства сообщает devfs о том, что соответствующее устройство уже не активно, и драйвер devfs удаляет запись о соответствующем специальном файле из файловой системы devfs.

Файловая система devfs отличается тем, что как правило специальный файл для устройства создается с длинным путем – например, для раздела на scsi-диске путь может выглядеть примерно так: /dev/scsi/host1/bus1/target3/lun4/partition2 .

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

Для того, чтобы организовать более прозрачную структуру каталогов и файлов устройств, используется специальный демон devfsd. Он взаимодействует с драйвером devfs и ядром и в процессе активизации и деактивизации устройств он создает и удаляет символьные ссылки вида /dev/disks/disc0 или /dev/hda1 .

Надо отметить, что схема динамического /dev в некотором смысле близка к той организации каталога /dev , которая используется некоторыми коммерческими UNIX-системами (например, в Solaris), когда есть виртуальная файловая система /devices , и на ее файлы создаются ссылки из /dev , только в Linux роль программы cfgadm играет демон devfsd, и все изменения в состав /dev вносятся автоматически.

С помощью devfsd файловая система devfs также реализует автоматическую загрузку модулей, но в этом случае выбор модуля идет не через комбинацию type/major/minor, а путем указания имени запрошенного файла – когда приложение пытается открыть несуществующий файл устройства, devfs передает имя запрошенного файла демону devfsd, и последний загружает необходимые модули, например такой код в файле modules.devfs :

Приведет к тому, что при попытке обращения к любому файлу, чей полный путь начинается строкой /dev/nvidia , будет произведена попытка загрузить драйвер nvidia.o (для ядра 2.6 nvidia.ko )

В принципе, на сегодняшний день выбор того, каким именно образом необходимо организовывать /dev , остается за пользователем и создателем дистрибутива. Например, в Mandrake Linux используется devfs, а в RedHat, Fedora и SUSE каталог /dev организован статическим образом, а опытные пользователи часто меняют способ организации /dev в зависимости от своих предпочтений.

13.3. Немного о UDEV

В современных дистрибутивах и ядрах поддержка devfs/devfsd отключена, и на смену этой паре пришел специальный демон, называемый udev. В отличие от devsfd, который требовал поддержки со стороны ядра, udev такой поддержки не требует. При инициализации устройства ядро подает сигнал через файловую систему sysfs, и демон udevd, получив сигнал об этом событии, самостоятельно создает соответствующий специальный файл устройства в каталоге /dev в соответствии с правилами, описанными в его конфигурационных файлах. При необходимости в этих файлах можно указать например вызов некоторой внешней программы, создание символьной ссылки и так далее.

Например, если некоторое устройство после подключения перед началом работы требует дополнительной настройки с использованием внешних программ, можно создать соответствующее правило для udev, в котором будет указано какую программу вызвать и какие параметры ей необходимо передать – в частности, это может потребоваться для data-кабелей к некоторым мобильным телефонам Nokia, для устройств которым для корректной работы требуется firmware, или для сохранения или восстановления текущих настроек устройства.

Тем не менее, несмотря на внешние отличия между статической организацией /dev , devfs и udev, следует помнить что это всего лишь способ заполнения каталога /dev , и во всех случаях в конечном итоге на файловой системе создаются те же самые файлы символьных и блочных устройств.

Работа с устройствами в Linux очень сильно отличается от Windows. Главная концепция Linux в том, что все есть файл, не только пользовательские файлы с информацией, но и различные настройки ядра, подключенные устройства, память, сетевые соединения, все это представлено в виде файлов, которые размещены в специальных файловых системах.

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

Файлы устройств Linux

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

Самое важное, что нужно знать об этих файлах - это не драйверы устройств, их лучше рассматривать как интерфейс доступа к драйверам устройств. Приложение отправляет данные в файл устройства, откуда они читаются драйвером устройства и отправляются на физическое устройства. Обратная передача от физических устройств тоже проходит по этому пути через файл устройства. Давайте посмотрим как будет выглядеть поток передачи данных для типичной команды, например, cat:

dboth-dev-dir_0

На схеме приведена схема передачи данных для команды cat /etc/resolv.conf. Вы выполняете команду из терминала, утилита отправляет запрос файла драйверу, который ищет файл на диске и читает его содержимое. Данные передаются через файл устройства, а затем опять же, через файл устройства псевдо-терминала передаются в эмулятор терминала 6, где они будут отображены.

Если мы перенаправим вывод команды в файл, например, cat /etc/resolv.conf > /etc/resolv.bak, то левая часть схемы останется неизменной, а правая сторона будет вести к файлу устройства /dev/sda2. Эти устройства делают очень простым использование стандартных потоков ввода/вывода для доступа к каждому устройству. Простое перенаправление потока данных в файл устройства приведет к записи данных на устройство.

Классификация файлов устройств

Файлы устройств можно классифицировать по меньшей мере двумя способами. Первая и наиболее широкая классификация - на основе потока данных. В устройствах TTY и других символьных устройствах, данные обрабатываются по одному символу или байту за раз. В блочных устройствах, таких как жесткие диски данные передаются блоками, как правило, с размером, кратным 256 байт.

Если вы еще этого не делали, то перейдите в папку /dev/ и посмотрите список находящихся там файлов с помощью команды ls. Вы увидите очень длинный список файлов с их правами доступа, владельцами и группами - это список устройств linux. Обратите внимание на самый первый символ в каждой строке. Он указывает тип устройства. Символом "b" - обозначаются блочные устройства linux (block), а символом "c" - символьные (character).

device

Более точно можно идентифицировать устройства по их младшему и старшему номеру. Например, жесткие диски имеют старший номер 8, что обозначает их как блочные устройства SCSI. Обратите внимание, что все жесткие диски PATA и SATA находятся под управлением SCSI. Раньше использовалась подсистема ATA, но она уже устарела, поэтому диски, которые раньше обозначались как hd[a-z] теперь обозначаются sd[a-z].

Младший номер диска означает раздел устройства, например, номера 8/0 - это весь диск /dev/sda, а 8/1 уже файл первого раздела на диске, 8/6 - /dev/sda6. Файлы TTY именуются немного по-другому, от tty0 до tty63. Все значения старших номеров устройств Linux вы можете найти на официальном сайте ядра.

Работа с устройствами в Linux

Давайте проведем несколько экспериментов, которые помогут вам понять как работают устройства Linux и как ими управлять в этой операционной системе. Большинство дистрибутивов Linux имеют несколько виртуальных консолей, обычно от 1 до 7, которые могут использоваться для входа в сеанс командной оболочки. К этим виртуальным консолям можно получить доступ с помощью сочетаний клавиш Ctrl+Alt+Fn, например, Ctrl+Alt+F1 для первой консоли, Ctrl+Alt+F2 для второй и так далее.

Сейчас нажмите Ctrl+Alt+F2 для перехода во вторую консоль, в некоторых дистрибутивах, кроме запроса логина и пароля, будет выведена информация про активную TTY связанную с этой консолью. Но этой информации может и не быть. В данном случае консоль будет связана с устройством tty2.

Войдите от имени обычного пользователя, затем наберите такую команду, чтобы посмотреть номер устройства tty:

device4

У меня вы видите устройство /dev/pts/0, это виртуальное устройство эмулятора терминала, но если вы будете выполнять задачу в tty2, то отобразиться именно она. Теперь давайте посмотрим список tty устройств с помощью команды ls:

device1

Нас будут интересовать не все устройства, а только первые три. В этих устройствах нет ничего особенного, это обычные устройства символьного типа. Устройство tty2 подключено к консоли 2, устройство tty3 подключено к консоли 3.

Нажмите сочетание клавиш Ctrl+Alt+F3, чтобы переключиться в третью консоль, затем выполните команду:

echo "Hello world" > /dev/tty2

device6

Затем вернитесь во вторую консоль. Здесь вы увидите отправленную строку, Hello World. Все это можно повторить с помощью эмуляторов терминала в графическом интерфейсе, только здесь будут использоваться псевдо-терминальные устройства /dev/pts/*. Теперь попробуем отобразить содержимое файла fstab с помощью cat в другом терминале:

cat /etc/fstab > /dev/tty2

device5

cat test.pdf > /dev/usb/lp0

Каталог /dev/ содержит много интересных файлов устройств. Это интерфейсы доступа к аппаратному обеспечению и вам не нужно думать, что это, жесткий диск или экран. Например, вся оперативная память компьютера доступна в виде устройства /dev/mem. С помощью него вы можете иметь прямой доступ к памяти. Мы можем вывести содержимое памяти в терминал:

dd if=/dev/mem bs=2048 count=100

device2

Утилита dd, в отличие от cat дает больше контроля над процессом и позволяет указать сколько данных нужно прочитать. Но не ко всей памяти вы можете получить доступ. В ядре встроена защита, поэтому обычно, вы можете читать память, только для своего процесса.

Также тут есть файлы, которые несвязанны ни с какими реальными устройствами, это null, zero, random и urandom. Устройство /dev/null может использоваться для перенаправления вывода команд, чтобы данные никуда не выводились. Устройство /dev/zero используется для получения строки, заполненной нулями.

Вы можете использовать ту же команду dd, чтобы попытаться вывести ряд символов с устройства /dev/null:

dd if=/dev/null bs=512 count=500 | od -c

device7

Обратите внимание, что ничего выведено не будет, потому что это устройство пусто, оно только принимает данные и никуда их не сохраняет.

Устройства /dev/random и /dev/urandom позволяют получить случайные комбинации чисел или байт. Вы можете использовать такую команду, чтобы получить случайные байты информации:

device3

Для остановки нажмите Ctrl+C. Устройство urandom позволяет генерировать случайные последовательности независимые от предыдущего числа, в качестве источника энтропии используется нажатия клавиш и движения мыши.

Устройство /dev/zero позволяет получить строку, заполненную нулями. Для проверки используйте такую команду:

dd if=/dev/zero bs=512 count=500 | od -c

device8

Обратите внимание, что восьмеричные нули и нули ASCII это не одно и то же.

Создание устройств в Linux

В прошлом все устройства из каталога /dev создавались во время установки системы, а это означало, что каталог содержал все возможные поддерживаемые устройства, даже если они не использовались. Если вам нужно было создавать или переинициализировать файлы устройств, использовалась утилита mknod. Но для работы с ней вам нужно знать старший и младший номер устройства.

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

Команда mknod все еще есть, но уже существует более новая разработка - makedev. Она предоставляет очень простой интерфейс для создания устройств.

Выводы

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

В Linux есть специальные файлы, которые на самом деле не являются файлами.

Наиболее заметные и наглядные примеры из них находятся в dev папке «файлы», например:

  • /dev/null - игнорирует все, что вы пишете в файл
  • /dev/random - выводит случайные данные вместо содержимого файла
  • /dev/tcp - Отправляет любые данные, которые вы пишете в этот файл по сети

Прежде всего, как называются эти типы «файлов», которые на самом деле являются замаскированным скриптом или двоичным файлом?

Во-вторых, как они созданы? Эти файлы встроены в систему на уровне ядра, или есть способ создать «волшебный файл» самостоятельно (как насчет a /dev/rickroll )?

Я понятия не имел, как пометить этот вопрос, тем более что я не знаю название того, что я ищу. Не стесняйтесь редактировать в любых соответствующих тегах. Кстати, это фундаментальная часть разработки Unix и Unix-подобных операционных систем: (почти) все является файлом, или может быть сделано, чтобы выглядеть как файл. Это «узлы устройства». Однако те, которые вы упомянули - в отличие от дисков, клавиатуры, мыши, аудио-карт и других устройств - являются так называемыми «псевдо-устройствами», поскольку они не являются «настоящими» устройствами и существуют только в ядре. Можно создать новые, написав подходящий драйвер устройства и добавив его в ядро ​​(например, псевдоустройство для мониторинга некоторой активности на компьютере). До того, как / dev-каталог существовал на диске - в наши дни это виртуальная файловая система (типа devfs), созданная ядром. Все файлы, даже «настоящие» файлы, являются программными артефактами. Программное обеспечение за каждое устройство, файл, сокет, специальный файл, или что - то еще не изобретен содержит таблицу функций для обработки open() , read() , close() и т.д. После этого, это до программного обеспечения

/dev/zero является примером «специального файла» - в частности, «узла устройства». Обычно они получают созданные в процессе установки дистрибутива, но вы можете полностью создать их самостоятельно , если вы хотите.

Если вы спросите ls о /dev/zero :

«C» в начале говорит вам, что это «символьное устройство»; другой тип - «блочное устройство» (печатается ls как «b»). Грубо говоря, устройства с произвольным доступом, такие как жесткие диски, как правило, являются блочными устройствами, в то время как последовательные устройства, такие как ленточные накопители или ваша звуковая карта, обычно являются символьными устройствами.

Часть «1, 5» - это «основной номер устройства» и «вспомогательный номер устройства».

Имея эту информацию, мы можем использовать mknod команду для создания нашего собственного узла устройства:

Это создает новый файл с именем foobar , в текущей папке, которая делает точно то же самое , как /dev/zero . (Конечно, вы можете установить для него различные разрешения, если хотите.) Все, что действительно содержит этот «файл», это три элемента выше - тип устройства, основной номер, вспомогательный номер. Вы можете использовать ls для поиска кодов для других устройств и воссоздать их тоже. Когда вам надоест, просто используйте, rm чтобы удалить узлы устройства, которые вы только что создали.

В основном, старший номер сообщает ядру Linux, с каким драйвером устройства следует обращаться, а младший номер указывает драйверу устройства, о каком устройстве вы говорите. (Например, у вас, вероятно, один контроллер SATA, но, возможно, к нему подключено несколько жестких дисков.)

Если вы хотите изобретать новые устройства, которые делают что-то новое . ну, вам нужно отредактировать исходный код для ядра Linux и скомпилировать собственное ядро. Так что давайте не будем этого делать! :-) Но вы можете добавить файлы устройств, которые дублируют те, которые вы уже получили, просто отлично. Автоматизированная система , как Udev в основном просто наблюдая за событиями устройства и вызова mknod / rm автоматически. Ничего более волшебного, чем это.

Есть еще другие виды специальных файлов:

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

Симлинк это специальный файл. (Но жесткой ссылки нет.) Вы можете создавать символические ссылки с помощью ln -s команды. (Поищите справочную страницу для этого.)

Есть также вещь, называемая «именованный канал» или «FIFO» (очередь «первым пришел - первым вышел»). Вы можете создать один с mkfifo . FIFO - это магический файл, который может быть открыт сразу двумя программами - одно чтение, одно письмо. Когда это происходит, это работает как обычная оболочка. Но вы можете запустить каждую программу отдельно .

Файл, который не является «специальным» в любом случае, называется «обычным файлом». Вы иногда увидите упоминание об этом в документации Unix. Вот что это значит; файл, который не является узлом устройства, символической ссылкой или чем-то еще. Просто обычный, каждый день файл без магических свойств.

Эта статья будет понимать процесс создания классов устройства Linux и файлов устройств с уровня кода.

  • Классы оборудования являются виртуальными, и нет непосредственно соответствующего физического объекта, просто чтобы лучше управлять каталогом и файлами, сгенерированными одним и тем же классовыми устройствами для пользовательского пространства.
  • Весь процесс включает в себя файловую систему SYSFS, которая должна отображать файловую систему, созданную моделью драйвера устройства Linux. Он основан на RAMFS, а Sysfs в корневом каталоге Linux установлен.
  • Структура данных структуры KObject является основой SYSFS Kobject представляет каталог в sysfs;
  • Драйвер Struct, структурирующее устройство, получено от KObject, поэтому они соответствуют каталогу в SYSFS.
  • Strus, driver_attribute, class_attribut и другие структуры данных атрибута в структуре данных представляют собой нормальный файл в SYSFS.
  • Struct ksset - это контейнер структуры kobject, а struct ksset может стать отцом одного и того же классовой структуры kobject, и он также имеет члены KOBJECT, поэтому он может быть членом ребенка предыдущего КСОТА в другом KObject.
  • В драйвере устройств CDEV_ADD регистрирует структуру CDEV_ADD и номер устройства к системе, чтобы автоматически генерировать файлы драйверов, Class_Create и Device_Create необходимы для вызова MDEV (встроенный Linux busybox) через механизм UVent, чтобы позвонить в Mknod, создайте файл устройства.
  • Конечно, эти два интерфейса также могут быть вызваны, затем вручную через командную строку mknod для создания файлов устройств.


  1. struct kobject
  2. const char *name; //название
  3. struct list_head entry; // KObject Linked List
  4. struct kobject *parent; // KObject Вы принадлежите к ключем
  5. struct kset *kset; // принадлежит ключевому
  6. struct kobj_type *ktype; // Атрибут операционный интерфейс
  7. >;
  8. struct kset
  9. struct list_head list; // Управление KOBJECT, принадлежащим ключевому
  10. struct kobject kobj; / / / / Может быть подкаталогом предыдущего родительского ключевого
  11. const struct kset_uevent_ops *uevent_ops; // интерфейс обработки UVENT
  12. >;
  • Предположим, что KOBJECT A представляет собой каталог, KSET B представляет собой общий родительский каталог нескольких каталогов (включая а). A.kset = b; A.parent=B.kobj.

led_class = class_cr eate(THIS_MODULE, "led_class");

__class_create(owner, name, &__key);

CLS-> имя = имя; // имя класса оборудования

CLS-> владелец = владелец; // amaten модуль

retval = __class_register(cls, key);

struct class_private *cp;

// Назначьте класс LED_CLASS к соответствующему классу

kobject_set_name(&cp->class_subsys.kobj, "%s", cls->name);

// Заполните родительский класс: KET: KESFS / класс Class_Subsys.

// plip интерфейс операции свойства класса

CP-> // Вы можете найти класс через CP

CLS-> P = CP; // Вы можете найти CP через класс

// Создать каталог классов устройства LED_CLASS

/ / Создать файл свойств класса в каталоге LED_CLASS

2, продолжайте расширять kset_register

// Родитель - class_kset.kobj, т.е. / sysfs / класс, соответствующий каталогу

// Создать каталог классов устройства LED _Class

/ / Интерфейс - это интерфейс файловой системы SYSFS, а представитель создает каталог и больше не расширяется.

3. Вышеупомянутый Class_kset создан в Class_init.

class_kset = kset_create_and_add("class", NULL, NULL);

Третий отрывок - это нулевой, который представляет собой каталог классов у по умолчанию / SYSFS / CREATES.

1. После использования интерфейса Class_Create, чтобы создать файл каталога класса устройств, используйте интерфейс устройства_create для создания определенного каталога устройства и файла свойств устройства.

led_device = device_create(led_class, NULL, led_devno, NULL, "led");

Dev-> devt = devt; // номер устройства

Dev-> // Класс оборудования LED_CLASS

Dev-> родитель = родитель; // Отец оборудование, вот ноль

Kobject_set_name_vargs (& dev-> kobj, fmt, args) // Имя устройства "Светодиод"

2, продолжайте расширять Device_register (DEV)

Dev-> kobj.kset = devabs_kset; // устройство принадлежит / sysfs / устройства /

Device_private_init (dev) // deivalization Device_private

Dev_set_name (dev, "% s", dev-> init_name); // назначение dev-> имя kobject
Setup_parent (dev, родитель); // установить контакт kobject для устройства и родительского оборудования
// kobject_add Создает каталог устройств LED IN / SYSFS / DEFICE / Directory, KObject_Add - аналогичный интерфейс, аналогичный KSET_REGISTER, но первое для KObject, последних для KSET.
kobject_add(&dev->kobj, dev->kobj.parent, NULL);
kobject_add_varg
kobj->parent = parent;
kobject_add_internal(kobj)
Create_dir (kobj); // создать каталог устройств
/ / // Создать файл свойств UVENT в каталоге / sysfs / defication / светодиодный, который вы только что создали, имя «UEVENT»
device_create_file(dev, &uevent_attr);
/ / // Создать файл атрибута Dev в каталоге / sysfs / defication / leed, который вы только что создали, имя «dev», содержимое этого файла свойств - это номер устройства
device_create_file(dev, &devt_attr);
// Установите символическое соединение светодиодного устройства в каталоге / SYSFS / CLASS / LED_CLASS / CLACK / LED_CLASC, чтобы файл свойств dev можно увидеть для открытия каталога / sysfs / class / led_class / led / seed / чтение номера устройства.
device_add_class_symlinks(dev);
// Создайте файл свойств устройства, включая атрибуты, принадлежащие устройства и атрибуты_Group.
device_add_attrs()
Bus_add_device (dev) // Добавление устройства в автобус
/ / Запустите механизм UEVENT и создайте файл устройства, позвонив MDEV.
kobject_uevent(&dev->kobj, KOBJ_ADD);
// Сопоставьте драйвер устройства и шина, совпадение успешно называется интерфейсом зонда привода, больше не расширяется

3, расширить kobject_uevent (& dev-> kobj, kobj_add);

4, вышеупомянутые устройства_kset создаются в устройствах_инита
devices_kset = kset_create_and_add("devices",
&device_uevent_ops, NULL);

// Третий вызов NULL, представляет каталог устройств по умолчанию / SYSFS / созданию

5, приведенный выше атрибут устройства

static struct device_attribute devt_attr =
__ATTR(dev,
S_IRUGO, show_dev, NULL);

static ssize_t show_dev(struct device *dev, struct device_attribute
*attr,char *buf)return
Print_dev_t (buf, dev-> devt); / / т.е. номер устройства устройства

6, Устройства устройства устройства ответа на операцию события UVent

static const struct kset_uevent_ops device_uevent_ops = .filter =dev_uevent_filter,
.name = dev_uevent_name,
.uevent = dev_uevent,

7. Call_usermodeHelper - это интерфейс для вызова пользовательской пространственной программы из пространства ядра.

8. Для встроенных систем Busybox использует MDEV, Система начинает скрипт RCS Используйте команду » echo /sbin/mdev > /proc/sys/kernel/hotplug ”。

Array UEVENT_HELPER [] - это содержимое файла чтения / proc / sys / jernel / hotplug, т.е. “/sbin/mdev” .

  • Вышеуказанное описание создается в файловой системе SYSFS и Приложения Доступ к файлам устройств необходимо создавать под / dev / directory. Эта работа завершена MDEV 。
  • Принцип MDEV: объясните правила для именованного файла устройства именования, определенные файлом /etc/mdev.conf, и создавать файлы устройств, основанные на требованиях переменных среды в соответствии с этим правилом.
  • MDEV.conf указывается пользовательским слоем и поэтому более гибким.
  • Ниже приведен сценарий конфигурации MDEV, и в конечном итоге мы расследуем MKnod для создания файлов устройств в / dev / directory.
  1. Busybox/util-linux/mdev.c
  2. int mdev_main( int argc UNUSED_PARAM, char **argv)
  3. xchdir( "/dev" );
  4. if (argv[1] && strcmp(argv[1], "-s" ) / / / / / Система запускает MDEV
  5. -S будет выполнять только эту ветку
  6. else
  7. action= getenv( "ACTION" );
  8. env_path= getenv( "DEVPATH" );
  9. G.subsystem= getenv( "SUBSYSTEM" );
  10. snprintf(temp,PATH_MAX, "/sys%s" , env_path); // / SYSFS / DEFICE / LED каталог
  11. make_device(temp, /*delete:*/ 0);
  12. strcpy(dev_maj_min, "/dev" ); / / Прочитайте файл атрибута Dev, чтобы получить номер устройства
  13. open_read_close(path,dev_maj_min + 1, 64);
  14. ….
  15. mknod(node_name,rule->mode | type, makedev(major, minor))

Интеллектуальная рекомендация


Краткое описание общих функций MPI

содержание 1, основная функция MPI 2, точка-точка функция связи 3, коллективная функция связи 1, основная функция MPI MPI_Init(&argc, &argv) Информировать системы MPI для выполнения всех необх.

Примечание 9: EL выражение


JVM память

концепция Виртуальная машина JVM управляет собственной памятью, которая разделяет память во многие блоки, наиболее распространенной для памяти стека и памяти кучи. 1 структура виртуальной машины JVM H.

Проблема сетевого запроса на Android 9.0

вЗапустите Android 9 (API Уровень 28) или вышеНа устройстве операционной системы Android, чтобы обеспечить безопасность пользовательских данных и устройств, использование по умолчанию для зашифрованно.


Учебная запись по Webpack (3) В статье рассказывается о создании webpack4.0.

предисловие Для изучения веб-пакета автор также предпринял много обходных путей. Есть много вещей, которые я хочу знать, но я не могу их найти. Автор поможет вам быстро начать работу. Цель этой статьи.

Читайте также: