LINUX.ORG.RU

Как из character драйвера узнать дескриптор специального файла устройства


0

0

Проблема в следующем. Необходимо в character драйвере
в вызовах read/write/ioctl узнать кроме minor number
файловый дескриптор соответствующего открытого файла устройства.
Прямой просмотр исходников ядра дал отрицательный результат.
read/write/ioctl в качестве параметра получают
struct file и struct inode, мне не удалось найти через эти структуры нужный мне дескриптор. Если кто знает как эту
проблему решить или знает наверняка что это сделать невозможно
напишите пожалуйста.

Либо я не понял, либо вообще ворос некорректен.

Один struct file может быть доступен через много разных fd даже в одном процессе, не говоря уже, что может быть виден в разных процессах - dup(), fork(), etc.

Если же вопрос в том, чтобы узнать, каким fd воспользовался процесс именно в ЭТОМ syscall'е, то можно попробовать что-то вроде:

(((struct pt_regs *)(THREAD_SIZE + (char*)current)) - 1) -> ebx

Вопрос: а зачем????? Есть подозрение, что вы пытаетесь сделать что-то в принципе неправильное :)

Повторю, я может не понял чего.

idle ★★★★★
()

to idle: Спасибо, На вопрос зачем - можно ответить односложно - для повышения производительности. Этот драйвер обслуживает адаптер промышленной сети CAN - сеть реального времени с короткими до 12-20 байт кадрами, скорость передачи до 10Мбит/сек. Драйвер поддерживает до 8 очередей с приоритетами на прием кадров, по которым принятые кадры раскидываются. Поэтому на пользовательский уровень надо выдавать номер канала (контроллера) (это либо минор либо fd) который получил кадр и номер очереди в которую этот кадр попал. Задача - свести к минимуму количество переключений контекста между пользовательским уровнем и ядром. Select() - это лишнее переключение контекста (+ не узнать номер очереди), поэтому сейчас используются RT сигналы (siginfo_t) для передачи этой информации (тем более что без сигналов в принципе нельзя - сеть система существенно асинхронная). lm2000 PS: chto-to s parolem ne to :-( Сейчас передается минор и номер очереди. Если передавать fd то можно избежать линейного поиска по массиву соответствия minor->fd в пользовательской программе, которая работает с несколькими каналами одновременно.

anonymous
()

А что мешает эту информацию "канала (контроллера) (это либо минор либо fd) который получил кадр и номер очереди в которую этот кадр попал" помещать в заголвке буфера, который все равно будет читатся пользователем через read?

Ogr
()

to: Ogr
Ничего не мешает, но необходимо получать информацию о приходе пакета асинхронно и сразу узнавать открытый fd (он же номер канала) и очереди, чтобы не городить лишние select(). 
Повторюсь, что пакеты короткие, и поэтому приходят очень часто.

lm2000

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.