帧缓冲区和 tty 之间的关系

帧缓冲区和 tty 之间的关系

帧缓冲区是一个设备文件,它允许简化屏幕界面。例如,在连接了 HDMI 显示器的 RaspberryPi 上运行以下代码:

cat /dev/urandom > /dev/fb1

有一些命令 ( fbi, fim) 允许将完整图像注入帧缓冲区。

互联网上有多种资源(参考1,参考2,参考3)尝试或多或少成功地解释如何添加 make systemd 服务,这将在屏幕上生成图像。

这些资源中的一个共同点是tty与 一起提及framebuffer。 (即fbi和都fim可以选择传递给他们 a tty)。


我的假设是 atty是与 a 分开的概念framebuffer。使用向用户tty输出framebuffer内容,但帧缓冲区不以任何方式与tty.

ttya和a 背后是否存在隐藏关系,framebuffer可以解释为什么将图像打印到 a 的命令framebuffer似乎依赖于 a tty

答案1

这种“隐藏关系”与Linux支持多个虚拟终端有关,这意味着帧缓冲区可以被多个不同的终端使用。直接操作帧缓冲区的程序需要知道哪个终端当前拥有帧缓冲区:

  • 当这样的程序启动时,它需要存储当前的终端配置,然后告诉内核它想要直接控制显示(它切换到“图形模式”使用KDSETMODE ioctl)并根据需要设置帧缓冲区(例如在 中fbi,配置平移)。它还需要告诉内核它想要了解虚拟终端开关(当用户按下 时)。CtrlAltFn

  • 如果用户切换终端,内核将通知正在运行的程序;该程序需要恢复终端设置并放弃对终端的控制(VT_RELDISP),然后才能实际进行切换。

  • 如果用户切换回运行基于帧缓冲区的程序的终端,内核会再次通知程序,程序将根据需要设置终端和帧缓冲区并恢复其显示。

这在VT 切换的工作原理

相关内容