帧缓存的分配

帧缓存实际上就是一块内存。在 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 分配的是内核内存.

相关推荐
持续学习和阅读11 天前
【OpenGL】OpenGL ES 应用开发实践指南
gpu·display·opengles·gles 应用
alwaysrun2 个月前
Rust中字符串与格式化
rust·display·格式化·string·str·精度
高心星3 个月前
鸿蒙项目开发——Window和Display获取屏幕信息
华为·harmonyos·display·window·屏幕管理·harmony5.1
Damon_X9 个月前
DRM_CLIENT_CAP_UNIVERSAL_PLANES和DRM_CLIENT_CAP_ATOMIC
display
Damon_X10 个月前
HWUI 和 Skia
display
Damon_X1 年前
SurfaceFlinger代码笔记
display
锦天1 年前
弹性布局 flex layout HTML CSS
css·html·display·flex·弹性布局·justify-content·flex layout
唐诺2 年前
Android 获取屏幕方向,根据屏幕旋转角度判断屏幕实际方向
android·display·windowmanager·rotation
Laurence2 年前
在 spark-sql / spark-shell / hive / beeline 中粘贴 sql、程序脚本时的常见错误
hive·sql·spark·display·possibilities