五,使用ION
5.1 User Space使用ION
通常,用户空间设备访问库将使用 ION 分配大的连续媒体缓冲区。例如,静态相机库可能会分配一个捕获缓冲区供相机设备使用。一旦缓冲区完全填充了视频数据,库可以将缓冲区传递给内核,以由 JPEG 编码器硬件模块处理。
用户空间的 C/C++ 程序必须获得对 /dev/ion 设备的访问权限,才能从 ION 分配内存。调用 open("/dev/ion", O_RDONLY) 返回一个文件描述符,作为代表 ION 客户端的句柄。是的,可以使用 O_RDONLY 打开的方式分配可写内存。每个用户进程不能有多个客户端。要分配缓冲区,客户端需要填写此数据结构中除句柄字段之外的所有字段:
struct ion_allocation_data {
size_t len;
size_t align;
unsigned int flags;
struct ion_handle *handle;
}
句柄字段是输出参数,而前三个字段指定对齐方式、长度和标志作为输入参数。标志字段是一个位掩码,指示一个或多个 ION 堆的分配来源,回退顺序根据启动期间通过调用 `ion_device_add_heap()` 首次添加的 ION 堆确定。在默认实现,`ION_HEAP_TYPE_CARVEOUT` 在 `ION_HEAP_TYPE_CONTIG` 之前添加。`ION_HEAP_TYPE_CONTIG | ION_HEAP_TYPE_CARVEOUT` 的标志表示意图从 `ION_HEAP_TYPE_CARVEOUT` 分配,并在必要时回退到 `ION_HEAP_TYPE_CONTIG`。
用