Путаница относительно того, как именно настраиваются файловые операции для Linux Символьного драйвера устройства - PullRequest
1 голос
/ 01 апреля 2020

Я сейчас читаю Linux Том 3 драйверов устройств от Oreilly, и у меня возник вопрос о настройке файловых операций для конкретного c драйвера устройства.

Насколько я понимаю, в драйвере символьного устройства в Linux структуры cdev должны быть выделены инициализированными в функции инициализации драйвера устройства и переданы в int cdev_add(struct cdev *dev, dev_t num, unsigned int count);.

Как только все это будет сделано, ядро ​​теперь ассоциирует файловые операции, указанные в struct file_operations, с добавленным struct cdev.

Моя путаница возникает, когда я пытаюсь понять, что происходит в функции драйверов устройства open(struct inode *, struct file *). Нам дан как указатель файла, так и указатель inode. Обе эти структуры содержат поле struct file_operations *, по одному в inode -> i_cdev -> ops и file -> f_op.

Эти поля ссылаются на одну и ту же структуру file_operations для каждого устройства?

Я также понимаю, что могу изменить значение структуры file_operations. Если я решу отредактировать поле в структуре, будут ли отражены изменения после выхода из функции open()? Если да, в чем смысл этой функциональности?

Извините, если я слишком много спрашиваю в этом посте. Любая помощь будет принята с благодарностью!

1 Ответ

0 голосов
/ 02 апреля 2020

Комментарий Иана Эбботта выше в основном отвечает на мой вопрос.

К тому моменту, когда функция open() перейдет в режим, file->f_op и inode->i_cdev->ops должны указывать на тот же struct file_operations из вашего драйвера. Не рекомендуется изменять содержимое struct file_operations внутри open(), но можно переключить file->f_op, чтобы указать на другой struct file_operations, используя комбинацию fops_get() и replace_fops(). См. misc_open() в "drivers / char / mis c. c" для примера. - Ян Эбботт 10 часов

Спасибо !!

...