Доступ к ядру Linux через файловую систему /proc
Изначально файловая система /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) является архитектором встраиваимого программного |