基本上,我想要做的是允许大多数标准帧缓冲区图形应用程序(至少,任何支持被告知要使用哪个 /dev/fb* 设备的应用程序,或者可以从启动它们的 VT 所使用的帧缓冲区推断出正在使用的帧缓冲区)在多显示器系统中的特定显示器上运行。假设您有一个具有多个显卡的系统,这实际上对于 fbcon 来说很简单……但我想让它与 zaphod 卡一起工作,这目前是不可能的(至少据我大约 3 天的研究告诉我)没有自定义代码。我的意思是,对于 nvidia 卡来说可能是可能的,我不知道,但 radeondrmfb 肯定只为整个卡创建一个 linux 帧缓冲区,所有三个显示器都显示相同的输出。
因此,我得出的理论解决方案是:我使用与此处类似的代码:http://betteros.org/tut/graphics1.php#dumb完善了许多,因为这只是演示代码,向您展示如何以类似于帧缓冲区的方式使用 kms/drm,并根据每个连接器的屏幕尺寸(可能是两倍大小,以允许 y-pan 双缓冲)创建一个对应于每个连接器的缓冲区,该缓冲区报告为活动和连接,然后作为设备驱动程序在内核中注册,为每个缓冲区创建一个 /dev/fb{n} 文件描述符。
然后实现代码,使驱动程序应用程序能够将自己呈现给内核,就好像它是一个帧缓冲设备一样(实际上它现在是这样的,我怀疑这实际上是 radeondrmfb 的运行方式,但我还没有完全从内核源代码中解析 radeon_fb.c,所以我猜测),同时通过 kms/drm 实现 Linux 帧缓冲区所需的所有标准功能。
此时,标准 grub/syslinux 内核参数 fbcon=map: 应该能够将特定 VT 编号的帧缓冲区控制台放置在特定控制台上(例如,如果我的驱动程序设法分配 /dev/fb1、/dev/fb2 和 /dev/fb3,则 fbcon=map:123 应该导致 tty1 显示在与 /dev/fb1 关联的监视器上,tty2 显示在 /dev/fb2 上,依此类推)。此时,启动大多数编写良好的帧缓冲区应用程序(如 fbi)应该将它们连接到调用它们的 fbcon 实例所在的帧缓冲区来启动。
没有任何保证,而且编写不佳的帧缓冲应用程序很可能抓住 /dev/fb0 并毁了你的一天(我怀疑使用 directfb 的任何东西都会导致可怕的事情发生),但理论上这应该让我能够在没有 X 的情况下同时查看 3 个 tty,或者同时操作 3 个图形帧缓冲应用程序,在我的 3 个显示器上全部通过我的单个三头卡。
现在我完全不知所措了,我只能一头扎进去,在这里有效地编写一个设备驱动程序……所以任何有这方面经验的人都能告诉我我的假设是否合理,和/或给我一些建议吗?当然除了:“你疯了,就用 X!”。