mmap 是 Linux 内核提供的内存映射技术,用于将内核态硬件内存(帧缓冲显存)直接映射到用户进程虚拟空间。
借助 MMU 虚实映射特性,mmap 可以实现用户层虚拟地址固定不变,底层物理显存区域动态切换,是嵌入式屏幕高速渲染、双缓冲无撕裂刷新的核心技术。

一、为什么需要 mmap?
在帧缓冲开发中,如果使用 read/write 读写屏幕,每次操作都会触发用户态→内核态切换,系统开销大、帧率低、容易卡顿。
mmap 的核心价值:
-
一次映射,全程指针直接读写显存,无需频繁系统调用
-
将内核态物理显存暴露到用户虚拟地址空间
-
依托 MMU 机制,实现地址复用与动态区域切换
二、mmap 核心原理
2.1 虚实地址映射关系
Linux 借助 MMU 硬件隔离两套地址:
-
虚拟地址:用户进程私有,mmap 映射后地址固定,程序只操作虚拟地址
-
物理地址:屏幕显存真实硬件地址,用户态无法直接访问
mmap 作用:建立「固定虚拟地址 ⇋ 物理显存」的映射关系。
MMU 作用:负责地址翻译与页表动态重映射(辅助 mmap 实现高级特性)。
2.2 经典特性由来(地址不变、区域可变)
该特性本质是 mmap + MMU 组合能力,主体是 mmap:
-
地址编号一样:由 mmap 决定,映射成功后用户虚拟指针永久固定,业务代码无需改动
-
操作区域不一样:由 MMU 辅助实现,内核动态修改页表,让同一虚拟地址指向不同物理显存
三、mmap 函数原型与参数详解
3.1 核心函数
cs
#include <sys/mman.h>
// 内存映射:物理设备/文件 -> 用户虚拟地址空间
void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
// 解除映射
int munmap(void *addr, size_t length);
3.2 帧缓冲场景标准参数
-
addr = NULL:由系统自动分配固定虚拟地址
-
length:显存总大小 = 屏幕宽 × 高 × 4(32位色深)
-
prot = PROT_READ | PROT_WRITE:允许读写显存
-
flags = MAP_SHARED:与内核共享显存数据,支持画面刷新切换
-
fd:/dev/fb0 设备文件描述符
-
offset = 0:默认从显存起始位置映射
四、mmap 帧缓冲标准实战代码(核心)
以下为工程标准代码,完整展示 open - mmap - 指针绘图 - munmap - close 完整流程。
cs
#include <sys/mman.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#define LCD_PATH "/dev/fb0"
#define LCD_WIDTH 1024
#define LCD_HEIGHT 600
int main()
{
// 1. 打开帧缓冲设备
int lcd_fd = open(LCD_PATH, O_RDWR);
if (-1 == lcd_fd)
{
perror("open lcd fail");
return -1;
}
// 2. mmap 核心:物理显存映射为用户固定虚拟地址
int *plcd = mmap(NULL, LCD_WIDTH*LCD_HEIGHT*4, PROT_READ|PROT_WRITE, MAP_SHARED, lcd_fd, 0);
if (plcd == MAP_FAILED)
{
perror("mmap fail");
close(lcd_fd);
return -1;
}
// 3. 直接通过虚拟指针操作显存(无系统调用开销)
for(int y=0; y<LCD_HEIGHT; y++)
{
for(int x=0; x<LCD_WIDTH; x++)
{
*(plcd + 1024*y + x) = 0x00FF0000;
}
}
// 4. 释放资源
munmap(plcd, LCD_WIDTH*LCD_HEIGHT*4);
close(lcd_fd);
return 0;
}
4.1 代码核心解读
-
plcd :mmap 映射生成的固定虚拟地址,全程绘图无需改变
-
绘图过程无系统调用,仅内存指针操作,渲染效率极高
-
底层依靠 MMU 映射翻译,实现物理显存可动态切换
五、mmap 高级应用:双缓冲无撕裂原理
双缓冲是 mmap 机制的经典落地场景:
-
mmap 生成固定虚拟地址,初始映射后台显存
-
程序完成整帧绘图
-
内核修改 MMU 页表,同一虚拟地址映射到前台显存
-
屏幕整体刷新,消除撕裂
本质:mmap 保证上层代码稳定,MMU 负责底层区域切换。
六、总结
-
mmap 是本文核心主体,用于将内核显存映射到用户空间,实现无系统调用高速绘图。
-
帧缓冲是 mmap 的操作对象,MMU 是 mmap 的硬件辅助机制。
-
mmap 提供固定虚拟地址 ,MMU 实现物理区域动态切换,共同构成「地址编号一样,但操作区域不一样」的底层能力。