帧缓冲区是允许简化屏幕界面的设备文件。例如,在连接了 HDMI 显示器的 RaspberryPi 上运行以下代码:
cat /dev/urandom > /dev/fb1
有一些命令 ( fbi
, fim
) 允许将完整图像注入帧缓冲区。
互联网上有多种资源(ref1、ref2、ref3)试图或多或少地成功解释如何添加系统服务,这将导致屏幕上出现图像。
这些资源中的一个共同点是tty
与framebuffer
. (即两者都fbi
可以fim
选择传递 a tty
)。
我的假设是 atty
是与 a 分开的概念framebuffer
。使用tty
向framebuffer
用户输出内容,但帧缓冲区与tty
.
tty
a和 a背后是否存在隐藏的关系,framebuffer
这可以解释为什么将图像打印到 a 的命令framebuffer
似乎依赖于 a tty
?
“隐藏关系”与 Linux 支持多个虚拟终端有关,这意味着帧缓冲区可以被多个不同的终端使用。直接操作帧缓冲区的程序需要知道当前哪个终端拥有帧缓冲区:
当这样的程序启动时,它需要存储当前的终端配置,然后告诉内核它想直接控制显示器(它使用 切换到“图形模式” )
KDSETMODE
ioctl
并根据需要设置帧缓冲区(例如fbi
,在平移)。它还需要告诉内核它想被告知虚拟终端开关(当用户按下时)。CtrlAltFn如果用户切换终端,内核将告诉正在运行的程序;程序需要恢复终端设置并放弃对终端 (
VT_RELDISP
) 的控制,才能真正进行切换。如果用户切换回运行基于帧缓冲区的程序的终端,内核会再次告知程序,程序会根据需要设置终端和帧缓冲区并恢复其显示。
这在VT 切换的工作原理中有详细描述。