Проблема в следующем. Необходимо в character драйвере
в вызовах read/write/ioctl узнать кроме minor number
файловый дескриптор соответствующего открытого файла устройства.
Прямой просмотр исходников ядра дал отрицательный результат.
read/write/ioctl в качестве параметра получают
struct file и struct inode, мне не удалось найти через эти структуры нужный мне дескриптор. Если кто знает как эту
проблему решить или знает наверняка что это сделать невозможно
напишите пожалуйста.
Один struct file может быть доступен через много
разных fd даже в одном процессе, не говоря уже,
что может быть виден в разных процессах - dup(), fork(), etc.
Если же вопрос в том, чтобы узнать, каким fd воспользовался
процесс именно в ЭТОМ syscall'е, то можно попробовать что-то
вроде:
to idle:
Спасибо,
На вопрос зачем - можно ответить односложно - для повышения
производительности.
Этот драйвер обслуживает адаптер промышленной сети CAN -
сеть реального времени с короткими до 12-20 байт кадрами, скорость передачи до 10Мбит/сек. Драйвер поддерживает до 8 очередей с приоритетами на прием кадров, по которым принятые
кадры раскидываются. Поэтому на пользовательский уровень надо выдавать номер канала (контроллера) (это либо минор либо fd) который получил кадр и номер очереди в которую этот кадр попал.
Задача - свести к минимуму количество переключений контекста между пользовательским уровнем и ядром.
Select() - это лишнее переключение контекста (+ не узнать номер очереди), поэтому сейчас используются RT сигналы (siginfo_t) для передачи этой информации (тем более что без сигналов в принципе нельзя - сеть система существенно асинхронная).
lm2000
PS: chto-to s parolem ne to :-(
Сейчас передается минор и номер очереди. Если передавать fd
то можно избежать линейного поиска по массиву соответствия minor->fd в пользовательской программе, которая работает с несколькими каналами одновременно.
А что мешает эту информацию "канала (контроллера) (это либо минор либо fd) который получил кадр и номер очереди в которую этот кадр попал" помещать в заголвке буфера, который все равно будет читатся пользователем через read?
to: Ogr
Ничего не мешает, но необходимо получать информацию о приходе пакета асинхронно и сразу узнавать открытый fd (он же номер канала) и очереди, чтобы не городить лишние select().
Повторюсь, что пакеты короткие, и поэтому приходят очень часто.
lm2000