Асинхронный ввод-вывод (выбор стратегии)

Взгляд изнутри

Модератор: Модераторы разделов

Аватара пользователя
stari_maček
Сообщения: 116
ОС: RFRemix 18

Асинхронный ввод-вывод

Сообщение stari_maček »

Коллеги, хочу посоветоваться насчёт выбора подходящей модели взаимодействия между драйвером и аппликацией.
Задачка такая:
Девайс - многоканальный контроллер на MPC83xx PQ2 Pro. К чёрту подробности, короче эта штука должна уметь принимать/отдавать данные по 256 каналам параллельно в непрерывном режиме блоками по 8K. таковы требования.

Реализовал драйвер для этого девайса с ioctl() интерфейсом до каналов внутри него, т.е. ioct() возвращает некий дескриптор, соответствующий конкретному каналу. Через этот дескриптор предполагается реализовать всё взаимодействие - постановка блоков в буфер-ринг канала на воспроизведение/запись, оповещение о событиях. Требование такое - никакого копирования из юзер-спейса в кернел-спейс и обратно, буфера алоцируются драйвером при старте и мапируются в юзер-спейс в контексте конкретной сессии ввода/вывода. И главное требование - взаимодействие должно быть асинхронное.

Пока хочу сделать так - в дескрипторе канала реализовать следующее апи:
-write() отправка команды каналу. Команда - структура с кодом операции и оффсетом в буфере канала, по которому находятся данные на воспроизведение или запись
-read() чтение результата предыдущей операции, возвращает ту же структуру с оффсетом в буфере и с кодом результата.

Между write() и read() пользовательский процесс должен "спать", вернее слушать события от множества каналов и оповещать о событиях верхний уровень, логика которого - подсунуть очередной кусок на воспроизведение, обработать принятый кусок или остановить сессию.

Вопрос такой: существует ли готовое API, которое соответствует требованиям задачи, стоит ли городить собственный огород?
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: Асинхронный ввод-вывод

Сообщение serzh-z »

stari_maček
Может поможет Netlink?
Спасибо сказали:
Аватара пользователя
stari_maček
Сообщения: 116
ОС: RFRemix 18

Re: Асинхронный ввод-вывод

Сообщение stari_maček »

serzh-z писал(а):
01.06.2009 13:03
stari_maček
Может поможет Netlink?
Спасибо, к своему стыду не знал про него. Похоже, я написал свой нетлинк, только более специфичный, без сокетов, но с блэкджеком и .. сами знаете :rolleyes:
А тут реализация более универсальная и развесистая.

Немного непонятно, как тут передаются данные? Что происходит в результате этого вызова

Код: Выделить всё

 /* wait for message coming down from user-space */
 skb = skb_recv_datagram(nl_sk, 0, 0, &err);

Данные копируются или мапируются?
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: Асинхронный ввод-вывод

Сообщение serzh-z »

stari_maček писал(а):
01.06.2009 15:41
Похоже, я написал свой нетлинк
Ну скажем, так выглядили реализации Netlink для старых ядер (2.0). Сейчас он обходится без передачи дескриптора сокета/канала и прочей инфы через ioctl.

stari_maček писал(а):
01.06.2009 15:41
Данные копируются или мапируются?
Избежать копирования можно с помощью, кажется tie (не помню точное название), вызова, который появился примерно в ядре 2.6.23 - стоит поискать в ядерном ChangeLog, на LKWN ещё была хорошая статья с примерами. Он позволяет передать данные между буферами ядра, без предварительного копирования этих данных в userspace.
Спасибо сказали:
Аватара пользователя
stari_maček
Сообщения: 116
ОС: RFRemix 18

Re: Асинхронный ввод-вывод

Сообщение stari_maček »

serzh-z писал(а):
01.06.2009 16:07
Избежать копирования можно с помощью, кажется tie (не помню точное название)

ой, а попробуйте вспомнить по-точнее, ничего путного по этому слову не могу найти.
Спасибо сказали: