设备驱动程序IOCTL传递int

时间:2012-08-26 08:03:11

标签: linux linux-kernel linux-device-driver ioctl

我编写了一个设备驱动程序,需要将一个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&amp; TEST_IOCTL_ONE模块正常运行。但是,当我致电PASS_STRUCT_ARRAY_SIZE时,系统会冻结。

用户空间代码就是这个,

if(ioctl(fd, PASS_STRUCT_ARRAY_SIZE, 10) < 0){
    perror("PASS_STRUCT_ARRAY_SIZE : ");
        return -1;
}

我可以做错什么?

1 个答案:

答案 0 :(得分:1)

抱歉,我之前的回答是错误的。由于参数是一个整数,因此您应该在没有copy_from_user的情况下使用它:

SIZE = arg;

当参数是指针时,您只需要copy_from_user