2014-09-03 2 views
0

Я пытаюсь передать два аргумента из программы пользовательского пространства, чтобы изменить размер буфера и количество буфера на устройстве char. Я попробовал несколько актеров я получаю всегда отбрасывать ошибка позиционированияПередача нескольких аргументов ioct

error: cannot convert to a pointer type copy_from_user((char *)msg, arg, sizeof(msg)); 

или

cannot convert to a pointer typecopy_from_user((char *)msg, (char *)arg, sizeof(msg)); 

header.h

struct ioctl_arguments { 
     int block_number; 
     int block_size; 
}; 

модуль ядра и программа с включают как header.h

c program

#define DEVICE_PATH "/dev/driver" 
#define MAGIC_NO 'k' 
struct ioctl_arguments args; 
#define IOCTL_CMD _IOWR(MAGIC_NO, 0, args) 
int main() 
{ 
    int fd; 
    args.block_number = 10; 
    args.block_size = 10; 
    fd = open(DEVICE_PATH, O_RDWR); 
    ioctl(fd, IOCTL_CMD,&args); 
    close(fd); 
    return 0; 
} 

драйвер

static int BlockNumber = 20; 
static int BlockSize = 5; 
struct ioctl_arguments msg; 

static int sample_ioctl (struct file *filp, unsigned int cmd, unsigned long arg); 

static int sample_ioctl (struct file *filp, unsigned int cmd, unsigned long arg) 
{ 

    // copy two parameters from outside, we use struct 
    copy_from_user((char *)msg, (char *)arg, sizeof(msg)); 
+0

Возможный дубликат [char device catch multiple (int) ioctl-arguments] (https://stackoverflow.com/questions/8849445/char-device-catch-multiple-int-ioctl-arguments) –

ответ

1

В функции драйвера устройства arg в действительности указатель, так что приведение в силе, но msg не указатель, поэтому приведение к указателю не является действительным. Вы должны использовать &msg (точно так же, как вы используете &args в коде пользовательского пространства).