Android Binder通信二 Binder驱动与协议

1 前言

在Binder通信整体框架这篇文章中已经说过Binder驱动是Binder通信的底层载体和支撑。Binder驱动支撑着整个Binder IPC过程。因此还是有必要稍微了解Binder驱动的一些基本概念

2 Binder驱动简介

Binder驱动在Linux内核并不对应于真实的设备,它只是一个虚拟的内存区域。
Binder驱动在内核中是以一个misc device类型驱动注册到内核中,并且不支持动态的添加和移除,主设备号为10,次设备号动态分配
Binder驱动的源码在Linux内核的drivers/staging/android
binder驱动的file_operations 定义如下

static const struct file_operations binder_fops = {
    .owner = THIS_MODULE,
    .poll = binder_poll,
    .unlocked_ioctl = binder_ioctl,
    .mmap = binder_mmap,
    .open = binder_open,
    .flush = binder_flush,
    .release = binder_release,
};

可以看到,binder驱动提供给应用层的接口主要有 open,mmap,poll,ioctl等几个,其中常用的就open,mmap,ioctl三个,其中open表示打开驱动,mmap主要把驱动的内核空间地址映射到用户空间,便于数据的交换,而ioctl主要用于binder协议的通信

3 Binder驱动与应用的交互

要与Binder驱动通信,第一部就是打开打开binder驱动

binder_open
打开binder驱动代码如下:

struct binder_state *bs;
void *svcmgr = BINDER_SERVICE_MANAGER;

bs = binder_open(128*1024);

其中binder_open定义如下:

struct binder_state *binder_open(unsigned mapsize)
{
    struct binder_state *bs;

    bs = malloc(sizeof(*bs));
    if (!bs) {
        errno = ENOMEM;
        return 0;
    }

    bs->fd = open("/dev/binder", O_RDWR);
    if (bs->fd < 0) {
        fprintf(stderr,"binder: cannot open device (%s)\n",
                strerror(errno));
        goto fail_open;
    }

    ....

fail_map:
    close(bs->fd);
fail_open:
    free(bs);
    return 0;
}

可以看到关键语句就是open(“/dev/binder”, O_RDWR);并返回一个fd。
打开了binder驱动接下来一般还需要将binder驱动设备与应用程序建立mmap映射内存,这样在用户空间就可以直接操作binder设备上的数据了。映射调用mmap函数,会调用到binder驱动的binder_mmap函数

binde_mmap
映射代码如下:

bs->mapsize = mapsize;
    bs->mapped = mmap(NULL, mapsize, PROT_READ, MAP_PRIVATE, bs->fd, 0);
    if (bs->mapped == MAP_FAILED) {
        fprintf(stderr,"binder: cannot map device (%s)\n",
                strerror(errno));
        goto fail_map;
    }

可以看到,主要调用mmap函数来做映射,并且映射的大小就是传入的参数128K。
一旦我们做了映射,那么当有另外一个应用程序B时,示意图如下:
这里写图片描述
可以看到,这个时候我们在进行IPC时,要将应用B的数据拷贝到应用程序A,只需要在binder驱动中执行一次copy_from_user复制一次数据即可。

上面binder驱动的初始化有两个过程,binder_open和binder_mmap,在真实的Binder通信体系中这个工作一般有ProcessState这个类来完成,这里就不再详细的讨论了,后期会有讨论。

4 Binder协议简介与ioctl

所谓的binder协议就是binder在进行ioctl操作所支持的一些命令以及。下面是binder协议的介绍

Binder协议
Binder协议可以分为控制协议和驱动协议两类。
控制协议是进程通过ioctl(“/dev/binder”) 与Binder设备进行通讯的协议,该协议包含以下几种命令:
这里写图片描述
Binder的驱动协议描述了对于Binder驱动的具体使用过程。驱动协议又可以分为两类:
• 一类是binder_driver_command_protocol,描述了进程发送给Binder驱动的命令
• 一类是binder_driver_return_protocol,描述了Binder驱动发送给进程的命令
binder_driver_command_protocol共包含17个命令,分别是:
这里写图片描述
binder_driver_return_protocol共包含18个命令,分别是:
这里写图片描述
这些命令有个大体的影响就行,对应用开发来说并不需要掌握。

5 binder驱动总结

binder驱动本质上仍然是一个典型的Linux设备驱动,它主要为binder的IPC过程服务,并且google设计了一套binder协议保证binder通信的顺利进行。下一节将结合ServiceManager来介绍通过Binder驱动,client与ServiceManager是如何交互的。

以上就是有关binder驱动的一些相关知识,下一遍将介绍binder通信体系中servicemanager的角色

参考:
深入理解Android内核设计思想 第二版 林学森著
走进Android Binder机制(驱动篇上
http://blog.csdn.net/ming_147/article/details/65633571

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于计算机专业的学生而言,参加各类比赛能够带来多方面的益处,具体包括但不限于以下几点: 技能提升: 参与比赛促使学生深入学习和掌握计算机领域的专业知识与技能,如编程语言、算法设计、软件工程、网络安全等。 比赛通常涉及实际问题的解决,有助于将理论知识应用于实践中,增强问题解决能力。 实践经验: 大多数比赛都要求参赛者设计并实现解决方案,这提供了宝贵的动手操作机会,有助于积累项目经验。 实践经验对于计算机专业的学生尤为重要,因为雇主往往更青睐有实际项目背景的候选人。 团队合作: 许多比赛鼓励团队协作,这有助于培养学生的团队精神、沟通技巧和领导能力。 团队合作还能促进学生之间的知识共享和思维碰撞,有助于形成更全面的解决方案。 职业发展: 获奖经历可以显著增强简历的吸引力,为求职或继续深造提供有力支持。 某些比赛可能直接与企业合作,提供实习、工作机会或奖学金,为学生的职业生涯打开更多门路。 网络拓展: 比赛是结识同行业人才的好机会,可以帮助学生建立行业联系,这对于未来的职业发展非常重要。 奖金与荣誉: 许多比赛提供奖金或奖品,这不仅能给予学生经济上的奖励,还能增强其成就感和自信心。 荣誉证书或奖状可以证明学生的成就,对个人品牌建设有积极作用。 创新与研究: 参加比赛可以激发学生的创新思维,推动科研项目的开展,有时甚至能促成学术论文的发表。 个人成长: 在准备和参加比赛的过程中,学生将面临压力与挑战,这有助于培养良好的心理素质和抗压能力。 自我挑战和克服困难的经历对个人成长有着深远的影响。 综上所述,参加计算机领域的比赛对于学生来说是一个全面发展的平台,不仅可以提升专业技能,还能增强团队协作、沟通、解决问题的能力,并为未来的职业生涯奠定坚实的基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值