1

デバイス ドライバーを作成しましたが、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;
}

私は何が間違っている可能性がありますか?

4

1 に答える 1

1

申し訳ありませんが、私の前の答えは間違っていました。引数は整数なので、なしで使用する必要がありますcopy_from_user:

SIZE = arg;

copy_from_user引数がポインターの場合にのみ必要です。

于 2012-08-26T08:05:25.403 に答える