ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

Android Vendor <--> System 透过 HIDL 进程间传递 shared fd, 访问ion 共享内存

2022-02-25 17:00:17  阅读:692  来源: 互联网

标签:handle int System hidl bufferHandle ion 描述符 Vendor native


vendor <--> system 透过 HIDL 进程间传递 shared fd, 访问ion 共享内存

 

 

官网有介绍:

https://source.android.com/devices/architecture/hidl-cpp/types

 

HIDL service处理

handle 类型由 C++ 形式的 hidl_handle 结构表示,该结构是一个简单的封装容器,用于封装指向 const native_handle_t 对象的指针

 

typedef struct native_handle
{
    int version;        /* sizeof(native_handle_t) */
    int numFds;         /* number of file descriptors at &data[0] */
    int numInts;        /* number of ints at &data[numFds] */
    int data[0];        /* numFds + numInts ints */
} native_handle_t;

 

Server端封装

 

handle bufferHandle;

native_handle_t* const nativeHandle = native_handle_create(1, 0);
nativeHandle->data[0] = buf->GetShareFd();
bufferHandle.setTo(nativeHandle, true); // bufferHandle 是一个hidl_handle 对象

 

Client 处理

hidl_handle 中获取native_handle_t,得到shred fd ,mmap后得到虚拟地址

const native_handle_t* bufferHandle = bufferInfo.bufferHandle.getNativeHandle();
int shareFd = dup(bufferHandle->data[0]);
char *srcAddr = NULL;
srcAddr = (char*)mmap(NULL, bufferInfo.size, PROT_READ | PROT_WRITE, MAP_SHARED, shareFd, 0);

 

默认情况下,hidl_handle 对它所封装的 native_handle_t 指针并不具备所有权。它的存在只是为了安全地存储指向 native_handle_t 的指针,以使其在 32 位和 64 位进程中均可使用。

在以下情况下,hidl_handle 会拥有它所封装的文件描述符:

  • 在调用 setTo(native_handle_t* handle, bool shouldOwn) 方法(将 shouldOwn 参数设为 true)后
  • hidl_handle 对象是通过复制其他 hidl_handle 对象的结构创建而成时
  • hidl_handle 对象的赋值是从其他 hidl_handle 对象复制而来时

hidl_handle 可提供与 native_handle_t* 对象来回的隐式和显式转换。HIDL 中 handle 类型的主要用途是通过 HIDL 接口传递文件描述符。因此,单个文件描述符由没有 intnative_handle_t 和单个 fd 表示。如果客户端和服务器在不同的进程中运行,RPC 实现将自动处理文件描述符,以确保这两个进程可对同一个文件执行操作。

尽管由某个进程在 hidl_handle 中接收的文件描述符在该进程中有效,但它在超出接收函数范围后不会持续存在(它将在该函数返回后关闭)。想要持续访问文件描述符,进程必须对封装的文件描述符执行 dup() 操作,或复制整个 hidl_handle 对象。

 

标签:handle,int,System,hidl,bufferHandle,ion,描述符,Vendor,native
来源: https://www.cnblogs.com/roger-yu/p/15936862.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有