Ядро Linux / proc FIFO/pipe
Вопрос
В настоящее время я пытаюсь создать модуль ядра, который будет генерировать данные на основе событий ядра и передавать их в файл.Прочитав, что это плохо (и я согласен), я решил, что было бы разумнее хранить данные в файле /proc, из которого пользовательская программа могла бы извлекать данные при необходимости.Однако эта идея привела ко всевозможным проблемам, особенно когда и как очистить этот файл.Так я и думал..."почему бы мне не создать именованный канал в /proc и не прочитать из него?"
Я понял общую суть настройки функции чтения и функции записи для файла proc, но у меня все еще возникают концептуальные проблемы с тем, как я буду это делать.А именно, как бы я написал такую функцию, чтобы брать произвольные данные и записывать их в такой канал из ядра?У кого-нибудь есть какие-нибудь идеи, как вы будете передавать данные в именованный канал из пространства ядра?В конце концов, это не так иметь быть файлом /proc (особенно, если с моей стороны это неправильно), но именно к такому выводу я пришел.Затем мне нужно будет выяснить, как подключиться к нему из пользовательской программы, но я чувствую, что это отдельная проблема.
Решение
Вместо создания именованного канала, то, что вы хотите сделать, это создать "Символьное устройство".Если вам нужно простое взаимодействие или потоковая передача данных из ядра в пространство пользователя и обратно, это обычный метод.Я бы порекомендовал поискать похожие устройства в ядре Linux и посмотреть, что они делают.
Другие советы
Я думаю, что обычно это делается с помощью сокета netlink;один или несколько процессов пользовательского пространства могут привязываться к адресу "netlink", и ваше ядро может транслировать сообщения любому / всем из них по мере необходимости.
Это, безусловно, то, что делают некоторые вещи, особенно сетевая подсистема.Программа пользовательского пространства может отслеживать изменения в сетевых интерфейсах (например,новые IP-адреса, изменение статуса ссылки) с использованием этого метода.
Я согласен с Полом — внедрение символьного устройства, вероятно, лучший способ.Возможно, глядя на код, реализующий /dev/kmem или /dev / rtc [0-9].Кроме того, последовательные драйверы реализуют свои драйверы с использованием символьных устройств.
Просто думайте об этом как о виртуальном устройстве.:-)
/процесс на самом деле это не настоящая файловая система;он создается ядром на основе того, что запущено в данный момент.Я не думаю, что вы можете создавать в нем именованные каналы.