在这个方法中,有两个函数对拷贝数据非常重要,一个是binder_alloc_new_buf,另一个是binder_alloc_copy_user_to_buffer,binder_alloc_new_buf是用来申请内存用的,而binder_alloc_copy_user_to_buffer是执行具体的数据拷贝。 可以看到这里两个方法传递的参数都是target_proc的,代表我们此时在操纵接收端的内存。 我们...
当用户进程通过调用”IPCThreadState::transact()”向server进程请求数据时,server进程会调用”IPCThreadState::sendReply()”向用户进程回传数据以作为响应。在这个过程中,server进程会陷入内核,并调用“binder_alloc_new_buf()”从用户进程(“target_proc->alloc”)对应的”alloc->free_buffers.rb_node”红黑树中...
在这个过程中,server进程会陷入内核,并调用“binder_alloc_new_buf()”从用户进程(“target_proc->alloc”)对应的”alloc->free_buffers.rb_node”红黑树中申请一个”struct binder_buffer”类型的对象,被申请得到的对象会从”alloc->free_buffers.rb_node”红黑树中移除,并链入到 ”alloc->allocated_buffers.rb...
首先看一下t->buffer,函数binder_alloc_new_buf()的返回值会赋值给它,这里是我们第一次见到这个函数,从名字看是分配内存,看它的第一个入参&target_proc->alloc。现在回想前面说mmap的时候提到内存映射的信息会保存到proc->alloc这个结构体中。所以这里我们就可以确定现在是在接收方进程的内存映射中分配了一块内存...
首先看一下t->buffer,函数binder_alloc_new_buf()的返回值会赋值给它,这里是我们第一次见到这个函数,从名字看是分配内存,看它的第一个入参&target_proc->alloc。现在回想前面说mmap的时候提到内存映射的信息会保存到proc->alloc这个结构体中。所以这里我们就可以确定现在是在接收方进程的内存映射中分配了一块内存...
binder_alloc_new_buf用于分配此次通信所需的binder_buffer,其中可能会出现诸多错误。 387 if (is_async && 388 alloc->free_async_space < size + sizeof(struct binder_buffer)) { 389 binder_alloc_debug(BINDER_DEBUG_BUFFER_ALLOC, 390 "%d: binder_alloc_buf size %zd failed, no async space left\...
首先看一下t->buffer,函数binder_alloc_new_buf()的返回值会赋值给它,这里是我们第一次见到这个函数,从名字看是分配内存,看它的第一个入参&target_proc->alloc。现在回想前面说mmap的时候提到内存映射的信息会保存到proc->...
4、将用户空间的vma指针关联到alloc。(binder_alloc_set_vma(alloc,vma)) binder_ioctl 1、通过filp去进行读写操作,copy_from_user 将用户空间数据 ubuf 拷贝到 bwr 2、写入数据大于0,执行写入方法,读取数据大于0,执行读取方法 ServiceManager 1、ServiceManager是由init进程通过解析init.rc文件而创建的,其所对应...
binder_insert_free_buffer(proc, new_buffer); } binder_debug(BINDER_DEBUG_BUFFER_ALLOC,"%d: binder_alloc_buf size %zd got %p\n", proc->pid, size, buffer); buffer->data_size =data_size; buffer->offsets_size =offsets_size; buffer->async_transaction =is_async;if(is_async) { ...
Binder内存分配函数为binder_alloc_buf(),直接看源码。static struct binder_buffer *binder_alloc_buf(struct binder_proc *proc, size_t data_size, size_t offsets_size, int is_async) { struct rb_node *n = proc->free_buffers.rb_node; struct binder_buffer *buffer; size_t buffer_size; struct...