android binder

Binder进程间通信(二)---- 驱动程序初始化

微笑、不失礼 提交于 2020-02-29 11:53:53
Binder驱动程序的初始化是在方法binder_init中,和罗老师列出的代码有些区别,不过内容基本相同。 static int __init binder_init(void) { int ret; //创建一个工作队列 binder_deferred_workqueue = create_singlethread_workqueue("binder"); if (!binder_deferred_workqueue) return -ENOMEM; //创建 /proc/binder 文件夹 binder_debugfs_dir_entry_root = debugfs_create_dir("binder", NULL); if (binder_debugfs_dir_entry_root)//创建 /proc/binder/proc文件夹 binder_debugfs_dir_entry_proc = debugfs_create_dir("proc", binder_debugfs_dir_entry_root); ret = misc_register(&binder_miscdev); if (binder_debugfs_dir_entry_root) { debugfs_create_file("state", S_IRUGO, binder_debugfs

Binder进程间通信(五)----内核虚拟地址空间管理

馋奶兔 提交于 2020-02-29 11:11:28
上一篇笔记分析到了Binder驱动在调用mmap创建内存映射的过程。但是在分配物理内存的时候,我们只分配了一个页面。当我们需要更多物理内存的时候,Binder驱动才回去继续分配物理内存。 另外,物理内存的分配是以页为单位的,但是在进程中使用内存是却并不是以页为单位,所以binder驱动程序使用结构体binder_buffer来描述进程对内存的使用,表示一块内存。 分配内核缓冲区 当一个进程使用BC_TRANSACTION 或者BC_REPLY向binder驱动发送命令请求和另一个进程通信时需要向另一个进程传递数据(通过结构体binder_transaction_data结构体),binder驱动程序就会将这些数据从 用户空间拷贝到内核空间(描述不准确的,应该是从client进程的用户空间拷贝到service进程的内核空间,因为同一个binder_proc的内核空间和用户空间映射的是同一片物理内存,理论上并不需要拷贝的) ,然后再传递给目标进程。这时候,binder驱动需要在目标进程的内核虚拟地址空间中分配一块地址来存放这些数据。 所以这里涉及到一个关键步骤:分配内核虚拟地址空间,这是通过binder_alloc_buf实现的 static struct binder_buffer *binder_alloc_buf(struct binder_proc *proc, size_t

Binder进程间通信(四)----映射设备文件

走远了吗. 提交于 2020-02-29 11:11:11
进程打开了/dev/binder设备之后,还需要使用mmap方法将这个设备文件映射到进程的内存之中,然后才能使用Binder进程间通信。(关于mmap是一种实现ipc的重要机制, http://www.cnblogs.com/huxiao-tee/p/4660352.html ) /dev/binder是一个虚拟设备,我们映射这个东西主要是为了为进程分配内核缓冲区,以便传输进程间通信数据。我们在初始化驱动程序的时候知道,当调用mmap映射/dev/binder时,实际上会调用的方法是binder_mmap static int binder_mmap(struct file *filp, struct vm_area_struct *vma) { int ret; struct vm_struct *area; struct binder_proc *proc = filp->private_data; const char *failure_string; struct binder_buffer *buffer; if (proc->tsk != current) return -EINVAL; if ((vma->vm_end - vma->vm_start) > SZ_4M) vma->vm_end = vma->vm_start + SZ_4M; binder_debug