有人在解压素材包或导出的数据文件时,看到扩展名是 .mmap,就搜「mmap 是什么格式,用什么打开」。这里容易绕进一个误区:mmap 严格来说不是一种文件格式,而是操作系统提供的一种内存映射机制,全称是 memory map。

mmap 在系统层面是什么

Linux 和类 Unix 系统里有个系统调用叫 mmap(),作用是把文件或匿名内存映射到进程的地址空间。映射完成后,程序读写指针就和读写文件等效,但省掉了 read、write 的拷贝开销,由内核负责回写页面。

void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);

很多数据库、嵌入式存储引擎用它来读写大文件,比如 RocksDB、LevelDB 的某些实现。

那带 .mmap 后缀的文件是什么

这取决于产生它的软件。常见的有三种:

  • 内存映射导出的原始二进制:某段内存的直接快照,没有头信息,打开就是乱码。
  • 某个软件自定义的数据文件:借用 mmap 名字,内部结构只有开发者知道。
  • 嵌入式固件的分区镜像:比如启动时映射到内存的代码段,需要用专门的烧录工具处理。

所以不存在「统一的 mmap 打开方式」,得先看文件来自哪个程序。

怎么判断手里的文件到底是哪种

第一步看大小。内存快照的大小通常是 4096 字节的整数倍,也就是页大小的倍数。如果是这样,大概率是原始内存镜像。

第二步看文件头。用十六进制工具打开前 64 个字节,如果开头是常见格式的魔数,比如 ELF 的 7F 45 4C 46、ZIP 的 50 4B,那它其实就是个被改名的常见文件,把后缀改回去即可。

file 文件名.mmap
xxd -l 64 文件名.mmap

几个常见问题

普通用户通常不需要打开它。如果是软件运行产生的临时映射文件,直接放着别动,删了可能导致程序下次启动异常;确认是缓存且程序已关闭,才可以清理。

想分析内容的话,用十六进制编辑器看结构,或者用 strings 命令过滤出可读文本,比强行用记事本打开靠谱得多。真要解析,得拿到格式说明或对应程序的源码。

最后容易混的一点:mmap 和 mmap 文件是两回事,前者是接口,后者是别人起的名字。Windows 上对应的是「文件映射对象」,通过 CreateFileMapping 实现,原理类似但不叫 mmap。看到 mmap 这个词,先想它是机制,再去追问具体的文件属于谁。