帧缓存实际上就是一块内存。在 Android 系统中分配与回收帧缓存,使用的是一个叫 ION 的内核模块,App 使用 ioctl 系统调用后,会在内核内存中分配一块符合要求的内存,用户态会拿到一个 fd(有的地方也称之为 handle),然后接着调用 mmap ,就能把内核内存映射到用户态内存中,接着返回对应的用户态内存地址给 App。
我们知道一个普通的 fd,比如某个文件对应的 fd,如果把它从 A 进程传递到 B 进程,在 B 进程中,这个 fd 的值是没有意义的,索引不到对应的文件的。
ION 应该是在驱动中动了手脚,ION 分配的内存对应的 fd 可以从 A 进程传递到 B 进程,且在 B 进程中能够索引到内存,也就是也可以将 fd 传入 mmap 中获取到内存地址。
为什么需要这个 fd 可跨进程传递
的特性呢?因为在 Android 中,显示一帧画面需要涉及到多个进程,比如 App 进程、 Gralloc Hal 进程、HwComposer Hal 进程、SurfaceFlinger 进程,如果在不同的进程之间直接传递 buffer,开销过大,我们直接在不同进程之间传递 buffer 的索引 fd 即可,fd 是一个整型变量,大大减小了内存的开支。
在 Android 中,ION 被封装在了 Gralloc HAL 中,这是一个 AIDL HAL,Native App 可以直接访问这个 HAL。 Gralloc Hal 进一步去访问 ION 模块分配回收内存,ION 分配的是内核内存.