从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,
};
答
在函数原型的第三个参数unsigned long arg[b]
是可疑的。即使它应该是一个指针,它应该只是unsigned long arg
。很容易将其转换为函数体内的感兴趣类型。
..可选的arg参数以无符号长整型的形式传递,无论它是由用户给出的整数还是指针。
(Linux Device Drivers 3, Chapter 6, Section 1)
此外,这是错误的声明一个变量内函数体具有相同的名称作为参数之一。请为unsigned long arg[3];
选择另一个名称。
'static long my_ioctl(struct file * f,unsigned int cm,unsigned long arg [b])'是错误的。最后一个参数必须是'unsigned long arg'而不是'arg [b]'。如果你的最后一个参数被设计成一个指向某种数组的指针,你需要在*你的函数中相应地转换它*。 –
我已修复格式(使代码可读) –
嗨@BronislavElizavetin谢谢你的回答。我对最后一个论点感到抱歉。这是一个错误。它是unsigned long arg [],我做了一些测试,它的工作原理比内核版本4.8低。不幸的是,它不适用于我自己的Linux内核版本4.8 -64位。 –