LINUX.ORG.RU

erlangio — proof of technology обмен данными между модулем ядра Linux и виртуальной машиной Erlang

 , ,


0

1

Доброго времени суток, коллеги.

В рамках курсовой работы по курсу «Операционные системы» в МИЭМ НИУ ВШЭ, я реализовал однонаправленный механизм взаимодействия между драйвером ядра Linux и приложением на Erlang/OTP: https://github.com/MIEMHSE/erlangio.

Механизм представляет из себя следующее: драйвер при загрузке создает два устройства (одно символьное misc, а второе — файл в procfs). При записи в /dev/erlangio данные сохраняются в массив, а затем отдаются при чтении /dev/erlangio или /proc/erlangio. Приложение на Erlang/OTP при запуске создает callback на действие закрытия файла по записи с помощью механизма inotify. При вызове callback'а, данные читаются из /proc/erlangio. Почему нельзя было обойтись одним misc-устройством? Потому что при попытке открытия устройства из /dev/ с использованием операции file:open/2, возвращается eisdir. По причине странной работы с файлами, из procfs приходится читать файл небольшим костылем.

И вот, собственно, вопрос. Пытаясь изначально реализовать обмен не через procfs или сокеты (а, допустим, с помощью mmap), столкнулся с тем, что не смог найти вменяемого IPC между, собственно, ядром и юзерспейсом, если не считать kdbus (оно уже в ядре?). Может кто подскажет чего-нибудь путного почитать на эту тему?

Спасибо.


А kdbus уже стал механизмом обмена данными между ядром и юзерспейсом? O_o

Потому что при попытке открытия устройства из /dev/ с использованием операции file:open/2, возвращается eisdir.

Erlang не умеет в специальные файлы устройств? Фейспалм. Тогда, если тебя не устраивают сокеты, реализуй свою ФС (на основе libfs это не сложно).

tailgunner ★★★★★
()
Ответ на: комментарий от Deleted

Спасибо. Насколько я понял, Netlink — это сокеты? Я собственно не очень хотел в сокеты, но если это и правда базовое решение проблем коммуникации между ядром и юзерспейсом, то похоже лучше его осилить.

BuG2BuG
() автор топика
Ответ на: комментарий от tailgunner

А kdbus уже стал механизмом обмена данными между ядром и юзерспейсом? O_o

DBus — это же шина сообщений, а kdbus, насколько я понял, — имплементация ее в ядре через kdbusfs (собственно то, что Вы предлагаете — через FS).

Erlang не умеет в специальные файлы устройств? Фейспалм.

Это оговорено в документации. Умеет из файлов устройств только /dev/null.

eisdir : The named file is not a regular file. It may be a directory, a fifo, or a device.

BuG2BuG
() автор топика
Ответ на: комментарий от BuG2BuG

DBus — это же [...] kdbus, насколько я понял [...]

Где ты узнал, что kdbus - это средство обмена между ядром и юзерспейсом, а не между юзерспейсом и юзерспейсом?

kdbusfs (собственно то, что Вы предлагаете — через FS).

Я ничего такого не предлагаю.

Erlang не умеет в специальные файлы устройств? Фейспалм.

Это оговорено в документации

Я прошел по ссылке. То, что такое поведение оговорено, не делает его менее идиотским.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Где ты узнал, что kdbus - это средство обмена между ядром и юзерспейсом, а не между юзерспейсом и юзерспейсом?

Полагаю, что если есть ядерные заголовки и возможность работать с kdbusfs через файловую систему, то можно организовать запись и чтение данных в шину из модуля ядра, а не только из юзерспейса. Иначе зачем выносить в ядро то, что NIEPLOHO работает в юзерспейсе?

Я прошел по ссылке. То, что такое поведение оговорено, не делает его менее идиотским.

Ну я еще поковыряюсь, чтобы прорефлексировать, зачем оно так сделано, но мне кажется, что на то должны были быть какие-то причины.

BuG2BuG
() автор топика
Ответ на: комментарий от BuG2BuG

Где ты узнал, что kdbus - это средство обмена между ядром и юзерспейсом, а не между юзерспейсом и юзерспейсом?

Полагаю, что

Ясно.

Иначе зачем выносить в ядро то, что NIEPLOHO работает в юзерспейсе?

Средства для реализации передачи данных без лишнего копирования есть только в ядре.

В общем, рекомендованный способ обмена между ядром и юзерспейсом - netlink. Дальше уж решай сам.

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)
Ответ на: комментарий от tailgunner

В общем, рекомендованный способ обмена между ядром и юзерспейсом - netlink. Дальше уж решай сам.

Добро! Спасибо.

BuG2BuG
() автор топика

Предлагаю уж внести erlang в ядро

niemand
()
Ответ на: комментарий от tailgunner

А ты типа не понял, да?

Ну изучи нормально русский язык, управление глаголов, какие предлоги и падежи требует глагол «уметь», и может быть тогда ты поймешь, в чём твоя ошибка. Но скорее всего тебе не хватит ума для этого

niemand
()
Ответ на: комментарий от tailgunner

А я типа хочу услышать ясную формулировку

Лучше скажи, что общее между теми двумя цитатами?

niemand
()

не смог найти вменяемого IPC между, собственно, ядром и юзерспейсом

Плохо искал. В гуголе есть целый древний сайт про сабж. Копай глубже.

nanoolinux ★★★★
()

Зачем это всё нужно?

Harald ★★★★★
()
Ответ на: комментарий от niemand

Намекает, что ты и tailgunner тупые школьники

А твои наезды намекают, что кто-то не в курсе жаргонизма «уметь в»

Pinkbyte ★★★★★
()
Ответ на: комментарий от niemand

Просто кто обычно падок до модных жаргонизмов?

Активные пользователи интернета. Например, офисный планктон.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.