Проблема с примером chardev.c из Руководства программиста модуля ядра Linux - PullRequest
2 голосов
/ 30 октября 2009

Я скомпилировал и запустил пример chardev.c из lkmpg и при записи на устройство получил неожиданную ошибку:

anon@anon:~/lkmpg$ sudo echo "hi" > /dev/chardev
bash: /dev/chardev: Permission denied

Функция записи модуля выглядит следующим образом:

/*  
 * Called when a process writes to dev file: echo "hi" > /dev/chardev 
 */
static ssize_t
device_write(struct file *filp, const char *buff, size_t len, loff_t * off)
{
    printk(KERN_ALERT "Sorry, this operation isn't supported.\n");
    return -EINVAL;
}

Я не получаю ожидаемую ошибку недопустимой операции, и ошибка напечатана в /var/log/messages.

Я могу читать с устройства без проблем, получая ожидаемые результаты:

anon@anon:~/lkmpg$ cat /dev/chardev 
I already told you 6 times Hello world!

Устройство / dev / chardev создается вручную с помощью:

sudo mknod /dev/chardev c 252 0

В чем дело?

- Изменить -

Видимо, когда я mknod для создания устройства, он получает следующие разрешения:

crw-r--r-- 1 root root 252, 0 2009-10-30 09:27 /dev/chardev. 

Как только я сделал sudo chmod a+w /dev/chardev, драйвер работал как положено.

Тем не менее, люди говорили, что делать это неправильно.

Каков правильный курс действий и почему?

Ответы [ 2 ]

5 голосов
/ 31 октября 2009

Действительно, очень, очень простой и простой пример того, как реализовать драйверы персонажей, можно найти в drivers/watchdog/softdog.c

Вы можете сравнить свой код с этим примером, который показывает вам, как сделать следующее:

  • Чтение с устройства
  • Запись на устройство
  • Представить интерфейс ioctl через устройство

Хотя softdog - очень полезный инструмент, он так же полезен, как и все остальное. Алан Кокс бросил все вместе, так что это хороший пример более «правильной» реализации.

Если вы можете опубликовать весь источник в своем модуле, мы можем помочь вам выяснить, почему ваша функция вводится не так, как ожидалось.

Обновление:

совершенно приемлемо, чтобы позволить привилегированным пользователям писать на символьные устройства! Повторяю, вполне приемлемо , чтобы позволить привилегированным пользователям писать на символьные устройства! Если бы это было не так, такие вещи, как FUSE, модемы, USB-гаджеты, CD-ROM и другие, потребовали бы root-доступа для использования.

Что вы можете сделать, так это воспользоваться групповым членством. То есть в Ubuntu пользователи, которым разрешено использовать FUSE (файловая система в пространстве пользователя), должны принадлежать к группе 'fuse', которая разрешает детальный доступ к тому, кто может и не может использовать эту функцию. Точно так же в некоторых моих системах используется QRNG (генератор квантовых случайных чисел) ... и (как вы уже догадались) символьное устройство. Мне нужно разрешить PHP доступ к этому устройству, поэтому я:

  • Создать группу QRNG
  • Убедитесь, что PHP работает как пользователь (не анонимный системный пользователь)
  • Добавление пользователей, владеющих приложениями, которым необходим доступ к устройству, в группу QRNG

Надеюсь, это прояснит:)

4 голосов
/ 30 октября 2009

Я думаю, что проблема в том, что команда, которую вы дали написать, неверна. Попробуйте

#sudo sh -c "echo "hi" > /dev/chardev"

Если вы хотите запустить несколько команд с помощью sudo, используйте команду, как показано выше. При этом вам не нужно делать chmod и изменять его права доступа. Надеюсь это поможет.

...