6

动机 - 用 C(和汇编,如果需要)编写一个程序,将屏幕上的一个矩形区域涂成红色。

严格的要求 - GNU/Linux 在文本/控制台模式下使用最少的实用程序和界面运行。所以没有 X(或类似 Wayland/Mir 的等价物),没有非默认(内核提供的 POSIX、LSB 等之外)库或接口,除了存在监视器的设备驱动程序之外,没有额外的假设。

实际上,我正在寻找的是有关如何编写程序的信息,该程序最终将通过 VGA 端口和电缆将信号发送到显示器,以将屏幕的特定部分染成红色。

如果这听起来很粗鲁,请道歉,但没有“你为什么要这样做?” 或“你为什么不使用 ABC 库?” 回答。例如,我试图了解如何编写 X 服务器或内核帧缓冲区 (/dev/fb0) 库的实现。可以提供指向 C 库源的链接。

4

3 回答 3

2

除了显示器的设备驱动程序存在之外,没有额外的假设。

这意味着您可以使用 X 或 Wayland,因为它们是 Linux 上的图形驱动程序基础设施。

Linux(内核)本身不包含任何图形基元。它提供了一些接口来与 GPU 通信、在其上分配内存并配置屏幕上的帧缓冲区。但除了原始帧缓冲内存访问之外,Linux 内核确实无法执行绘图操作。为此,您需要用户空间中的一些基础设施。

Wayland 建立在 DRI2 之上,后者又与 DRM Kernel-API 对话。然后你需要依赖 GPU 的状态跟踪器。Mesa 有许多 GPU 的状态跟踪器,并提供 OpenGL 和 OpenVG 前端。

NVidia 和 ATI 专有的闭源图形驱动程序旨在仅与 X 一起使用。因此,对于那些要使用 GPU 的人,您必须使用 X。就是这样。

除此之外,您可以通过 操作屏幕上的帧缓冲内存/dev/fbdev,但这只是像素推送,没有任何 GPU 加速。

于 2013-08-28T16:30:07.110 回答
1

曾几何时,我们有 svgalib(或者它被称为 vgalib?),它完全符合您的要求。我建议您查看它的源代码。我不知道是否仍然可以在任何地方找到它,或者它是否真的可以与现代内核一起使用。无论您做什么,都要准备好经常重启。

于 2013-08-28T16:20:47.137 回答
0

不管它值多少钱,对于任何未来的观众,我都在http://betteros.org/tut/graphics1.php找到了一个不错的教程。它以“可能的最低级别”(基本上是 ioctls 和文件读/写)通过 Framebuffer、DRI/DRM 和 X Windows。

我已经让 Framebuffer 和 DRI/DRM 示例在 QEMU Debian(在 MacOS 主机上)和 Raspberry Pi 上工作,对后者进行了一些修改。

于 2019-10-15T00:57:53.383 回答