如何在 Linux 中添加额外的帧缓冲设备?

Gol*_*nks 20 linux framebuffer

我正在运行 Ubuntu 12.04 LTS 作为家庭 NAS 服务器,没有 X。最近我开始调整它以用作视频播放媒体设备。在这一点上安装 X 可能更容易,但我决定尝试使用帧缓冲播放的 mplayer。它奏效了,一切都很好。

然而,出于好奇,也许还有实际后果,我不能停止思考帧缓冲区。似乎只有一个帧缓冲设备,/dev/fb0. (顺便说一句。我正在使用 vesafs 驱动程序)如果我运行多个使用帧缓冲区的程序,就会出现混乱。例如,从 fbterm 运行 mplayer 只会使其崩溃。奇怪的是,fbi 图像查看器设法以某种方式查看图像。显然程序不能共享设备,毕竟没有窗口系统。

那么,(vesa) fb 设备的数量是否仅限于硬件显示设备?或者原则上可以有更多,比如有多个 ttys?是否会添加更多帮助同时运行使用它们的软件?我怎么能添加更多?

此外,帧缓冲区如何连接到 ttys 的逻辑对我来说也不太清楚......例如,mplayer 在每个 tty 上显示它的视频帧,但 fbi 没有。此外,Ubuntu 默认控制台 (fbcon?) 显示在视频叠加层后面,这让我感到很奇怪。这是怎么回事?

Gol*_*nks 23

由于还没有人回答,经过数小时的谷歌搜索和测试,我对这个主题有了一些了解,我要回答它......

由于帧缓冲设备接口是一个非常通用的接口,原则上可以有更多的 fb 设备。但是,由于我使用的 VESA 驱动程序提供了某个硬件设备和帧缓冲设备文件之间的直接连接,因此拥有比拥有更多真实设备的设备更多的设备是没有意义的。

有一个用于虚拟帧缓冲设备的驱动程序,vfb。(注意:与 xvfb 不同,xvfb 是 X 的虚拟帧缓冲区)我自己还没有测试过,但是使用虚拟设备可以拥有任意数量的 fb 设备。我还认为,原则上没有什么可以阻止将虚拟设备传输到硬件帧缓冲设备,从而允许构建帧缓冲多路复用器

关于帧缓冲区和 tty 之间的连接:没有。帧缓冲区只是简单地绘制到屏幕上,不考虑任何内容。

最初让我感到困惑的是 fbi 图像查看器的行为。事实证明,它巧妙地检查了它正在运行的 tty 是否打开,并据此绘制到帧缓冲区。(这就是为什么它拒绝通过 SSH 运行,与 mplayer 不同——它不接受伪终端。)但是类似多路复用器的功能与帧缓冲区本身无关。

如果有多个进程写入帧缓冲区,它们不会相互阻塞。事实证明,我之前同时使用多个 fb 程序的问题(崩溃等)根本与帧缓冲区无关。使用 fbterm 终端并从中运行 mplayer:没问题。fbterm 和 fbcon 终端以及 fbi 图像查看器仅在某些内容更新时才绘制到缓冲区,因此 mplayer 几乎 100% 的时间都在屏幕上占据主导地位。但是,如果您尝试运行两个 mplayer,您将获得一个闪烁的视图,显示一个和另一个的帧,因为它们试图绘制到具有竞争条件的缓冲区。

一些有用的链接:

http://moi.vonos.net/linux/framebuffer-drivers/

https://www.kernel.org/doc/Documentation/fb/framebuffer.txt