我想使用/dev/fb0
Linux 提供的任何其他文件。
这以系统特定的方式尽可能低地读取/写入/解释那些基于 GUI 帧缓冲区的设备文件。
我想这样做是为了低级的乐趣,就像访问键盘事件一样。
答案1
您打开帧缓冲区设备的文件描述符并使用ioctl()
,FBIOGET_FSCREENINFO
和FBIOGET_VSCREENINFO
。从返回的结构中,您可以直接确定 X 分辨率、Y 分辨率、步长和每像素位数。
如果帧缓冲区与内核的内置终端仿真器共享,并用于显示内核虚拟终端,则需要与该子系统协商访问权限,告诉它在程序执行此操作并协商 KVT 时不要将其字符绘制到帧缓冲区中与其他进程进行切换。
绘制像素就是使用像素地址、所需颜色和上述值执行计算的问题;获取字节偏移量和要写入的字节值。这可以通过pwrite()
系统调用来完成;但通过将帧缓冲区设备内存映射到进程的地址空间并只需戳内存映射区域可以更有效地完成。
有整本书介绍如何在此基础上进行构建。
ioctl()
当您在已使用的图形模式中不使用预先提供的帧缓冲区,而是使用模式设置动态创建一个或多个帧缓冲区时,事情会变得更加复杂。
进一步阅读
- https://unix.stackexchange.com/a/178807/5132
- 内核模式设置与帧缓冲区?
- https://github.com/jdebp/nosh/blob/master/source/FramebufferIO.cpp
- https://github.com/jdebp/nosh/blob/master/source/FramebufferIO.h
- https://github.com/jdebp/nosh/blob/master/source/GraphicsInterface.h#L34
- https://github.com/jdebp/nosh/blob/master/source/GraphicsInterface.cpp#L12
答案2
不确定是否可以从 fb0 获取鼠标/键盘输入。不过这很有趣,而且您将学到很多 Unix 世界中事物是如何工作的。
您首先要使用 open 系统调用来打开文件描述符,然后使用 ioctl 设置所需的参数。然后,您基本上只需将 fb 作为常规文件进行读写即可。
您可能想研究一下映射文件,但您可以将其作为数组访问!
那么,您可能会在手册页中以及通过阅读 /usr/include 中的文件来找到 ioctl 的功能
为了读取键盘和鼠标输入,您需要使用开发文件系统中找到的输入设备。
所有这些看起来可能很奇怪,但输入系统非常强大。
快乐黑客!
答案3
当然,有很多关于如何读/写/解释 Linux 设备的文档和文章。对于帧缓冲区,例如,您甚至可以使用控制台中的命令cat
从tty
控制台写入数据来测试水域。
# cat /dev/urandom >/dev/fb0
读这例如了解它是如何工作的然后使用C/C++语言或者任何可以制作更复杂的东西的东西。