Linux create proc entry
Библиотека сайта rus-linux.net
На главную -> MyLDP -> Электронные книги по ОС Linux
Цилюрик О.И. Модули ядра Linux | ||
Назад | Внешние интерфейсы модуля | Вперед |
Интерфейс /proc
Интерфейс к файловым именам /proc ( procfs ) и более поздний интерфейс к именам /sys ( sysfs ) рассматривается как канал передачи диагностической (из) и управляющей (в) информации для модуля. Такой способ взаимодействия с модулем может полностью заменить средства вызова ioctl() для устройств, который устаревший и считается опасным. В настоящее время сложилась тенденция многие управляющие функции переносить их /proc в /sys , отображения путевых имён модулем в эти две подсистемы по своему назначению и возможностям являются очень подобными. Содержимое имён-псевдофайлов в обоих системах является только текстовым отображением некоторых внутренних данных ядра. Но нужно иметь в виду и ряд отличий между ними:
- Файловая система /proc является общей, «родовой» принадлежностью всех UNIX систем (Free/Open/Net BSD, Solaris, QNX, MINIX 3, . ), её наличие и общие принципы использования оговариваются стандартом POSIX 2; а файловая система /sys является сугубо Linux «изоретением» и используется только этой системой.
- Так сложилось по традиции, что немногочисленные диагностические файлы в /proc содержат зачастую большие таблицы текстовой информации, в то время, как в /sys создаётся много больше по числу имён, но каждое из них даёт только информацию об ограниченном значении, часто соответствующем одной элементарной переменной языка C: int, long, .
— это 58 строк текста. А вот образец информации (выбранной достаточно наугад) системы /sys :
Различия в форматном представлении информации, часто используемой в той или иной файловой системе, породили заблуждение (мне приходилось не раз это слышать), что интерфейс в /proc создаётся только для чтения, а интерфейс /sys для чтения и записи. Это совершенно неверно, оба интерфейса допускают и чтение и запись.
Теперь, когда мы кратно пробежались на качественном уровне по свойствам интерфейсов, можно перейти к примерам кода модулей, реализующих первый из этих интерфейсов. Интерфейс /proc рассматривается на примерах из архива proc.tgz . Мы будем собирать несколько однотипных модулей, поэтому общую часть определений снесём в отдельный файл:
Файл сборки общий для всех модулей :
Основную работу по созданию и уничтожению имени в /proc выполняет пара вызовов (
):
В результате создаётся изрядно сложная структура, в которой нас могут интересовать, в первую очередь, поля:
Смысл всех этих полей станет понятным без объяснений из рассмотрения примеров построения модулей.
Первый пример (архив proc.tgz) показывает создание интерфейса к модулю в /proc доступного только для чтения из пользовательских программ (наиболее частый случай):
Здесь и далее, флаги прав доступа к файлу вида S_I* — ищите и заимствуйте в
.
$ sudo insmod ./mod_procr.ko
-r—r—r— 1 root root 0 Мар 26 18:14 /proc/mod_node
Hello from module!
Примечание: Обратите внимание на характерную длину блока чтения в этой реализации, она будет отличаться в последующих реализациях.
Несколько последовательно выполняемых операций:
Hello from module!
Hello from module!
Hello from module!
$ sudo rmmod mod_procr
ls: невозможно получить доступ к /proc/mod_*: Нет такого файла или каталога
Второй пример делает то же самое, но более простым и более описанным в литературе способом create_proc_read_entry() (но этот способ просто скрывает суть происходящего, но делает в точности то же самое):
Примечание (важно!): create_proc_read_entry() пример того, что API ядра, доступный программисту, намного шире, чем список экспортируемых имён в /proc/kallsyms или /boot/System.map-2.6.* , это происходит за счёт множества inline определений (как и в этом случае):
$ cat /proc/kallsyms | grep create_proc_
c0522237 T create_proc_entry
c0793101 T create_proc_profile
$ cat /proc/kallsyms | grep create_proc_read_entry
Смотрим файл определений
:
static inline struct proc_dir_entry *create_proc_read_entry(
const char *name, mode_t mode, struct proc_dir_entry *base,
read_proc_t *read_proc, void * data ) <
Возвращаемся к испытаниям полученного модуля:
$ sudo insmod ./mod_procr2.ko
Hello from module!
Hello from module!
$ sudo rmmod mod_procr2
cat: /proc/mod_node: Нет такого файла или каталога
Третий пример показывает модуль, который создаёт имя в /proc , которое может и читаться и писаться; для этого используется не специальный вызов (типа read_proc_t ), а структура указатели файловых операций в таблице операций (аналогично тому, как это делалось в драйверах интерфейса /dev ):
Обратите внимание, функция чтения node_read() в этом случае принципиально отличается от аналогичной функции с тем же именем в предыдущих примерах: не только своей реализацией, но и прототипом вызова, и тем, как она возвращает свои результаты.
Испытания того, что у нас получилось:
$ sudo insmod ./mod_proc.ko
-rw-rw-rw- 1 root root 0 Июл 2 20:47 /proc/mod_node
Hello from module!
$ echo новая строка > /proc/mod_node
$ dmesg | tail -n10
$ sudo rmmod mod_proc
cat: /proc/mod_node: Нет такого файла или каталога
Примечание: Ещё раз обратите внимание на размер блока запроса на чтение (в системном журнале), и сравните с предыдущими случаями.
Ну а если нам захочется создать в /proc не отдельное имя, а собственную иерархию имён? Как мы наблюдаем это, например, для системного каталога:
Пожалуйста! Для этого придётся только слегка расширить функцию инициализации предыдущего модуля (ну, и привести ему в соответствие функцию выгрузки). Таким образом, по образу и подобию, вы можете создавать иерархию произвольной сложности и любой глубины вложенности (показана только изменённая часть предыдущего примера):
Примечание: Здесь любопытно обратить внимание на то, с какой лёгкостью имя в /proc создаётся то как каталог, то как терминальное имя (файл), в зависимости от выбора единственного бита в флагах создания: S_IFDIR или S_IFREG .
Теперь смотрим что у нас получилось:
$ sudo insmod ./mod_proct.ko
$ cat /proc/modules | grep mod_
mod_proct 1454 0 — Live 0xf8722000
Hello from module!
$ echo ‘new string’ > /proc/mod_dir/mod_node
Источник
Русские Блоги
Linux proc system
Linux proc system
Файловая система proc — это виртуальная файловая система, созданная ядром. Это файловая система, используемая ядром для передачи информации во внешний мир. В ней хранится серия специальных файлов текущего состояния ядра. Она создается во время работы системы, поэтому она существует только. В памяти, но не во внешней памяти (жесткий диск, флэш-память). Через виртуальный файл proc можно реализовать связь между пространством ядра Linux и пользователем, что можно назвать окном, открытым ядром для пользовательского пространства.
1. Анализ каталога продукции
После загрузки системы Linux в файловую систему, введите каталог proc
Вот краткий анализ общих файлов в каталоге proc:
1.cat /proc/number
Каталог proc содержит много подкаталогов, названных по номерам.Эти номера указывают номер процесса запущенного в данный момент процесса в системе и содержат несколько информационных файлов, связанных с процессом.
Например, откройте каталог процесса 270 следующим образом:
Каждый из этих файлов имеет определенное значение,
Например: команда cmdline-complete для запуска текущего процесса, область памяти mem, занятая текущим процессом, и т. Д.
2.cat /proc/cmdline
Соответствующая информация о параметрах передается ядру при запуске, которое обычно передается u-boot;
3.cat /proc/cpuinfo
Файл информации, связанной с процессором;
4.cat /proc/crypto
Криптографический алгоритм, используемый установленным ядром в системе, и подробный информационный список каждого алгоритма;
5.cat /proc/devices
Информация обо всех блочных устройствах и символьных устройствах, загруженных системой, включая номер основного устройства и имя группы устройств;
6.cat /proc/filesystems
Файл списка типов файловых систем, поддерживаемый в настоящее время ядром. Файловая система, помеченная как nodev, означает, что она не требует поддержки блочных устройств, обычно при монтировании устройства, если тип файловой системы не указан, этот файл будет использоваться для определения требуемой файловой системы. Виды;
7.cat /proc/interrupts
Список номеров прерываний, связанных с каждым IRQ в архитектуре системы, каждый ЦП на многопроцессорной платформе имеет свой собственный номер прерывания для каждого устройства ввода-вывода;
8.cat /proc/iomem
Информация о сопоставлении каждого физического устройства в системной памяти;
9.cat /proc/meminfo
Информация о текущем состоянии использования памяти в системе отображается в двух столбцах, первый является статистическим атрибутом, а второй — соответствующим значением;
10.cat /proc/mounts
Все файловые системы, которые в настоящее время смонтированы в системе. Этот файл указывает на / proc / self / mounts.
Как показано ниже, в первом столбце указано подключенное устройство, во втором столбце указана точка монтирования в текущем дереве каталогов, в третьей — тип текущей файловой системы, а в четвертом столбце указан атрибут монтирования (ro или rw). , Пятый и шестой столбцы используются для сопоставления атрибутов дампа в файле / etc / mtab;
11.cat /proc/modules
Список имен всех модулей, загруженных в настоящее время в ядро, фактически совпадает с результатом, полученным командой lsmod, за исключением того, что набор текста lsmod лучше, а информация в / proc / modules более полная.
Как показано ниже, в первом столбце указано имя модуля, во втором столбце указано пространство памяти, занимаемое этим модулем, в третьем столбце указано количество загруженных экземпляров этого модуля, в четвертом столбце указано, от каких других модулей зависит этот модуль, и в пятом столбце. В столбце указано состояние загрузки этого модуля (в режиме реального времени: загружен; загружается: загружается; выгружается: выгружается), в шестом столбце указывается смещение этого модуля в памяти ядра;
12.cat /proc/partitions
Информация, такая как основной и вспомогательный раздел каждого раздела блочного устройства, включая блоки, содержащиеся в каждом разделе
(блок) номер, можно просмотреть вместе с содержимым / proc / mtd;
Приведенный выше контент представляет собой простой анализ каталога proc, более конкретный можно просмотретьПодробная файловая система proc。
2. Реализация интерфейса proc
В файловой системе proc мы можем использовать чтение и запись виртуальных файлов в качестве средства связи с сущностями в ядре для передачи данных ядра, но в отличие от обычных файлов, содержимое этих виртуальных файлов создается динамически из.
процедура определена в include/linux/proc_fs.h Далее интерфейсная функция реализована в /fs/proc/generic.c или /fs/proc/ Посмотрите в папке, анализ каталога proc в первом разделе, многие находятся в /fs/proc/ Папка реализована, как видно из имени файла, следующим образом:
Есть два способа создать интерфейс proc, create_proc_entry с участием proc_create Ниже приведены примеры для иллюстрации:
1.create_proc_entry метод
Просмотр исходного кода напрямую, это должно быть проще для понимания
- Чтобы использовать виртуальный файл proc, вам нужно включить заголовочный файл
- struct proc_dir_entry Структура является структурой данных процесса
- proc_mkdir(«proc_test», NULL) То есть создайте папку proc_test в каталоге proc;
- create_proc_entry(«proc_test1», 0644, proc_dir) То есть создайте файл proc_test1 (дочерний) в папке proc_test (родительский);
- proc_test1_read() Функция — это данные, отображаемые, когда cat / proc / proc_test / proc_test1
- proc_test1_write() Функция — это данные, записанные, когда echo 1> / proc / proc_test / pro_test1
2.proc_create метод
Сначала мы рассмотрим структуру этих двух функций создания:
- create_proc_entry(const char *name, mode_t mode, struct proc_dir_entry *parent)
- proc_create(const char *name,mode_t mode, struct proc_dir_entry *parent, const struct file_operations *proc_fops)
ты увидишь proc_create Функция, чтобы добавить один struct file_operations Структура, какая разница, когда она реализована?
proc_create Реализация пути на самом деле /fs/proc/ В папке много примеров, таких как cmdline.c / version.c и т. Д. Соответствующее объявление и другие действия приведены выше, поэтому я не буду повторять его здесь, просто напишите один proc_create Примеры способов.
Обратил внимание proc_create Функция, чтобы добавить один struct file_operations структура
вместо чего-то вроде create_proc_entry Вернись прямо так. Фактически, принцип тот же, один состоит в том, чтобы указать функции-члены write, read и т. Д. На интерфейс proc proc_dir_entry , И здесь, чтобы указать функции-члены wriet, read и т. Д. На структуру file_operations 。
использование proc_create Метод не использует член чтения, потому что, когда членом proc является cat, функция seq_read () вызывается неоднократно, что приводит к тому, что содержимое функции чтения постоянно печатается, но об этом также можно судить off_t *off Переменная обработка, здесь не так много описания.
Так как метод чтения не используется, вместо этого есть новый метод. Здесь используется член open. Интуитивно видно из приведенного выше примера, что функция open будет вызывать функцию show, поэтому содержимое функции show — это содержимое, полученное, когда cat , Элемент записи такой же, как create_proc_entry Реализация такая же.
Анализ системы Linux Linux здесь, и он будет обновляться, когда вы почувствуете это.
Примечание. Приведенное выше содержание является частью опыта, накопленного мною в процессе обучения. Я неизбежно буду ссылаться на некоторые знания других статей. Если есть какие-либо нарушения, пожалуйста, сообщите мне об этом вовремя. Я удалю или отмечу источник содержимого в срок. Пожалуйста, укажите, обсудите и изучите. Эта статья является лишь руководством. Для подробного анализа данных, пожалуйста, ознакомьтесь с руководствами по Linux. Спасибо за чтение.
Источник