Binder驱动与协议

我们知道Android系统是基于Linux内核的,因而它所依赖的 Binder驱动也必须是一个标准的Linux驱动。具体而言,Binder Driver会将自己注册成一个misc device,并向上层提供一 个/dev/binder节点,Binder节点并不对应真实的硬件设备。Binder驱动运行于内核态,可以提供open(),ioctl(), mmap()等常用的文件操作。

Binder驱动源码在Kernel工程的\drivers\android目录中,注册成为misc device比较简单,只需调用misc_register即可,Binder驱动注册源码如下:

// drivers\android\binder.c
static int __init init_binder_device(const char *name)
{
    
    
	int ret;
	struct binder_device *binder_device;

	binder_device = kzalloc(sizeof(*binder_device), GFP_KERNEL);
	if (!binder_device)
		return -ENOMEM;

	binder_device->miscdev.fops = &binder_fops;// Binder驱动支持的文件操作
	binder_device->miscdev.minor = MISC_DYNAMIC_MINOR; // 动态分配次设备号
	binder_device->miscdev.name = name; //驱动名称

	refcount_set(&binder_device->ref, 1);
	binder_device->context.binder_context_mgr_uid = INVALID_UID;
	binder_device->context.name = name;
	mutex_init(&binder_device->context.context_mgr_node_lock);
	// 注册成为misc device
	ret = misc_register(&binder_device->miscdev);
	if (ret < 0) {
    
    
		kfree(binder_device);
		return ret;
	}
	hlist_add_head(&binder_device->hlist, &binder_devices);
	return ret;
}

支持的操作接口有下面几个,使用最多的是binder_ioctl

// drivers\android\binder.c
const struct file_operations binder_fops = {
    
    
	.owner = THIS_MODULE,
	.poll = binder_poll,
	.unlocked_ioctl = binder_ioctl,
	.compat_ioctl = compat_ptr_ioctl,
	.mmap = binder_mmap,
	.open = binder_open,
	.flush = binder_flush,
	.release = binder_release,
};

binder_ioctl​支持的命令比较多,可以看方法中不同的分支判断,其中BINDER_WRITE_READ命令分支中支持的子命令比较多,就不一一列举了。如果想看各个命令说代表的含义,可以参考《深入理解Android内核设计思想(第2版)》–第6章中6.3Binder驱动与协议

// binder_ioctl函数,可以看到参数中有一个cmd,根据不同的cmd执行不同的操作
static long binder_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) {
    
    ...}

// binder_thread_write函数,细分的子命令比较
static int binder_thread_write(struct binder_proc *proc,
			struct binder_thread *thread,
			binder_uintptr_t binder_buffer, size_t size,
			binder_size_t *consumed)
{
    
    ...}

猜你喜欢

转载自blog.csdn.net/wangadping/article/details/128280875