Какие варианты у нас есть для связи между пользовательской программой и модулем ядра Linux? - PullRequest
7 голосов
/ 20 июля 2010

Я новичок в программировании модуля ядра Linux. Из материала, который я прочитал до сих пор, я обнаружил, что пользовательская программа может запросить службы или связаться с модулем ядра Linux 3 способами

  1. файл устройства в / dev
  2. файл в файловой системе / proc
  3. ioctl () call

Вопрос: Какие еще варианты у нас есть для связи между пользовательской программой и модулем ядра linux?

Ответы [ 5 ]

7 голосов
/ 20 июля 2010

Ваш вариант 3) на самом деле является подопцией варианта 1) - ioctl() - это один из способов взаимодействия с файлом устройства (read() и write() - это обычные способы).

Два других способа, которые стоит рассмотреть:

  • Файловая система sysfs;
  • Сокеты Netlink.
6 голосов
/ 21 ноября 2010

В основном многие стандартные механизмы МПК - ср.http://en.wikipedia.org/wiki/Inter-process_communication - можно использовать:

  1. Файл и отображенный в памяти файл: файл устройства (как указано выше) или аналогичный специальный файл в / dev, procfs, sysfs, debugfs или собственная файловая система, декартово произведение с чтением / записью, ioctl, mmap

  2. Возможные сигналы (для использования с kthread)

  3. Сокеты: используется протокол выбора: TCP, UDP (ср. knfsd, но, вероятно, не слишком просто), PF_LOCAL или Netlink (многиеподынтерфейсы - базовый netlink, genetlink, Connector, ...)

Кроме того,

4. Системные вызовы (хотя на самом деле не используются из модулей, хотя)

5. Сетевые интерфейсы (сродни tun).

Рабочие примеры Netlink - лишь некоторые из них - можно найти, например, в

  • git: //git.netfilter.org/libmnl (на стороне пользователя)
  • net / core / rtnetlink.c (базовый netlink)
  • net / netfilter / nf_conntrack_netlink.c(nfnetlink)
  • fs / quota / netlink.c (genetlink)
3 голосов
/ 11 января 2012

Сюда входят все типы с примерами:)

http://people.ee.ethz.ch/~arkeller/linux/kernel_user_space_howto.html

2 голосов
/ 17 июля 2016

В этом документе Linux приведены некоторые способы взаимодействия (взаимодействия) ядра и пространства пользователя.Это следующие.

  • Procfs, sysfs и аналогичные механизмы.Это включает в себя также /dev записей и все методы, в которых пространство ядра предоставляет файл в пользовательском пространстве (записи / proc, / dev и т. Д. В основном являются файлами, открытыми из пространства ядра).1011 * основанные механизмы.Netlink - это тип сокета, который предназначен специально для связи между пространством пользователя и пространством ядра.
  • System calls.
  • Upcalls.Ядро выполняет код в пространстве пользователя.Например, создание нового процесса.
  • mmap - Память, отображающая область памяти ядра в пространство пользователя.Это позволяет как ядру, так и пользовательскому пространству выполнять чтение / запись в одну и ту же область памяти.

Кроме этого, в следующем списке добавлены некоторые другие известные мне механизмы.1027 *Interrupts.Пользовательское пространство может вызывать прерывания для общения с пространством ядра.Например, некоторые процессоры используют int80 для выполнения системных вызовов (в то время как другие могут использовать другой механизм, такой как syscall инструкция).Ядро должно заранее определить соответствующий обработчик прерываний.

vDSO/vsyscall - это механизмы в ядре Linux для оптимизации выполнения некоторых системных вызовов.Идея состоит в том, чтобы иметь общую область памяти, и когда процесс выполняет системный вызов, библиотека пользовательского пространства получает данные из этой области вместо фактического вызова соответствующего системного вызова.Это сохраняет издержки переключения контекста.
1 голос

Работоспособные примеры всего

Слишком много разговоров заставляет меня скучать!

...