Изначально файловая система /proc разрабатывалась как средство
предоставления информации о выполняющихся в системе процессах. Но из-за
ее удобства многие подсистемы ядра стали использовать эту файловую
систему как средство предоставления информации и динамического
конфигурирования.

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

В короткой статье нельзя описать
файловую систему /proc во всех деталях, но вполне возможно
продемонстрировать несколько вариантов ее использования, дающих
представление о ее возможностях. В листинге 1 показан интерактивный
обзор некоторых элементов /proc. Мы видим корневой каталог файловой
системы /proc. Обратите внимание на файлы с номерными именами в левой
части листинга. Это — каталоги, содержащие информацию о выполняющихся в
системе процессах. Process-id равный 1 присвоен процессу init, который в системе GNU/Linux запускается первым. Если выполнить команду ls
для такого каталога, будет отображен список находящихся в нем файлов. В
каждом файле содержатся те или иные сведения о процессе. Например, для
того, чтобы посмотреть сведения о параметрах командной строки, с
которыми был запущен процесс init, достаточно просмотреть содержимое файла cmdline с помощью команды cat.

В /proc есть и другие интересные файлы. Например, cpuinfo, содержащий сведения о типе и производительности центрального процессора, pci, из которого можно получить информацию об устройствах на шине PCI и modules, в котором находится список загруженных в ядро модулей.

Ресурсы.

На самом деле, /proc — не единственная виртуальная файловая система в ОС GNU/Linux. Аналогичная файловая система sysfs
имеет сходные функциональные возможности и немного более удачную
структуру (при ее разработке был учтен опыт /proc). Тем не менее /proc
является де-факто стандартом и, несмотря на то, что sysfs имеет
некоторые преимущества, будет и впредь оставаться таковым. Можно
упомянуть еще одну виртуальную файловую систему — debugfs,
которая (как следует из ее названия), представляет собой скорее
отладочный интерфейс. Ее преимуществом является простота, с которой
происходит экспорт значения из ядра в пользовательское пространство
(фактически, это требует единственного системного вызова).

Загрузка, вы можете загрузить исходные коды всех примеров, приведенных в статье.

Код в листинге 3 начинается с обязательного заголовка (описывающего интерфейс модуля, типы и макросы). Затем, с помощью макроса MODULE_LICENSE, указывается тип лицензии, под которой распространяется модуль. В данном примере мы используем лицензию GPL, чтобы не получать предупреждений о «заражении» ядра проприетарным кодом.

Далее в листинге 3 следует определение функций модуля init и cleanup. Функция my_module_init вызывается при загрузке модуля и поэтому может использоваться для инициализации. Другая функция, my_module_cleanup,
вызывается в момент выгрузки модуля. В ней происходит освобождение
памяти и ликвидация следов пребывания модуля в ядре. Обратите внимание
на то, что мы используем функцию printk: это аналог printf для ядра. С помощью макроса KERN_INFO можно записать в кольцевой буфер ядра произвольную строку (аналогично функции syslog).

Функции, вызываемые при загрузке и выгрузке модуля, задаются в заключительных строках листинга с помощью макросов module_init and module_exit. Такой способ определения вспомогательных функций init and cleanup позволяет называть их как угодно. Достаточно лишь сообщить их имена ядру.

листинг 7). В нашем тестовом модуле сallback-функция записи служит для обработки входящих данных.

В
Linux предусмотрен набор API для перемещения данных между
пользовательским пространством и пространством ядра. Для операций с
данными, находящимися в пользовательском пространстве, в функции write_proc из нашего примера, используется семейство функций copy_from_user.

Ресурсы в конце статьи.

Об авторе

M. Тим Джонс (M. Tim Jones) является архитектором встраиваимого программного
обеспечения и автором работ: Программирование Приложений под GNU/Linux,
Программирование AI-приложений и Использование BSD-сокетов в различных
языках программирования
. Он имеет опыт разработки процессоров для геостационарных
космических летательных аппаратов, а также разработки архитектуры встраиваемых
систем и сетевых протоколов. Сейчас Тим работает инженером-консультантом в корпорации
Эмулекс (Emulex Corp.) в г.Лонгмонт, Колорадо.

Карта сайта: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34