Перейти к содержанию
    

Передача данных в приложение user-spase по прерыванию

Есть плата на PCI шине. После разрешения прерывания для девайса, начинают сыпаться данные по DMA, по получению каждого пакета выставляется прерывание что данные поступили. Далее требуется передать данные(или указатель, где хранятся данные) в программу из user-spase. Вопрос в том, как сделать это правильно?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

обычно со стороны драйвера непосредственно в ISR делается только самый необходимый минимум, плюс шедулится вызов либо tasklet-а либо work queue.

что выбрать в конкретном случае - зависит от "тяжеловесности" обработки, которую нужно совершить.

 

для передачи больших объемов информации обычно пользуются либо bsd-сокетами, либо netlink-ом.

 

и примите как данность, что данные из кернелспейса в юзерспейс передаются копированием, и передать указатель вы не сможете, а если всё же передадите, то ядро срубит userspace-процесс, полезший в память, выделенную в kernelspace.

в linux это by design, для обеспечения безопасности в смысле security.

поэтому заранее оценивайте падение производительности.

 

подсунуть в ядро память, выделенную в юзерспейсе можно, однако для выполнения DMA-транзакций она не подходит по целому ряду причин.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

обычно со стороны драйвера непосредственно в ISR делается только самый необходимый минимум, плюс шедулится вызов либо tasklet-а либо work queue.

что выбрать в конкретном случае - зависит от "тяжеловесности" обработки, которую нужно совершить.

 

для передачи больших объемов информации обычно пользуются либо bsd-сокетами, либо netlink-ом.

 

и примите как данность, что данные из кернелспейса в юзерспейс передаются копированием, и передать указатель вы не сможете, а если всё же передадите, то ядро срубит userspace-процесс, полезший в память, выделенную в kernelspace.

в linux это by design, для обеспечения безопасности в смысле security.

поэтому заранее оценивайте падение производительности.

 

подсунуть в ядро память, выделенную в юзерспейсе можно, однако для выполнения DMA-транзакций она не подходит по целому ряду причин.

 

Со всем согласен, но если использовать расшаренную область памяти, то можно без копирования передавать данные между кернелспейсом и юзерспейсом. Для полноты картины добавил.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

shared memory vfs - это такая помойка, что ой.

особенно если нужно обеспечить доступ не из одного пользовательского приложения, а из нескольких.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

shared memory vfs - это такая помойка, что ой.

особенно если нужно обеспечить доступ не из одного пользовательского приложения, а из нескольких.

 

Как бы то ни было это легальный метод. Например LinuxCNC использует его в сочетании с реалтайм Линуксом.

 

http://habrahabr.ru/post/261161/

может будет полезна

 

Спасибо, интересно.

Вы автор?

 

Кстати можно в юзерспейсе создать структуру из буфера и индексов начала и конца для реализации кольцевого буфера, а потом передать указатель на нее кернелу. Тогда тоже можно будет обойтись без копирования.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...