binder傳遞fd的機制

2021-07-10 21:47:41 字數 1153 閱讀 4027

程序獲得的fd是程序fd table中的index, 在fd table中記錄了file指標, file物件保留在kernel空間中.

因此不同程序間傳遞fd本身並沒有什麼意義.

binder通過parcel傳遞fd的本質, 是將源程序的fd table中對應項指標, 記錄到target程序的fd table中.

client端add的fd和server端讀出的是兩個值. 但實際上指向的是乙個file物件.

這有些類似於dup(), 不過dup是在同一程序中複製兩個fd, 指向乙個file物件. 而binder傳遞後是在兩個程序中.

android程序在fork之後, 會構造processstate, 在其建構函式中首先open binder, 之後執行mmap.

這個mmap呼叫在binder driver這一層會將源程序的current->files儲存到對應binder_proc的files中.

proc->files = get_files_struct(current);

到了真正transact的時候, binder driver會判斷flat_binder_object型別, 如果是binder_type_fd,

就通過fget(fd)獲得源binder_proc中files記錄的file物件, 並通過task_fd_install儲存到目標程序的fd table中.

1633         case binder_type_fd:

1663             target_fd = task_get_unused_fd_flags(target_proc, o_cloexec);

1664             if (target_fd < 0)

1669             task_fd_install(target_proc, target_fd, file);

1674             fp->handle = target_fd;

1675         } break;

也就是說, binder driver替binder通訊的另一端在底層開啟了這個檔案. 只不過, 這個開啟不是通常的open方式,

而是在驅動層將已有的file指標複製了過去.  因此, 同dup類似, 兩個程序的fd享有相同的file offset和file status flag.

Binder學習 二 Binder機制解析

程序隔離 程序隔離是為保護作業系統中程序互不干擾而設計的一組不同硬體和軟體的技術。這個技術是為了避免程序a寫入程序b的情況發生。程序的隔離實現,使用了虛擬位址空間。虛擬位址 虛擬位址是對整個記憶體的抽像描述。它是相對於物理記憶體來講的,可以直接理解成 不真實的 假的 記憶體,例如,乙個0x08000...

Binder機制簡介

binder是一種程序間通訊機制,通俗一點,其實是提供遠端過程呼叫機制 rpc 傳輸效能 一次拷貝 易用性 相對於共享記憶體 安全性 許可權分離 servicemanager proxy client server 匿名共享記憶體方式 實現乙個binder通訊例項,需要經過一下步驟 1 獲得serv...

Android中的binder機制

binder 使用client server 的通訊方式 乙個程序作為 server client 向server 傳送服務請求,獲得所需要的服務。對於 binder 而言,binder 可以看成是 server 提供的實現某乙個特定服務的訪問接入點,client 可以通過這個 位址 向 serve...