本文对Linux图形子系统(GUI Subsystem)中常见的一些名词进行概要解释,并阐述它们之间的关系。
QWS
Qt Window System.
X Window System(X窗口系统)
X窗口系统为GUI环境提供基本框架:绘制图像、移动窗口、在发生窗口剪裁时通知客户端程序、处理鼠标和键盘输入等。但它不提供诸如窗口管理器、Widget、桌面系统等组件。
X窗口系统采用C/S架构,由一个X服务器与多个X客户端通讯。X服务器一般运行于本地端(用户端),而X客户端(一般就是应用程序)可能运行在本地端也可能运行在远程计算机上:这和一般的服务器/客户端角色不太一致。我们可以这样想:X服务器“服务”于键盘/鼠标输入和应用程序显示请求。为了使远程计算机上的客户程序显示到本地服务器,一般需以下步骤:
0. 在本地计算机启动X Server
1. 通过telnet或ssh登录到远程计算机
2. 在远程计算机上export DISPLAY=[用户计算机IP或主机名]:0(另一个方法是在登录SSH时启用X转发)
3. 启动客户程序
参考:https://en.wikipedia.org/wiki/X_Window_System
https://en.wikipedia.org/wiki/X_Window_System_protocols_and_architecture
X Window Manager(X窗口管理器)
X Window Manager运行于X Window System之上,控制窗口的位置和外观,例如添加标题栏和窗口边框、在用户点击或拖动时移动或改变窗口大小等。当使用窗口管理器时,X服务器和客户端之间的某些交互会重定向到窗口管理器。例如,当要构建一个新窗口时,该请求将重定向到窗口管理器,由窗口管理器决定这个新窗口的初始位置。又如,因为标题栏和窗口边框是窗口管理器添加的,所以当点击或拖动这些区域时,也由窗口管理器负责进行响应。
参考:https://en.wikipedia.org/wiki/X_window_manager
XDM(X Display Manager)
我们在上面介绍X Window System时曾说过,为了启动一个远程计算机上的图形界面程序,我们首先要通过telnet或ssh登录到远程计算机,这显得有些多此一举:我们希望直接通过图形界面登录到远程计算机。X Display Manage就是一个这样的图形界面登录管理器。当它运行于本地计算机时,它首先启动X Server,然后显示登陆界面,并在用户名和密码正确时启动session,此时它的作用就类似于字符界面下的getty;当它运行于远程计算机时,它的作用就类似于telnet服务器,要求用户名和密码并启动远程session。
参考:https://en.wikipedia.org/wiki/X_display_manager
XDMCP(X Display Manager Control Protocol)
X服务器一般情况下总是等待远端计算机上应用程序发起连接;XDMCP协议使得X服务器能够主动发起连接到显示管理器,以达成类似于telnetd或sshd的效果。
参考:https://en.wikipedia.org/wiki/X_display_manager
Frame Buffer
简单情况下,Frame Buffer就是显卡上的一段内存,这段内存中的数据对应于显示器上的像素点。操作系统一般使用内存映射访问这段内存。有时候也使用一小段端口映射访问这段内存(例如不带LCDC的MCU外接LCD控制器)。
Linux framebuffer(fbdev)
Linux framebuffer是一个硬件无关抽象层,可以在控制台上显示图形(例如企鹅logo)。设备名一般为fb0~fbX。通过ioctl可以获取屏幕大小;然后通过mmap将显存映射到用户区进行读写。有不少软件都使用了fbdev,如MPlayer、gtk+、Qt等。
参考:https://en.wikipedia.org/wiki/Linux_framebuffer
DirectFB
一个软件库,提供图形加速和输入设备抽象层,构造于Linux framebuffer之上。由于其轻巧,可在嵌入式系统上作为X11的一个替代。(然而这个库据说已经寂静很久了)
参考:https://en.wikipedia.org/wiki/DirectFB
DRM(Direct Rendering Manager)
我们上面说到fbdev可以用于绘制图形,但它的工作方式与2D/3D图形加速不搭。fbdev让用户直接操作显存;而图形加速卡则是接受一段图形绘制指令,根据指令在显存中生成待显示的数据。起初,用户程序直接进行派发指令、显存分配与释放等工作,但如果有多个利用硬件加速的程序同时工作,那么不可避免的要打架了。于是就有了DRM,管理对GPU资源如显存、命令队列等的访问。DRM对每个检测到的GPU建立一个设备文件/dev/dri/cardX。可以通过库libdrm简化对该设备文件的访问。
参考:https:///en.wikipedia.org/wiki/Direct_Rendering_Manager
KMS(Kernel Mode Setting)
是DRM的一部分,用于设置显示模式:分辨率、色深、刷新率等等。
参考:https:///en.wikipedia.org/wiki/Direct_Rendering_Manager
KMS device model
MKS模型按如下概念管理输出设备:
- CRTC:这个名称来自于CRT Controller。CRTC读出帧缓冲数据(像素点)并生成显示设备所需的(带时序的)驱动信号(如LCD的CLK、HSYNC、VSYNC、DE、PIXEL等)。CRTC的数量决定了硬件在同一时刻能够接入的独立显示设备的数量。因此,对于有多个输出端子的显卡,每个端子都需要一个CRTC。当然,多个CRTC也可以从同一个帧缓冲中取得数据,生成不同的驱动信号,送往不同的显示设备。
- Connector:一般来说,一个connector对应一个物理连接端子。Connector中存放连接状态、EDID数据、电源状态、所支持的视频模式等信息。
- Encoder:对CRTC产生的驱动信号进行编码,例如将上述LCD的CLK/HSYNC/VSYNC/DE/PIXEL编码为LVDS输出。一个connector同一时刻只能接收来自一个encoder的信号;每种connector只支持某些类型的encoding。
- Plane:plance不是物理上存在的硬件,而是一块内存对象,存放有给CRTC读取的缓冲数据。存有帧缓冲的plance称为primary plane。每个CRTC都有一个与之关联的primary plane。如果显卡支持光标层,CRTC还可能有与之关联的cursor plane;如果CRTC支持从附加的缓冲中读取数据并叠加显示,那么就还有secondary planes。
参考:https:///en.wikipedia.org/wiki/Direct_Rendering_Manager
Wayland
一套更高效的X Server/Client协议。weston是该协议的一个实现。
参考:https:///en.wikipedia.org/wiki/Wayland
OpenGL,eglfs
eglfs:Embeded OpenGL Full Screen。