Я сейчас читаю 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()
? Если да, в чем смысл этой функциональности?
Извините, если я слишком много спрашиваю в этом посте. Любая помощь будет принята с благодарностью!