0

В нашей системе мы используем mmap() в файле /dev/mem для доступа к устройству, подключенному к памяти. Однако для использования этого файла необходимо запустить приложение в режиме суперпользователя (sudo) для записи на физическое устройство. Мы ищем способ избавиться от этого ограничения.Как дублировать файл устройства Linux?

Предположительно, можно изменить права доступа к файлу устройства. Однако это не рекомендуемое решение.

Одно из предложений, которое у нас было, заключается в том, что вместо того, чтобы писать новый драйвер устройства полного режима для оборудования, мы можем дублировать устройство /dev/mem, меняя его разрешение на запись и использовать mmap() на новом устройстве.

Чтение нескольких страниц руководства, я нашел команду mknod. Поэтому я использовал его для создания специального файла, emem, с аналогичными атрибутами в файле /dev/mem (особенно, в Малой и Малой версиях устройства). Используя новый файл в моей программе, мне все еще нужен duso. Итак, я изменил свои атрибуты на полные права доступа к r/w, но это не изменило необходимости в sudo.

Далее я попытался изменить разрешения dev/mem на 0777, но это тоже не помогло.

Это приводит к следующим вопросам:

  1. ли необходимость sudo привилегий происходит от использования mmap() или от конкретных устройств, это карты?

  2. Если первое, как устранить это?

  3. Если последнее, как я могу дублировать функциональность /dev/mem с полными разрешениями?

+1

Правильный способ сделать это - либо сделать драйвер ядра, который разрешает доступ ** только ** к конкретным ресурсам, либо запустить демон пользователя в качестве пользователя, который прокси-серверы фильтруют с тем же ограничением. –

+0

@ChrisStratton - спасибо. В долгосрочной перспективе писать правильный драйвер - это мое намерение. Прямо сейчас, из-за нехватки времени (и опыта программирования в режиме ядра), я ищу удобное обходное решение. – ysap

+0

Дублирование узла устройства бессмысленно, так как оно будет иметь все те же проблемы и последствия, что и изменение разрешений существующего узла. –

ответ

2

Согласно http://www.raspberrypi.org/phpBB3/viewtopic.php?f=29&t=22515

Чтобы открыть/Dev/MEM вам нужно как обычные права доступа к этому файлу устройства и возможностей безопасности CAP_SYS_RAWIO или быть корнем. Не обойти это, потому что полный доступ к памяти позволяет намного больше, чем просто GPIO. Он имеет огромные последствия для безопасности.

Это, по-видимому, проверено внутри драйвера устройства mem.

Решение состоит в том, чтобы предоставить пользователям, которые должны иметь возможность доступа/dev/mem к возможностям CAP_SYS_RAWIO, а также разместить их в группе пользователей kmem (у которой есть доступ на чтение к устройству).

+0

Правильно: в текущих ядрах вызов 'open' на'/dev/mem' проверяется с помощью: 'return able (CAP_SYS_RAWIO)? 0: -EPERM; '. См. «Drivers/char/mem.c». – duskwuff

+0

Спасибо. поэтому это означает, что я не могу использовать '/ dev/mem' для этой цели. Затем, как я могу дублировать сам драйвер устройства и настроить его на мои нужды? – ysap

+0

.. подождите - в соответствии с @duskwuff, если я правильно понимаю, эта защита ассимилируется в самом коде драйвера, верно? – ysap

Смежные вопросы