1. binder基本概念

1.1 特点

1)binder 是一种基于C/S通信模式的IPC(Inter_Process Communication)。

2)在传输过程中近需要一次copy,为发送添加UID/PID身份,既支持实名binder也支持匿名binder,安全性高

3)binder驱动是标准的linux驱动,但是不是驱动专门的硬件,而是虚拟出一个binder管理设备,用于管理binder通信。

1.2

2. binder驱动源码分析

2.1 binder初始化函数binder_init

static int __init binder_init(void)

{

int ret;

char *device_name, *device_tmp;

struct binder_device *device;

struct hlist_node *tmp;

char *device_names = NULL;

ret = binder_alloc_shrinker_init();//初始化binder缓冲区
if (ret)
return ret; atomic_set(&binder_transaction_log.cur, ~0U);
atomic_set(&binder_transaction_log_failed.cur, ~0U); binder_debugfs_dir_entry_root = debugfs_create_dir("binder", NULL);
if (binder_debugfs_dir_entry_root)
binder_debugfs_dir_entry_proc = debugfs_create_dir("proc",
binder_debugfs_dir_entry_root); if (binder_debugfs_dir_entry_root) {
debugfs_create_file("state",
0444,
binder_debugfs_dir_entry_root,
NULL,
&binder_state_fops);
debugfs_create_file("stats",
0444,
binder_debugfs_dir_entry_root,
NULL,
&binder_stats_fops);
debugfs_create_file("transactions",
0444,
binder_debugfs_dir_entry_root,
NULL,
&binder_transactions_fops);
debugfs_create_file("transaction_log",
0444,
binder_debugfs_dir_entry_root,
&binder_transaction_log,
&binder_transaction_log_fops);
debugfs_create_file("failed_transaction_log",
0444,
binder_debugfs_dir_entry_root,
&binder_transaction_log_failed,
&binder_transaction_log_fops);
} if (!IS_ENABLED(CONFIG_ANDROID_BINDERFS) &&
strcmp(binder_devices_param, "") != 0) {
/*
* Copy the module_parameter string, because we don't want to
* tokenize it in-place.
*/
device_names = kstrdup(binder_devices_param, GFP_KERNEL);//给device_names申请空间
if (!device_names) {
ret = -ENOMEM;
goto err_alloc_device_names_failed;
} device_tmp = device_names;
while ((device_name = strsep(&device_tmp, ","))) {
ret = init_binder_device(device_name); //注册misc设备
if (ret)
goto err_init_binder_device_failed;
}
} ret = init_binderfs();
if (ret)
goto err_init_binder_device_failed; return ret;

err_init_binder_device_failed:

hlist_for_each_entry_safe(device, tmp, &binder_devices, hlist) {

misc_deregister(&device->miscdev);

hlist_del(&device->hlist);

kfree(device);

}

kfree(device_names);

err_alloc_device_names_failed:

debugfs_remove_recursive(binder_debugfs_dir_entry_root);

return ret;

}

binder_init函数有三个作用:

1) 初始化binder misc设备

2) 给设备分配内存

3) 调用list_add,将misc device设备放入设备列表中misc_list

2.2 binder初始化函数binder_init

binder机制分析的更多相关文章

  1. Android系统进程间通信Binder机制在应用程序框架层的Java接口源代码分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6642463 在前面几篇文章中,我们详细介绍了A ...

  2. 从Android源码的角度分析Binder机制

    欢迎访问我的个人博客,原文链接:http://wensibo.top/2017/07/03/Binder/ ,未经允许不得转载! 前言 大家好,好久不见,距离上篇文章已经有35天之久了,因为身体不舒服 ...

  3. 从驱动层分析android的Binder机制-android学习之旅(83)

    前言及知识准备 Binder驱动程序 Service组件的注册和启动 Clinet应用获取服务 本次主要介绍Android平台下Binder进程间机制.从机制的组成出发,将按照Binder驱动程序.B ...

  4. Android中的Binder机制的简要理解

    转载自:http://www.linuxidc.com/Linux/2012-07/66195.htm http://blog.csdn.net/sunxingzhesunjinbiao/articl ...

  5. 6.7 Binder机制

    Binder在Android系统中江湖地位非常之高.在Zygote孵化出system_server进程后,在system_server进程中出初始化支持整个Android framework的各种各样 ...

  6. Android深入浅出之Binder机制

    一说明 Android系统最常见也是初学者最难搞明白的就是Binder了,很多很多的Service就是通过Binder机制来和客户端通讯交互的.所以搞明白Binder的话,在很大程度上就能理解程序运行 ...

  7. Android Binder机制简单了解

    Binder -- 一种进程间通信(IPC)机制, 基于OpenBinder来实现 毫无疑问, 老罗的文章是不得不看的 Android进程间通信(IPC)机制Binder简要介绍和学习计划 浅谈Ser ...

  8. Binder机制,从Java到C (大纲)

    转载请标注:张小燕:http://www.cnblogs.com/zhangxinyan/p/3487381.html 前段时间一直在看有关Binder机制的内容,觉得受益匪浅,整理记录于此,大家请随 ...

  9. Binder机制,从Java到C (2. IPC in System Service :AMS)

    1.建立Activity和Service的IPC之前 在上一篇 Binder机制,从Java到C (1. IPC in Application Remote Service)  里面有说到Activi ...

  10. Binder机制,从Java到C (3. ServiceManager in Java)

    上一篇 Binder机制,从Java到C (2. IPC in System Service :AMS)  中提到 Application是通过ServiceManager找到了AMS 的servic ...

随机推荐

  1. Java数组之多维数组

    多维数组 多维数组可以看成是数组的数组,比如二维数组就是一个特殊的一维数组,其每一个元素都是一个一维数组. 二维数组 int a[][] = new int[2][5]; 解析:以上二维数组a可以看成 ...

  2. ORACLE查看会话的大小及终止会话

    一.出现PGA不足时,我们可以查看用户会话大小,结束相应会话 方法一 Select Server, Osuser, Name, Value / 1024 / 1024 Mb, s.Sql_Id, Sp ...

  3. vue保持滚动条在底部

    mounted() { this.scrollToBottom(); }, updated: function () { this.scrollToBottom(); }, scrollToBotto ...

  4. Mysql存储的设备推送数据如何利用GroupBy筛选所有设备的最新数据

    首先介绍GroupBy关键字的用法原理: 先来看下表1,表名为test: 表1 执行如下SQL语句:   SELECTnameFROMtestGROUPBYname 你应该很容易知道运行的结果,没错, ...

  5. docker 清除redis缓存

    1.仓库容器id: docker  ps 2.进入容器:docker exec -it 容器id  redis-cli 3.清除所有缓存:flushall

  6. *args、**kwargs参数组

    '''def test(*args): # *agrs接收的是N个位置参数,不能接受关键字参数,转化成元祖 print(args)test(1,2,3,4,5,6)test(*[1,2,4,5,5]) ...

  7. 装机DEBUG大全

    显示器 分屏没声音?去声音设置 (前提是HDMI连接 分屏能够传输音频 再去调整应用的音频

  8. .gitignore忽略文件无效的解决办法

    .gitignore中已经标明忽略的文件目录下的文件,git push的时候还会出现在push的目录中,原因是因为在git忽略目录中,新建的文件在git中会有缓存,如果某些文件已经被纳入了版本管理中, ...

  9. c++ vtdcm对于压缩模式文档图片的读取

    //获取dcm数据结构,一下图像数据仅针对单通道8字节数据 DcmFileFormat fileformat; OFCondition oc = fileformat.loadFile(dcmPath ...

  10. Debug --> wireshark中的lua插件使用

    一.使用Lua脚本对pcap文件按流进行存储 https://zhuanlan.zhihu.com/p/35188803 二.使用tshark对pcap报文进行批量切流 https://blog.cs ...