Чтение/запись в пространстве ядра Linux

Я хочу добавить в ядро ​​Linux функции для записи и чтения данных. Но я не знаю, как/где его хранить, чтобы другие программы могли его читать/перезаписывать/удалять.

Программа A вызывает uf_obj_add(param, param, param), она сохраняет информацию в памяти.
Программа B делает то же самое.
Программа C вызывает uf_obj_get(param) ядро ​​проверяет, разрешена ли операция, и если да, возвращает данные.

Нужно ли мне просто malloc() памяти или это сложнее?
И как uf_obj_get() может получить доступ к памяти, где uf_obj_add() пишет?
Где хранить информацию о расположении памяти, чтобы обе функции могли обращаться к одним и тем же данным?


person Echren    schedule 02.03.2016    source источник
comment
Посмотрите ЗДЕСЬ и ЗДЕСЬ   -  person LPs    schedule 02.03.2016
comment
Разве вы не можете использовать для этого какую-нибудь существующую файловую систему (возможно, tmpfs или добавить свои новые записи в /proc/...)? Я считаю, что вы не должны патчить ядро ​​​​для таких вещей.   -  person Basile Starynkevitch    schedule 02.03.2016
comment
@BasileStarynkevitch Я бы хотел попробовать так...   -  person Echren    schedule 02.03.2016
comment
Вы, конечно, не используете malloc в ядре (но некоторый вариант kalloc), потому что вы не используете стандартную библиотеку C в коде ядра (который концептуально автономен)   -  person Basile Starynkevitch    schedule 02.03.2016
comment
Я настоятельно рекомендую очень ознакомиться с расширенным программированием в Linux -in user land — перед попыткой написать код ядра; Кстати, как бы вы использовали свои недавно добавленные функции ядра (в каком-то драйвере, а затем в каком? В каком-то новом системном вызове?...)?   -  person Basile Starynkevitch    schedule 02.03.2016
comment
Единственное, что я делал в исходном коде Linux, — это модифицировал возвращаемое значение функции (просто чтобы что-то проверить). Так что большего я не знаю. Я нашел учебники о том, как добавлять функции, и теперь я хочу узнать больше, чтобы изменить их. Есть и другие способы добиться того, чего я хочу, но я хочу попробовать этот.   -  person Echren    schedule 02.03.2016
comment
kernelnewbies.org, вероятно, содержит соответствующую информацию; тем не менее, мой первый совет об исправлении ядра: не исправлять ядро, попытаться найти подход, основанный на пользовательской среде...   -  person Basile Starynkevitch    schedule 02.03.2016
comment
Почему не патчить? Почему ? Это возможность учиться.   -  person Echren    schedule 02.03.2016
comment
Действительно, обучение — это хорошая мотивация. Но будьте готовы сломать свою систему (поэтому сделайте резервную копию важных данных на каком-нибудь внешнем носителе).   -  person Basile Starynkevitch    schedule 02.03.2016
comment
ОП явно начинающий программист в целом, и поэтому выполнение какой-либо работы с ядром не рекомендуется. Поэтому я могу только рекомендовать придерживаться пользовательского пространства. На всякий случай, если это предполагалось использовать в реальном мире, рассматриваемый механизм выглядит как попытка обеспечить функциональность, эквивалентную уже существующим механизмам (например, sysvipc).   -  person employee of the month    schedule 02.03.2016
comment
@employeeofthemonth Что вы имеете в виду под вообще? Я мало что знаю о взломе ядра, но я начал программировать много лет назад. Мне нужно создать функции для новой системы безопасности, и по нескольким причинам мне сказали не использовать существующие функции. Никаких read(), open() и прочего. И среди прочих требований код не должен находиться в пользовательском пространстве. Поэтому, пожалуйста, перестаньте предлагать мне писать код UL или использовать существующие механизмы.   -  person Echren    schedule 21.03.2016


Ответы (1)


Как указали комментаторы на ваш вопрос, достижение этого в пользовательском пространстве, вероятно, было бы намного безопаснее. Однако, если вы настаиваете на достижении этого путем изменения кода ядра, один из способов, которым вы можете пойти, — это реализовать новый драйвер устройства, который имеет такие функции, как чтение и запись, которые вы можете реализовать в соответствии с вашими потребностями, чтобы ваши процессы имели доступ к некоторой памяти. пространство, как вы описали. Затем ваши процессы могут работать, как вы описали, читая и записывая в одно и то же пространство более или менее, как если бы они читали/записывали в обычный файл.

Тем не менее, я бы порекомендовал прочитать довольно много материалов, прежде чем углубляться в код ядра. Хорошим ресурсом по драйверам устройств является драйверы устройств Linux. Несмотря на то, что значительная часть его информации может быть устаревшей, вы можете найти здесь версия исходного кода, использованная в книге, перенесена на linux 3.x. Вы можете найти то, что ищете, в каталоге scull.

Опять же, как указали комментаторы на ваш вопрос, я не думаю, что вам следует сразу же прыгать с пространством ядра. Однако в образовательных целях scull может послужить хорошей отправной точкой для чтения кода ядра и просмотра того, как достигаются результаты, аналогичные описанным вами.

person ilim    schedule 02.03.2016