从Linux内核4.8.0-53-通用Linux Mint中的IOCTL函数的不兼容指针初始化错误64位

问题描述:

使用Ioctl命令写入char设备模块时发生错误。从Linux内核4.8.0-53-通用Linux Mint中的IOCTL函数的不兼容指针初始化错误64位

static struct file_operations my_fops = 
{ 
    .unlocked_ioctl = my_ioctl, error is here. I can not fix this. 
}; 

注意:请忽略我的所有print_k

请帮我解决这个问题。我感谢你们所有人。

这里是我的代码:

static long my_ioctl(struct file *f,unsigned int cm,unsigned long arg[b]) 
{ 
    int re; 
    unsigned long arg[3]; 

    switch (cm) 
    { 
     case H_ADD:   

      arg[2] = arg[0] + arg[1]; 
      print_k("Driver:Calculating is complete,Result = %d \n",arg[2]); 
     break; 
     case H_SUB: 
      print_k ("Driver: Start ...\n"); 
      arg[2] = arg[0] - arg[1]; 
      print_k("Driver:Calculating is complete,Result = %d \n",arg[2]); 
     break; 
     case H_MULL: 
      print_k ("Driver: Start ...\n"); 
      arg[2] = arg[0] * arg[1]; 
      print_k("Driver:Calculating is complete,Result = %d \n",arg[2]); 
     break; 
     case H_DIV: 
      print_k ("Driver: Start ...\n"); 
      arg[2] = arg[0]/arg[1]; 
      print_k("Driver:Calculating is complete,Result = %d \n",arg[2]); 
     break; 
     default: 
      print_k ("Driver: I don't have this operation!\n"); 
     re = -Er; 
     break; 
     } 
    return re; 
} 

static struct file_operations my_fops = 
{ 
    .unlocked_ioctl = my_ioctl, 
}; 
+1

'static long my_ioctl(struct file * f,unsigned int cm,unsigned long arg [b])'是错误的。最后一个参数必须是'unsigned long arg'而不是'arg [b]'。如果你的最后一个参数被设计成一个指向某种数组的指针,你需要在*你的函数中相应地转换它*。 –

+3

我已修复格式(使代码可读) –

+1

嗨@BronislavElizavetin谢谢你的回答。我对最后一个论点感到抱歉。这是一个错误。它是unsigned long arg [],我做了一些测试,它的工作原理比内核版本4.8低。不幸的是,它不适用于我自己的Linux内核版本4.8 -64位。 –

在函数原型的第三个参数unsigned long arg[b]是可疑的。即使它应该是一个指针,它应该只是unsigned long arg。很容易将其转换为函数体内的感兴趣类型

..可选的arg参数以无符号长整型的形式传递,无论它是由用户给出的整数还是指针。

Linux Device Drivers 3, Chapter 6, Section 1

此外,这是错误的声明一个变量函数体具有相同的名称作为参数之一。请为unsigned long arg[3];选择另一个名称。