为什么 Binder 驱动需要在内核空间开辟两个缓存区? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ex1gtnim7d

为什么 Binder 驱动需要在内核空间开辟两个缓存区?

  •  
  •   ex1gtnim7d 2021 年 4 月 8 日 12976 次点击
    这是一个创建于 1844 天前的主题,其中的信息可能已经有所发展或是发生改变。

    学习 Binder 通信原理的时候,看到下面这段话


    Binder 通信的步骤如下所示:

    1.Binder 驱动在内核空间创建一个 [数据接收缓存区] 。 2.在内核空间开辟一块 [内核缓存区] ,建立内核缓存区和数据接收缓存区之间的映射关系,以及数据接收缓存区和接收进程用户空间地址的映射关系。 3.发送方进程通过 copy_from_user()函数将数据拷贝 到内核中的内核缓存区,由于内核缓存区和接收进程的用户空间存在内存映射,因此也就相当于把数据发送到了接收进程的用户空间,这样便完成了一次进程间的通信。

    整个过程只使用了 1 次拷贝,不会因为不知道数据的大小而浪费空间或者时间,效率更高。

    摘自刘望舒的《 Android 进阶指北》


    想问下为什么需要开辟两个缓存区,这两个缓存区互相映射的目的是什么,直接使用一个缓存区不行吗?

    有没有研究过的大佬解答一二,谢谢~

    4 条回复    2021-04-12 21:40:40 +08:00
    rochek
        1
    rochek  
       2021 年 4 月 9 日
    既然学习,建议看代码
    tylinux
        2
    tylinux  
       2021 年 4 月 9 日
    传统 IPC 就是一个内核缓冲区,但是这样会有两次内存拷贝,发送 -> 内核 -> 接收。Binder 里的『数据接收缓存区』其实是 mmap 到 『内核缓存区』的,同时,也会 mmap 到接收进程的用户空间下,所以一次 copy 就可以把数据同步到接收进程了。(非专业 Android 开发,可能有误)
    ex1gtnim7d
        3
    ex1gtnim7d  
    OP
       2021 年 4 月 9 日 via Android
    @tylinux 你的意思是不是说『内核缓存区』是属于内核空间的,而『数据缓存区』是 binder 驱动的,binder 驱动没办法让『内核缓存区』跟接受进程的用户空间直接做映射,所以必须在自己内部加多一块『接收数据缓存区』,做映射的中转
    erwa
        4
    erwa  
       2021 年 4 月 12 日
    说下我的理解提供参考:

    1. Binder 通信过程的数据由『协议数据』+『 RP Data (用户的数据)』组成,但其中『协议数据』包含着『 RPC Data 』的数据大小、首地址等其它用于通信逻辑的信息
    2. 驱动程序通过 copy_from_user() 将『协议数据』拷贝到内核,一通逻辑后,在『目标进程』映射的虚拟地址空间中分配『 RPC Data 』大小的内存
    3. 再通过 copy_from_user() 将『 RPC Data 』直接拷贝到这块内存,也就是一次拷贝的来源
    4. 通知目标进程的 Binder 线程处理任务,它会通过 copy_to_user() 将『协议数据』拷贝到它的用户空间

    也就是:用户数据拷贝一次,协议数据要拷贝两次

    所以对于书中『开辟的两个缓存区』我也持有疑问。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     938 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 31ms UTC 19:02 PVG 03:02 LAX 12:02 JFK 15:02
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86