我基本上是想弄清楚如何从零开始制作一个 GUI,只需要 linux 内核和 C 语言编程。
我不想从头开始创建 GUI 桌面环境,但我想创建一些桌面应用程序,并且在我搜索知识的过程中,我能够找到的所有信息都是关于 GUI API 和工具包的。我想知道,至少为了了解如何制作 linux GUI 的基础知识,如何在不使用任何 API 或工具包的情况下制作 GUI 环境或 GUI 应用程序。
我想知道例如:
现有的 API 和工具包通过对内核的系统调用来工作(内核在最低级别负责以像素或其他方式构建 GUI 图像)
这些工具包执行系统调用,只是将信息传递给屏幕驱动程序(是否有标准格式用于发送所有屏幕驱动程序都遵守的此信息,或者 GUI API 是否需要能够根据特定屏幕/驱动程序以多种格式输出此信息? ) 如果这大致属实,那么原始 linux 内核是否通常只是以 8 位字符的形式将信息发送到屏幕?
我真的很想了解 linux 内核之间发生了什么,以及我在屏幕上看到的内容(如果您知道,控制/信息流通过软件和硬件,信息采用什么格式等)。我将非常感谢详细的解释,我知道这可能是一个足够详细的解释,但我认为这样的解释对于其他好奇和学习的人来说是一个很好的资源。对于上下文,我是一名 3 年级的 comp sci 学生,最近开始在我的系统编程课程中使用 C 进行编程,并且我对 linux 和编程有中级(或者我会这样描述)理解。再次感谢任何帮助我的人!!!
它是如何工作的(Gnu/Linux + X11)
概述
它看起来像这样(不是按比例绘制)
我们从图中看到,X11 主要与硬件对话。但是,它需要通过内核进行对话,才能最初访问该硬件。
我对细节有点模糊(我认为自从我上次研究它以来它发生了变化)。有一个设备
/dev/mem
可以访问整个内存(我认为是物理内存),因为大多数图形硬件都是内存映射的,这个文件(看到一切都是文件)可以用来访问它。X11 会打开文件(内核使用文件权限来查看是否可以这样做),然后 X11 使用mmap
将文件映射到虚拟内存(使其看起来像内存),现在内存看起来像内存。之后mmap
,不涉及内核。X11 需要了解各种图形硬件,因为它通过内存直接访问它。
(这可能会发生变化,特别是安全模型,可能不再允许访问所有内存。)
Linux
底部是 Linux(内核):系统的一小部分。它提供对硬件的访问,并实现安全性。
牛羚
然后是 Gnu(库;bash;工具:ls 等;C 编译器等)。大多数操作系统。
X11 服务器 (egxorg)
然后是基本 GUI 子系统 X11(或 Wayland,或...)。这在用户域(内核之外)运行:它只是另一个进程,具有一些特权。内核不参与,除了提供对硬件的访问权限。并提供进程间通信,使其他进程可以与X11服务器进行通信。
X11 库
一个简单的抽象,允许您为 X11 编写代码。
图形用户界面库
接下来是 qt、gtk、sdl 等库——它们使 X11 的使用变得更容易,并且可以在其他系统上工作,例如 Wayland、Microsoft 的 Windows 或 MacOS。
应用
应用程序位于库之上。
一些低级入口点,用于编程
xlib
使用 xlib,是了解 X11 的好方法。但是,请先阅读有关 X11 的信息。
SDL
SDL 将为您提供低级访问权限,直接访问位平面供您直接绘制。
走低
如果您想降低,那么我不确定当前有哪些好的选择,但这里有一些想法。
链接
X11
https://en.wikipedia.org/wiki/X_Window_System
现代方式
写这篇文章引起了我的兴趣,所以我看看现代快速的方法是什么。以下是一些链接:
https://blogs.igalia.com/itoral/2014/07/29/a-brief-introduction-to-the-linux-graphics-stack/
ctrl-alt-delor 的回答让您对一般架构有一个很好的概述。对于更实际的方法,我给你一个关于“只有 linux 内核和 C 编程”的答案。
我喜欢不时地直接写入帧缓冲区。帧缓冲设备驱动程序将为您完成所有繁琐的接近硬件的“最终将如何出现在屏幕上”的事情。您可以使用 root shell 立即执行此操作:
它将我的 32 位帧缓冲区上的第一个(左上角)像素设置为红色:
您完全可以在 C 中通过打开 /dev/fb0 并写入字节来执行此操作。内存映射可以成为你的朋友。这只能在没有 X 服务器或虚拟控制台的情况下工作。按 Ctrl+Alt+F1 访问它。
PS:像鼠标移动这样的随机数据可视化也很有趣:
PPS:还请注意,几乎所有现实世界的桌面应用程序都希望更直接地访问硬件以获得一些花哨的东西,例如用于绘图、3D 和视频渲染的硬件加速。简单的帧缓冲设备不能很好地做到这一点。
我强烈建议从ncurses开始。
与更复杂的图形系统不同,它完全基于文本,因此无需拘泥于屏幕驱动程序和图形库的细节。然而,将窗口放在屏幕上、在窗口之间移动焦点等基本原则仍然适用。而且您仍然可以在单字符块和 ASCII 艺术水平上进行一些绘图。
当然,您仍然在库之上构建它,但它是一个您可以轻松理解的库。更重要的是,它是一个库,其中的源代码是免费提供的,有很好的文档记录,而且如果你想阅读它也不会太难懂。如果你愿意,你甚至可以自己修改它。或者您可以查看其中的所有库函数以找到 API 所需的内容,然后根据该设计从头开始编写它。
SunOS 5 有 DGA 库,它提供对不同 cg[3,6,14]、TCX 或 LEO 图形适配器的设备独立访问,这也是 SPARC 机器上支持 DOOM 的东西。
cg6 是 8 位的,通常在 X11 中用作伪彩色视觉,但它也可以提供 8 位真彩色,而 tcx 和 leo 是 24 位加速 3d 显示帧缓冲区(伪彩色 = videoram 中的一个字节是大提供 3x8 RGB 值的表格,表格的内容可以轻松更改。)cg3 具有大致相同的能力,但没有加速(cg6 设计者随后开始了另一家公司...... nVidia。)
后期的设备,如基于 ATI Rage Pro 芯片组的 PGX,不能同时支持真彩色和伪彩色,而早期的设备则支持。这迫使用户在为伪彩色模型编写的旧应用程序(或如果可能的话升级软件)和仅运行面向真彩色的应用程序之间做出选择。
伪彩色的存在基本上是因为在 80 年代中期直到 1992 年左右,videoram 非常昂贵。支持可用工作站类型分辨率的彩色显示器也相当昂贵(1984 年的 Sun 2 黑白分辨率为 1152x864,而 1989 年左右的 MG1 具有 1600x1280 但黑白分辨率。)
我写这篇文章是因为我想展示 X11 必须支持的不同要求。