多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
Binder设备的初始化过程是在Binder驱动程序的初始化函数binder_init中进行的,它的实现如下所示。 **kernel/goldfish/drivers/staging/android/binder.c** ~~~ static int __init binder_init(void) { int ret; binder_proc_dir_entry_root = proc_mkdir("binder", NULL); if (binder_proc_dir_entry_root) binder_proc_dir_entry_proc = proc_mkdir("proc", binder_proc_dir_entry_root); ret = misc_register(&binder_miscdev); if (binder_proc_dir_entry_root) { create_proc_read_entry("state", S_IRUGO, binder_proc_dir_entry_root, binder_read_proc_state, NULL); create_proc_read_entry("stats", S_IRUGO, binder_proc_dir_entry_root, binder_read_proc_stats, NULL); create_proc_read_entry("transactions", S_IRUGO, binder_proc_dir_entry_root, binder_read_proc_transactions, NULL); create_proc_read_entry("transaction_log", S_IRUGO, binder_proc_dir_entry_root, binder_read_proc_transaction_log, &binder_transaction_log); create_proc_read_entry("failed_transaction_log", S_IRUGO, binder_proc_dir_entry_root, binder_read_proc_transaction_log, &binder_transaction_log_failed); } return ret; } ~~~ 第5行到第7行代码在目标设备上创建了一个/proc/binder/proc目录,每一个使用了Binder进程间通信机制的进程在该目录下都对应有一个文件,这些文件是以进程ID来命名的,通过它们就可以读取到各个进程的Binder线程池、Binder实体对象、Binder引用对象以及内核缓冲区等信息。接下来第9行到第15行的if语句块又在/proc/binder目录下创建了五个文件state、stats、transactions、transaction_log和failed_transaction_log,通过这五个文件就可以读取到Binder驱动程序的运行状况。例如,各个命令协议(BinderDriverCommandProtocol)和返回协议(BinderDriverReturnProtocol)的请求次数、日志记录信息,以及正在执行进程间通信过程的进程信息等。 第8行调用函数misc_register来创建一个Binder设备。在前面4.2.2小节介绍日志设备的初始化过程时,我们已经分析过函数misc_register的实现了,它是用来创建一个misc类型的字符设备的。这里我们主要分析全局变量binder_miscdev的定义。 **kernel/goldfish/drivers/staging/android/binder.c** ~~~ static 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, }; static struct miscdevice binder_miscdev = { .minor = MISC_DYNAMIC_MINOR, .name = "binder", .fops = &binder_fops }; ~~~ Binder驱动程序在目标设备上创建了一个Binder设备文件/dev/binder,这个设备文件的操作方法列表是由全局变量binder_fops指定的。全局变量binder_fops为Binder设备文件/dev/binder指定文件打开、内存映射和IO控制函数分别为binder_open、binder_mmap和binder_ioctl。 在接下来的5.1.3和5.1.4小节中,我们将详细分析函数binder_open和binder_mmap的实现;在5.6到5.9小节中,我们将结合具体的使用情景来分析函数binder_ioctl的实现。