![如何使用 kms/drm 在 Linux 中设置视频模式?](https://linux22.com/image/1070/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20kms%2Fdrm%20%E5%9C%A8%20Linux%20%E4%B8%AD%E8%AE%BE%E7%BD%AE%E8%A7%86%E9%A2%91%E6%A8%A1%E5%BC%8F%EF%BC%9F.png)
如何在 Linux 中以低级方式设置视频模式?据我所知,用户空间的最低层是通过 DRM 请求 KMS。它是否正确?如果是这样,我如何实现模式切换并访问相关的“视频内存”?
答案1
KMS(对于那些还没有听说过它的人来说,内核模式设置)是通过内核模式视频驱动程序实现的。这些内核模式视频驱动程序配置帧缓冲区显示,默认情况下是所连接显示器的本机分辨率。如果连接了多个显示器,则每个显示器都将获得其本机分辨率,并且虚拟控制台将被限制为两台显示器的最小宽度和高度。
因为使用KMS会产生framebuffer,所以framebuffer配置项应该工作。我无法在我当前所在的系统上验证这一点,因为它没有 KMS 驱动程序。但稍后我将使用 KMS 进入系统,我会通知您。
看关于使用 video= 帧缓冲区启动参数设置模式的内核文档了解更多信息。
答案2
我不确定你是否真的知道你的要求,否则你会以一种可以回答的方式表达它。 ...但我会尽力回答你的问题。
您想设置一种模式并腾出一些“视频内存”吗?就像旧的 dos 模式 X 天?如果这是您想要的,您需要使用帧缓冲区进行编程。话虽如此,使用 DirectFB 会更好。 DirectFB 就像帧缓冲区上的一个非常薄的层,具有加速功能。它的级别很低,说实话,它的级别低到你应该合理地想要编写应用程序。您将能够设置模式,并以更底层的方式进行控制。如果你想要直接的直接风格控制,你必须编写原始帧缓冲区,你基本上映射出一些视频内存。如果您觉得 Framebuffer 性能不佳,请查看 DirectFB。如果有人加载了 KMS 驱动程序,则他们的帧缓冲区是通过 KMS/libdrm 设置的。
至于 libdrm,它是一个用于使用内核 DRM 的用户空间库。它不是一个帧缓冲区,它不是一个应用程序API,它是一个系统设备库。如果您想创建新的设备驱动程序,libdrm 是绝对的选择。例如,libdrm-radeon。 Linux不是DOS,直接与硬件通信的唯一方法是通过内核。所有普通应用程序都不会直接将代码发送到硬件,它必须在某些 lib/API/call 中被删除。有些项目出于学术/实验目的而采用了内核内方法,例如 FBUI。
我希望我至少可以为您指出正确的方向,如果没有,您应该发表评论并更新您的问题。我从这个问题提出以来就一直在关注这个问题,这个问题至少是在两次迁移前发生的,而且还没有更接近的答案。没有更多信息,真的无话可说。