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