在 Linux 下,`framebuffer`(简称 `fb`)是一个提供硬件图形缓冲区的接口,允许用户应用程序直接访问图形设备的显示内存。它可以用于简单的图形显示操作,如直接向屏幕绘制像素、图形等。Framebuffer 的作用是让开发者可以直接操作屏幕上的像素,绕过图形服务器(如 X 或 Wayland),实现低级的图形操作。
主要涉及的知识点和相关函数
1. Framebuffer 设备文件
Framebuffer 设备通常在 `/dev/fb0`(主显示设备)下表示,可以使用 `open` 函数打开该设备,进行读写操作。
int fd = open("/dev/fb0", O_RDWR);
if (fd == -1) {
perror("Error: cannot open framebuffer device");
exit(1);
}
2. `ioctl` 获取屏幕信息
使用 `ioctl` 函数来获取或设置 framebuffer 的相关信息,例如屏幕分辨率、位深度等。通过 `FBIOGET_VSCREENINFO` 可以获取可变屏幕信息(`fb_var_screeninfo` 结构体),包括屏幕的像素宽度、高度、颜色深度等。
struct fb_var_screeninfo vinfo;
if (ioctl(fd, FBIOGET_VSCREENINFO, &vinfo)) {
perror("Error reading variable information");
exit(1);
}
printf("Screen resolution: %dx%d, %dbpp\n", vinfo.xres, vinfo.yres, vinfo.bits_per_pixel);
- `xres` 和 `yres`:屏幕的水平和垂直分辨率(单位是像素)。
- `bits_per_pixel`:每个像素所占用的位数,通常是 16、24 或 32。
3. `mmap` 内存映射 Framebuffer
为了直接操作 framebuffer 内存,我们可以使用 `mmap` 将 framebuffer 的内存映射到用户空间。这样,我们可以像操作普通数组一样操作屏幕上的像素。
size_t screensize = vinfo.xres_virtual * vinfo.yres_virtual * vinfo.bits_per_pixel / 8;
void *fbmem = mmap(0, screensize, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (fbmem == MAP_FAILED) {
perror("Error: Failed to map framebuffer dev