Связь между потоками ядра в модуле ядра Linux - PullRequest
4 голосов
/ 25 сентября 2011

Я только начинаю изучать приемы создания модуля ядра на ядре Linux 2.6. Что я хочу сделать, так это иметь 3 потока ядра, называемых ведомыми, которые должны отправлять данные в 4-й поток ядра, называемый master, и получать их соответствующие ответы. Подчиненные устройства могут запрашивать в любое время, а это значит, что мне понадобится какая-то структура очереди и способ перенаправления ответов в правильный поток.

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

Из-за отсутствия документации (и, по общему признанию, слабых навыков поиска), я не знаю, как это реализовать. Можете ли вы указать мне правильное направление?

1 Ответ

3 голосов
/ 26 сентября 2011

Вы сталкиваетесь с двумя различными проблемами:

  1. Фактическая связь между подчиненными и ведущим.Вы можете использовать реализацию FIFO в ядре (kernel/kfifo.c).
  2. Вам потребуется демультиплексирование для мастера без ожидания / опроса занятости.Вы можете сделать это так же, как в пользовательском пространстве, с помощью poll / epoll для «дескриптора файла событий» (eventfd).Взгляните на API уровня ядра в include/linux/eventfd.h (реализация в fs/eventfd.h).

Вероятно, вам следует использовать пару [kfifo, файл событий] для каждого подчиненного потока.Главный поток блокируется в вызове do_poll() и, когда он проснулся, может использовать правильный FIFO на основе fd, который был «сигнализирован».Взгляните на fs/select.c, чтобы понять, как вам следует звонить do_poll().

Возможно, вы захотите использовать мьютексы для защиты FIFO.

...