FBDev 用户接口、IOCTL、MMap 与 Sysfs
1. /dev/fbN
字符设备由fbmem Core统一提供,minor对应registered_fb[N]。File operations转发到具体fb_ops。
2. Read/Write
默认fb_sys_read/write或fb_read/write按file offset访问framebuffer:
- 检查screen size和offset;
- 在I/O memory与system memory间选择copy方法;
- 处理partial copy和signal;
- 更新offset。
高性能绘制通常使用mmap,不使用write逐帧复制。
3. MMap
默认或driver fb_mmap把framebuffer/aperture映射给用户。
必须检查:
- offset和length;
- smem_len;
- page alignment;
- overflow;
- MMIO register区域是否允许;
- cache/write-combine属性;
- device移除与VMA生命周期。
把控制寄存器和显存一起映射给非特权进程风险很高。
4. 常用IOCTL
| 命令 | 作用 |
|---|---|
FBIOGET_VSCREENINFO |
获取可变mode |
FBIOPUT_VSCREENINFO |
设置mode |
FBIOGET_FSCREENINFO |
获取显存、stride、类型 |
FBIOGETCMAP/PUTCMAP |
colormap |
FBIOPAN_DISPLAY |
改x/y offset |
FBIOBLANK |
blank/power |
FBIO_CURSOR |
cursor(依实现) |
| vendor ioctl | 驱动私有扩展 |
Compat ioctl必须转换含pointer的结构。
5. Pan/Double Buffer
若virtual resolution大于visible resolution,应用可在同一显存中准备多个buffer,再用PAN切换offset。
Pan不保证vblank同步;驱动需实现等待或提供扩展。
6. Pixel Format
fb_var_screeninfo用bits_per_pixel及RGBA bitfield描述格式。它不同于DRM fourcc,应用不能仅凭bpp推断通道顺序。
7. Sysfs
fbsysfs.c暴露:
- bits_per_pixel;
- blank;
- console rotation;
- cursor;
- mode/modes;
- pan;
- virtual size;
- stride;
- name/state等。
写属性最终仍调用fb_ops并经过合法性检查。
8. Deferred I/O
fb_defio通过page fault/page dirty和delayed work收集修改,定时调用driver callback刷新。
适用于SPI/e-paper/USB等慢速设备,不适合高帧率scanout。
9. Colormap
Truecolor常使用pseudo palette;pseudocolor使用硬件cmap。fb_set_cmap逐entry调用setcolreg,需校验start/len。
10. 权限
能mmap /dev/fbN通常可读当前屏幕并覆盖显示内容。产品应:
- 限制node group;
- 不向普通容器透传;
- 避免映射寄存器;
- 清除重新分配的display buffer;
- 防止模式设置影响安全UI。
11. 错误排查
1 | ls -l /dev/fb* |
若由DRM emulation产生,还应检查/sys/class/drm和DRM日志。
正在加载留言…