Binder框架(二) binder初始化

news/2024/8/22 17:59:51 标签: fwk面试

注意:binder的初始化总体调用链:

device_initcall(binder_init);

static int __init binder_init(void)

static int __init init_binder_device(const char *name)

(代码位置:kernel/drivers/android/binder.c)

1、device_initcall

device_initcall(binder_init);

2、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();//注册内存伸缩器
	if (ret)
		return ret;

    //设置一些调试文件和信息,帮助开发人员debug
	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 (strcmp(binder_devices_param, "") != 0) {
		device_names = kstrdup(binder_devices_param, GFP_KERNEL);
		......
        //读出来其实就是[binder,hwbinder,vndbinder]了
		device_tmp = device_names;
		while ((device_name = strsep(&device_tmp, ","))) {
            // 初始化binder设备列表
			ret = init_binder_device(device_name);
			......
		}
	}
    ......
	return ret;

3、初始化各binder设备(binder,hwbinder,vndbinder)

​
init_binder_device(device_name){

    int ret;
	struct binder_device *binder_device;
        //### 1.给binder_device分配内存
	binder_device = kzalloc(sizeof(*binder_device), GFP_KERNEL);
	if (!binder_device)
		return -ENOMEM;

        ​​​​​​​//### 2.设置结构体数据,其中包含设备操作集的三项
	binder_device->miscdev.fops = &binder_fops;
	binder_device->miscdev.minor = MISC_DYNAMIC_MINOR;
	binder_device->miscdev.name = name;

	binder_device->context.binder_context_mgr_uid = INVALID_UID;
	binder_device->context.name = name;
	mutex_init(&binder_device->context.context_mgr_node_lock);

        //### 3.注册设备miscdev
	ret = misc_register(&binder_device->miscdev);
	if (ret < 0) {
		kfree(binder_device);
		return ret;
	}
        ​​​​​​​//### 4.添加到hlist头节点
	hlist_add_head(&binder_device->hlist, &binder_devices);
}

​

4、相关结构体:

struct binder_device {  

    struct hlist_node hlist; //一种列表,经常作为其他结构体(如套接字、文件描述符等)的成员,提高了系统的性能和效率

    struct miscdevice miscdev; ///linux标准设备之一,也就是说binder实际上是一种miscdevice

    struct binder_context context;

    struct inode *binderfs_inode;

};

struct miscdevice  {

    const struct file_operations *fops; //设备操作方法集合  --->下面的binder_fops

    int minor; //次设备号,主设备号已经敲定是10了,后面我们跟进代码看一下。

    const char *name;  //驱动名字,最终会反映在设备节点名字上。

    struct list_head list; //链接到所有杂项设备链表当中。

    struct device *parent; //父设备,这个一般为NULL

    struct device *this_device;//当前设备的devices结构。

    const char *nodename;

    umode_t mode;

};

const struct file_operations binder_fops = { //与用户控件操作binder有关的三个成员

    .unlocked_ioctl = binder_ioctl,

    .mmap = binder_mmap,

    .open = binder_open

};

5、总体流程图

-

-

-


http://www.niftyadmin.cn/n/5556520.html

相关文章

Java算法-力扣leetcode-3. 无重复字符的最长子串

3. 无重复字符的最长子串 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 **最长 ** 子串 ****的长度。 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc"&#xff0c;所以其长度为 3。示例 2: 输入: s &…

【C++题解】1168. 歌唱比赛评分

问题&#xff1a;1168. 歌唱比赛评分 类型&#xff1a;数组找数 题目描述&#xff1a; 四&#xff08;1&#xff09; 班要举行一次歌唱比赛&#xff0c;以选拔更好的苗子参加校的歌唱比赛。评分办法如下&#xff1a;设 N 个评委&#xff0c;打 N 个分数&#xff08; 0≤每个分…

ES6 Symbol (十三)

ES5的对象属性名都是字符串&#xff0c;这容易造成属性名的冲突。比如&#xff0c;你使用了一个他人提供的对象&#xff0c;但又想为这个对象添加新的方法&#xff08;mixin 模式&#xff09;&#xff0c;新方法的名字就有可能与现有方法产生冲突。如果有一种机制&#xff0c;保…

CH552G使用IAP下载

常见下载中的方式ISP&#xff0c;IAP&#xff0c;ICP 参考&#xff0c;CH552G中文手册&#xff0c;参考1 ISP&#xff1a;In System Programing&#xff0c;在系统编程。是常见的&#xff0c;使用软件&#xff0c;先将某个引脚&#xff08;例如boot&#xff09;连接到合适的电…

svn ldap认证临时切换到本地认证

当前的svn是在CentOS 7 下 SVN、 Apache 对接 LDAP 服务实现用户账号管理和权限认证&#xff0c;本文模拟ldap数据丢失如何恢复svn&#xff0c;方法是临时将认证切换到本地认证 编辑subversion.conf文件 vi /etc/httpd/conf.d/subversion.conf 注释ldap-status #<Locati…

【busybox记录】【shell指令】chown

目录 内容来源&#xff1a; 【GUN】【chown】指令介绍 【busybox】【chown】指令介绍 【linux】【chown】指令介绍 使用示例&#xff1a; 常用组合指令&#xff1a; 指令不常用/组合用法还需继续挖掘&#xff1a; 内容来源&#xff1a; GUN &#xff1a; Coreutils - GN…

【DRAM存储器三十四】LPDDR4介绍--MR和IO结构

👉个人主页:highman110 👉作者简介:一名硬件工程师,持续学习,不断记录,保持思考,输出干货内容 参考资料:《镁光LPDDR4数据手册》 、《JESD209-4B》 目录 MR DDR3、DDR4、LPDDR4的IO结构变化 MR LPDDR4的MR包括保留未用的有64个,这个就不像以前一…

数据结构初阶(C语言)-顺序表

一&#xff0c;线性表 在进行顺序表的介绍之前&#xff0c;我们先来了解下什么是线性表&#xff1a; 线性表是n个具有相同特性的数据元素的有限序列。 线性表是⼀种在实际中广泛使用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列、字符串...线性表在…