Ядро Linux / proc FIFO / pipe - PullRequest
       60

Ядро Linux / proc FIFO / pipe

2 голосов
/ 24 ноября 2008

В настоящее время я пытаюсь создать модуль ядра, который будет генерировать данные, основанные на событиях ядра, и помещать их в файл. После прочтения, что это плохо (и я согласен), я решил, что было бы более разумно иметь данные в файле / proc, из которого пользовательская программа могла бы извлечь данные при необходимости. Однако эта идея привела к возникновению всевозможных проблем, особенно когда и как очистить этот файл. Поэтому я подумал ... «почему я не делаю именованный канал в / proc и не читаю из этого?»

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

Ответы [ 4 ]

5 голосов
/ 24 ноября 2008

Вместо создания именованного канала вам нужно создать «устройство персонажа». Если вам нужно простое взаимодействие или потоковая передача данных из ядра в пользовательское пространство и обратно, это обычный метод. Я бы порекомендовал поискать подобные устройства в ядре Linux и посмотреть, что они делают.

3 голосов
/ 25 ноября 2008

Я думаю, что обычно это делается с использованием сокета netlink; один или несколько процессов пользовательского пространства могут связываться с адресом «netlink», и ваше ядро ​​может передавать сообщения любому / всем из них при необходимости.

Это, безусловно, то, что делают некоторые вещи, особенно сетевая подсистема. С помощью этого метода программа пользовательского пространства может отслеживать изменения в сетевых интерфейсах (например, новые IP-адреса, изменение состояния канала).

1 голос
/ 24 ноября 2008

/ proc на самом деле не настоящая файловая система ; это построено ядром, основанным на том, что в настоящее время работает. Я не думаю, что вы можете создать именованные каналы в нем.

1 голос
/ 24 ноября 2008

Я согласен с Полом - возможно, лучше всего использовать устройство персонажа. Возможно, посмотрите на код, реализующий / dev / kmem или / dev / rtc [0-9]. Кроме того, последовательные драйверы реализуют свои драйверы, используя символьные устройства.

Просто думайте об этом как о виртуальном устройстве. : -)

...