В настоящее время я пытаюсь создать модуль ядра, который будет создавать данные на основе событий ядра и помещать их в файл. Прочитав, что это плохо (и я согласен), я решил, что было бы разумнее иметь данные в файле / proc, из которых пользовательская программа могла бы извлечь при необходимости. Однако эта идея привела к разного рода проблемам, особенно когда и как очистить этот файл. Поэтому я подумал ... "Почему бы мне не создать именованный канал в / proc и не читать из него?"
У меня есть общая суть установки функции чтения и функции записи для файла proc, но у меня все еще возникают концептуальные проблемы с тем, как я буду это делать. А именно, как мне написать такую функцию, чтобы брать произвольные данные и записывать их в такой канал из ядра? Кто-нибудь знает, как передать данные в именованный канал из пространства ядра? В конце концов, имеют не является файлом / proc (особенно если это неправильно с моей стороны), но я пришел к такому выводу. Затем мне придется придумать, как подключиться к нему из программы пользовательского пространства, но я считаю, что это отдельная проблема.





Вместо того, чтобы создавать именованный канал, вы хотите создать «Символьное устройство». Если вам нужно простое взаимодействие или потоковая передача данных из ядра в пользовательское пространство и обратно, это обычный метод. Я бы рекомендовал поискать похожие устройства в ядре Linux и посмотреть, что они делают.
Я согласен с Полом: возможно, лучше всего будет использовать символьное устройство. Возможно, посмотрите на код, реализующий / dev / kmem или / dev / rtc [0-9]. Кроме того, драйверы последовательного порта реализуют свои драйверы с помощью символьных устройств.
Подумайте об этом как о виртуальном устройстве. :-)
/ proc на самом деле не настоящая файловая система; он создается ядром на основе того, что работает в данный момент. Я не думаю, что в нем можно создавать именованные каналы.
Я думаю, что обычно это делается с помощью сокета netlink; один или несколько процессов пользовательского пространства могут связываться с адресом "netlink", и ваше ядро может транслировать сообщения любому / всем из них по мере необходимости.
Это определенно то, что делают некоторые вещи, особенно сетевая подсистема. Программа пользовательского пространства может отслеживать изменения в сетевых интерфейсах (например, новые IP-адреса, изменение статуса связи), используя этот метод.
Есть несколько хороших предложений. Ядро поддерживает несколько способов:
Надеюсь это поможет.
Фактически вы можете Создайте их (я сделал), хотя я не уверен, насколько они функциональны.