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

Posted

技术标签:

【中文标题】Linux 内核 4.8.0-53-generic Linux Mint 64 位中 IOCTL 函数的不兼容指针初始化错误【英文标题】:Error initialization from incompatible pointer of IOCTL function in Linux kernel 4.8.0-53-generic Linux Mint 64 bit 【发布时间】:2017-10-28 10:24:39 【问题描述】:

我在使用Ioctl 命令编写字符设备模块时出错。

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, 
;

【问题讨论】:

static long my_ioctl(struct file *f,unsigned int cm,unsigned long arg[b]) 是错误的。最后一个参数必须是unsigned long arg 而不是arg[b]。如果您的最后一个参数被设计为指向某种数组的指针,则需要相应地将其转换为 in 您的函数。 我已经修复了格式(使代码可读) 嗨@BronislavElizavetin 谢谢你的回答。我对最后一个论点感到抱歉。这是一个错误。它是 unsigned long arg[],我进行了一些测试,它适用于低于内核版本 4.8 的版本。不幸的是,它不适用于我自己的 linux 内核版本 4.8 -64 位。 @ThomasFritsch 很抱歉忘记了您的帮助。非常感谢! @BronislavElizavetin 首先,我很抱歉我的愚蠢问题。但是如果我将 arg[] 替换为 arg,它会显示一个错误:'arg' redeclared as different kind of symbol unsigned long arg[3]。我该如何解决? 【参考方案1】:

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

..可选的 arg 参数以 unsigned long 的形式传递,无论它是由用户作为整数还是指针给出。

(Linux Device Drivers 3, Chapter 6, Section 1)

另外,在函数体声明一个与参数之一同名的变量是错误的。请为unsigned long arg[3]; 选择其他名称。

【讨论】:

以上是关于Linux 内核 4.8.0-53-generic Linux Mint 64 位中 IOCTL 函数的不兼容指针初始化错误的主要内容,如果未能解决你的问题,请参考以下文章

Linux 内核Linux 内核源码结构 ( 下载 Linux 内核源码 | 使用 VSCode 阅读 Linux 内核源码 )

Linux 内核编译 Linux 内核 ① ( 下载指定版本的 Linux 内核源码 | Linux 内核版本号含义 | 主版本号 | 次版本号 | 小版本号 | 稳定版本 )

Linux内核设计与实现的目录

Linux内核开发与Linux驱动开发有啥关系?

Linux 内核编译 Linux 内核 ⑦ ( 安装内核模块 | 安装内核 | 重启系统 | 查看当前内核版本 )

Linux 内核Linux 内核特性 ( 组织形式 | 进程调度 | 内核线程 | 多平台虚拟内存管理 | 虚拟文件系统 | 内核模块机制 | 定制系统调用 | 网络模块架构 )