Вход 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 и TEST_IOCTL_ONE, модуль работает правильно. Однако, когда я звоню PASS_STRUCT_ARRAY_SIZE, система зависает.

Код пользовательского пространства таков,

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

Что я могу делать неправильно?


person user340    schedule 26.08.2012    source источник
comment
Вы никогда не должны передавать int через ioctl, потому что это может быть разный размер в пространстве ядра и пользовательском пространстве.   -  person mpe    schedule 26.08.2012


Ответы (1)


Извините, мой предыдущий ответ был неправильным. Поскольку аргумент является целым числом, вы должны просто использовать его без copy_from_user:

SIZE = arg;

Вам нужно только copy_from_user, когда аргумент является указателем.

person cnicutar    schedule 26.08.2012
comment
@kani Тогда это не сработало :-? Я не уверен, я не делал этого в то время. - person cnicutar; 26.08.2012
comment
Спасибо :) новый работает ... на самом деле ваш предыдущий ответ был полезен, я хочу передать (следующий шаг) структуру из пользовательского пространства, проблема с адресом памяти полезна :) - person user340; 26.08.2012