帧缓冲区是一个设备文件,它允许简化屏幕界面。例如,在连接了 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
.
tty
a和a 背后是否存在隐藏关系,framebuffer
可以解释为什么将图像打印到 a 的命令framebuffer
似乎依赖于 a tty
?
答案1
这种“隐藏关系”与Linux支持多个虚拟终端有关,这意味着帧缓冲区可以被多个不同的终端使用。直接操作帧缓冲区的程序需要知道哪个终端当前拥有帧缓冲区:
当这样的程序启动时,它需要存储当前的终端配置,然后告诉内核它想要直接控制显示(它切换到“图形模式”使用这
KDSETMODE
ioctl
)并根据需要设置帧缓冲区(例如在 中fbi
,配置平移)。它还需要告诉内核它想要了解虚拟终端开关(当用户按下 时)。CtrlAltFn如果用户切换终端,内核将通知正在运行的程序;该程序需要恢复终端设置并放弃对终端的控制(
VT_RELDISP
),然后才能实际进行切换。如果用户切换回运行基于帧缓冲区的程序的终端,内核会再次通知程序,程序将根据需要设置终端和帧缓冲区并恢复其显示。
这在VT 切换的工作原理。