接着上篇的讲。
我们注意到binder在使用buffer的时候一次声明一个proc(对应一个进程)的buffer总大小,然后分配一页并做好映射。当使用时,发现空间不足,我们接着映射,同时把这个buffer拆成两个,并把剩余的继续放到free_buffers里面。下面从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 rb_node *best_fit = NULL;
void *has_page_addr;
void *end_page_addr;
size_t size;
if (proc->vma == NULL) {
printk(KERN_ERR "binder: %d: binder_alloc_buf, no vma\n",
proc->pid);
return NULL;
}
size = ALIGN(data_size, sizeof(void *)) +
ALIGN(offsets_size, sizeof(void *));
if (size < data_size || size < offsets_size) {
binder_user_error("binder: %d: got transaction with invalid "
"size %zd-%zd\n", proc->pid,

本文详细探讨了Android Binder驱动的内部工作机制,包括Buffer管理、Struct数据交换和NULL指针处理等方面,揭示了Binder在进程间通信的关键实现。
&spm=1001.2101.3001.5002&articleId=7081077&d=1&t=3&u=ea4f3f6ad1b54dde970caaf1b8801aec)
6978

被折叠的 条评论
为什么被折叠?



