Android Vendor <--> System 透過 HIDL 進程間傳遞 shared fd, 訪問ion 共享內存


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);

close(shareFd);//最后要close,否則有內存泄漏風險

 

默認情況下,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 對象。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM