Не могли бы вы помочь мне определить, что здесь происходит не так? [...] Ошибка: ошибка: инициализация из несовместимого типа указателя [-Werror = несовместимые типы-указателей] .read = dev_read, /home/csvb/OS/assign4/hello2.c:36:12: note: (близка к инициализации 'fops.read') cc1: некоторые предупреждения рассматриваются как ошибки
Диагностика c мне кажется довольно ясной. Он локализует проблему в строке 36 файла /home/csvb/OS/assign4/hello2.c при инициализации члена read
объекта, обозначенного fops
; в частности, обозначена инициализация .read = dev_read
. «Инициализация из несовместимого типа указателя» означает именно то, что говорится: тип dev_read
несовместим с типом fops.read
. И такая проблема по умолчанию заслуживает предупреждения, но параметры компиляции указывают, что вместо этого она вызывает ошибку.
Вообще говоря, вы должны проверить документы или, по крайней мере, заголовки, для версии ядра, которую вы используете. Вы пытаетесь определить, что ожидается, но даже без этого можно с уверенностью предположить, что ни один из параметров не будет иметь тип struct GraphData *
. Это, безусловно, одна несовместимость.
Эта конкретная деталь интерфейса драйвера устройства ядра такая же, как и в последних предварительных выпусках ядра 5.7, поскольку она была, по крайней мере, еще в далеком ядре 2.4, поэтому даже не зная, на какую версию ядра вы нацеливаетесь, я уверен, что скажу, что функция чтения символьного устройства должна иметь такую сигнатуру:
ssize_t dev_read_fn(struct file *, char __user *, size_t, loff_t *);
Кроме того, она отличается от вашей функции типом второй параметр, он принимает четыре параметров, а не три.