2013-12-15 1 views
3

Я пытаюсь разработать драйвер виртуального символьного устройства FIFO в ядре Linux. Я пытаюсь скопировать данные из одного процесса, выполняющегося на одном устройстве, на другой процесс, выполняющийся на другом устройстве того же типа.Получение cat:/dev/mydevice1: Недопустимый аргумент как вывод при попытке связи в драйвере

Я пытался читать mydevice1

cat /dev/mydevice1

и записи MyDevice

echo a > /dev/mydevice

, но я получаю сообщение об ошибке:

cat: /dev/mydevice1: Invalid argument

во втором выход устройства (th at - считывающее устройство).

Это мой код для чтения из устройства

static ssize_t device_read(struct file *file,char *bufStoreData, size_t count, 
loff_t *ppos)      
{ 

    ssize_t val = 1; 
    if(access_mode == WRITE_MY) 
     return -EINVAL; 
    else 
      res = wait_event_interruptible (read_queue, ready_to_read); 

    printk(KERN_ALERT "going to copy\n"); 
    res = copy_from_user(bufStoreData,virtual_device.data,count);   
    printk(KERN_ALERT "copied data %c \n",virtual_device.data[0]); 
    ready_to_read = 0; 
    ready_to_write = 1; 
    wake_up_interruptible (&write_queue); 
     return val; 
} 

Когда я проверяю выход с помощью dmesg, я получаю данные копируются, но я не получаю никакого вывода на device.Getting неверный аргумент в выход в считывающем устройстве.

+2

В считываемом коде вам необходимо скопировать * на * пользователя, а не из * с * пользователя. –

+0

Я согласен с n.m. Когда вы читаете файл, вы читаете его с точки зрения процесса и данные должны быть скопированы из памяти ядра в память пользователя и, следовательно, copy_to_user. –

ответ

1

Соглашаясь с нм и Safayet Ahmed, попробуйте изменить:

res = copy_from_user(bufStoreData,virtual_device.data,count);   

To:

res = copy_to_user(bufStoreData,virtual_device.data,count);   

Номенклатуре может быть немного запутанным, я думаю об этом, как в пользовательском пространстве считывания данных процесса от или записи данных в память ядра.

В немного другой теме функция всегда возвращает 1, независимо от количества прочитанных байтов. Традиционно функции чтения возвращают количество прочитанных байтов или -1 в сочетании с установкой errno, чтобы указать на ошибку. Вы намеренно нарушаете это соглашение?

Кроме того, результат wait_event_interruptible в переменной res перезаписывается каждый раз при выполнении функции.