Какие опции мы имеем для связи между пользовательской программой и модулем ядра Linux?



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




  1. файл устройства в /dev

  2. файл в файловой системе /proc

  3. вызов ioctl ()


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

418   5  

5 ответов:

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

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

  • файловая система sysfs;
  • сокеты Netlink.

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

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

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

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

Кроме того,

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

[1]}5. сетевые интерфейсы (сродни tun).

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

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

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

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

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

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

Кроме этих, следующий список добавляет некоторые другие механизмы, которые я знаю.

  • Interrupts. Пользовательское пространство может вызывать прерывания для разговора пространство ядра. Например, некоторые процессоры используют int80 для выполнения системных вызовов (в то время как другие могут использовать другой механизм, такой как syscall инструкция). Ядро должно заранее определить соответствующий обработчик прерываний.
  • vDSO/vsyscall - это механизмы в ядре Linux для оптимизации выполнения некоторых системных вызовов. Идея состоит в том, чтобы иметь общую область памяти, и когда процесс делает системный вызов, библиотека пространства пользователя получает данные из этой области, вместо того чтобы фактически вызывать соответствующий системный вызов. Это экономит накладные расходы на переключение контекста.

Запускаемые примеры всего

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

Comments

    Ничего не найдено.