我已经编写了一个设备驱动程序,需要向它传递一个 int 值。为此我正在使用 copy_from_user()。这是我到目前为止所做的,
#define MY_MAGIC 'G'
#define TEST_IOCTL _IO(MY_MAGIC, 0)
#define PASS_STRUCT_ARRAY_SIZE _IOW(MY_MAGIC, 1, int )
#define TEST_IOCTL_ONE _IO(MY_MAGIC, 2)
int major;
int device_ioctl(struct inode *inode, struct file *filep, unsigned int cmd, unsigned long arg){
int ret, SIZE;
switch(cmd){
case TEST_IOCTL:
printk("NO argument IOCTL called\n");
break;
case PASS_STRUCT_ARRAY_SIZE:
printk("Inside PASS_STRUCT_ARRAY_SIZE\n");
ret = copy_from_user(SIZE, arg, sizeof(int));
if(ret < 0){
printk("Error in PASS_STRUCT_ARRAY_SIZE\n");
return -1;
}
printk("Struct Array Size : %d\n",SIZE);
break;
case TEST_IOCTL_ONE:
printk("NO argument IOCTL_ONE called\n");
break;
default :
return -ENOTTY;
}
return 0;
}
当我调用 TEST_IOCTL
和 TEST_IOCTL_ONE
时,模块工作正常。但是,当我调用 PASS_STRUCT_ARRAY_SIZE
时,系统会卡住。
用户空间代码是这样的,
if(ioctl(fd, PASS_STRUCT_ARRAY_SIZE, 10) < 0){
perror("PASS_STRUCT_ARRAY_SIZE : ");
return -1;
}
我做错了什么?
最佳答案
对不起,我之前的回答是错误的。由于参数是一个整数,您应该只使用它而无需 copy_from_user
:
SIZE = arg;
当参数是指针时,您只需要copy_from_user
。
关于linux - 设备驱动程序 IOCTL 传递 int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12128546/