linux-kernel - drmDropMaster 需要 root 权限?

标签 linux-kernel x11 wayland

请原谅冗长的介绍,但我在 SO 上没有看到任何其他问题。

我正在使用 DRM(直接渲染管理器,Linux 内核模式设置的包装器),我很难理解其设计的一部分。

基本上,我可以在我的虚拟终端中打开一个显卡设备,设置帧缓冲区,更改连接器及其 CRTC 就好了。这使我能够在不需要 X 服务器的情况下以轻量级图形模式渲染到 VT(这就是 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 切换到我的程序,反之亦然。

    为什么?

    最佳答案

    是的,drmSetMasterdrmDropMaster需要 root 权限,因为它们允许您进行模式设置。否则,任何随机应用程序都可以在您的屏幕上显示它想要的任何内容。韦斯顿通过一个 setuid 启动程序来处理这个问题。 systemd 人员还向 systemd-logind(以 root 身份运行)添加了功能来执行 drm{Set,Drop}Master呼唤你。这就是使最近的 X 服务器能够在没有 root 权限的情况下运行的原因。如果你不介意依赖 systemd,你可以研究一下。

    您的帖子似乎表明您可以在没有 root 权限的情况下成功调用 drmModeSetCRTC。这对我来说没有意义。你确定吗?

    由 X、weston 等显示服务器以及您正在处理的任何服务器调用 drmDropMaster在它调用 VT_RELDISP 之前ioctl,以便下一个 session 可以成功调用drmSetMaster。

    关于linux-kernel - drmDropMaster 需要 root 权限?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29708596/

    相关文章:

    linux - 没有IP的后台进程会受到键盘输入的影响吗?

    linux-kernel - uboot : What is DECLARE_GLOBAL_DATA_PTR?

    c++ - 在 C++ 中使用来自 linux 内核头文件 ioprio.h 的 ioprio_set()

    linux - 适用于所有程序的通用类似 vim 的键盘快捷键

    linux - 如何从命令行/tty 启动 GNOME Wayland session ?

    Wayland 上的 Android 模拟器 : Emulator terminated with exit code 134

    安卓内核错误: undefined reference to `radio_hci_smd_init'

    c++ - X11/Xlib c/c++ 字符到 XKeyEvent 键码

    ffmpeg - 启用音频时帧速率慢 x11

    position - 如何设置Wayland客户端表面在Weston背景中的位置?