Извините за длинное введение, но я не видел других вопросов по этому поводу на SO.
Я играю с DRM (Direct Rendering Manager, оболочка для настройки режима ядра Linux), и мне трудно понять часть его дизайна.
По сути, я могу открыть устройство с графической картой в своем виртуальном терминале, настроить буферы кадров, изменить разъем и его CRTC. Это приводит к тому, что я могу рендерить в VT в облегченном графическом режиме без необходимости в X-сервере (это то, что касается kms, и на самом деле X-сервер использует его внизу).
Затем я хотел реализовать плавное переключение VT, чтобы при нажатии ctrl+alt+f3 и т. д. я мог видеть другие свои консоли. Оказывается, это легко сделать, вызывая ioctl()
с данными из linux/vt.h
и обрабатывая некоторые пользовательские сигналы.
Но затем я попытался переключиться с моей графической программы на работающий X-сервер. Бзз! вообще не работал. X-сервер вообще ничего не рисовал. Немного покопавшись, я обнаружил, что в ядре Linux только одна программа может выполнять настройку режима ядра. Итак, что происходит:
- Я переключаюсь с X на виртуальный терминал
- я запускаю свою программу
- Эта программа входит в графический режим с помощью
drmOpen
,drmModeSetCRTC
и т. д. - Я переключаюсь обратно на X
- X больше не имеет права восстанавливать собственный режим.
Затем я нашел это в исходном коде Wayland: drmDropMaster()
и drmSetMaster()
. Эти функции должны освобождать и восстанавливать привилегии для установки режимов, чтобы X-сервер мог продолжать работать, и после переключения обратно на мою программу он мог взять его оттуда.
Наконец настоящий вопрос. Эти функции требуют привилегий root. Это та часть, которую я не понимаю. Я могу возиться с модами ядра, но я не могу сказать «хорошо, X11, я закончил играть, теперь я даю тебе доступ»? Почему? Или это должно работать в теории, и я просто делаю что-то не так в своем коде? (например, работа с неправильными файловыми дескрипторами или что-то еще.)
Если я попытаюсь запустить свою программу как обычный пользователь, я получу «отказано в доступе». Если я запускаю его как root, он работает нормально - я могу переключиться с X на свою программу и наоборот.
Почему?