ошибка: инициализация из несовместимого типа указателя [-Werror = несовместимые-указатели-типы] .read = dev_read, Linux - PullRequest
0 голосов
/ 30 апреля 2020

Я получаю следующую ошибку в коде моего ядра в linux для файловых операций.

Не могли бы вы помочь мне определить, что происходит здесь?

Код:

struct GraphData{
 unsigned long addr;
 long time;
};
static int position = 0;
struct GraphData buffer[BUFFER_SIZE]; 


static int dev_open(struct inode *in,struct file *f);
static ssize_t dev_read(struct file *f,struct GraphData *out,size_t count);
static int dev_release(struct inode *inod,struct file *f);

static struct file_operations fops =
{
  .read = dev_read,
  .open = dev_open,
  .release = dev_release
};

static int dev_open(struct inode *in, struct file *f){
 printk(KERN_INFO " Device has been opened \n");
 return 0;
}

static int dev_release(struct inode *in, struct file *f){
  printk(KERN_INFO "Device successfully closed\n");
  return 0;
}
static ssize_t dev_read(struct file *f,struct GraphData *out, size_t count)
{
  int ret=0,i=0;

  for(i=0;i<BUFFER_SIZE;i++)
  {
    count = copy_to_user(&out[i],&buffer[i],sizeof(buffer[i]));


    if(count<0)
    {
        printk(KERN_ALERT "Copy!");
        ret = -1;
    }
  }
  return count;
}

Программа ядра имеет файловые операции, устройство может быть передано в буфер и сохраняет данные в буфере.

Пользовательская программа

#define SIZE 500
struct Buffer
{
  unsigned long addr;
  long time;
};
int main()
{
 struct Buffer buf[SIZE];
 int i=0;
 int errorFlag = 0;
 int fp = open("/proc/Probe",O_RDONLY);
 errorFlag = read(fp,buf,1);
    printf("Page Fault Address           Time\n");
 for(i=0;i<SIZE;i++)
 {
    //printf("Read worked the Page fault address is 0x%lx caught at time  %ld\n",buf[i].address,buf[i].time);
    printf("0x%lx           %ld\n",buf[i].addr,buf[i].time);
}
close(fp);
return 0;
}

Пользовательская программа открывает дескриптор файла, читает из устройство и передает буфер для ядра devce для копирования в.

Ошибка: ошибка: инициализация из несовместимого типа указателя [-Werror = несовместимые типы-указателя] .read = dev_read, / home / csvb / OS / assign4 /hello2.c:36:12: note: (рядом с инициализацией для 'fops.read') cc1: некоторые предупреждения рассматриваются как ошибки

1 Ответ

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

Не могли бы вы помочь мне определить, что здесь происходит не так? [...] Ошибка: ошибка: инициализация из несовместимого типа указателя [-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 *);

Кроме того, она отличается от вашей функции типом второй параметр, он принимает четыре параметров, а не три.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...