共 16 篇文章 |
|
Android之binder驱动分析[1]理解binder驱动最好有一个上层的概念,也就是对binder怎么用的有所了解。BINDER_WRITE_READ:Handle和ptr之间的翻译关系正是binder驱动需要维护的。此部分区分要处理的是binder对象传递(BINDER_TYPE_BINDER/BINDER_TYPE_WEAK_BINDER),引用(BINDER_TYPE_HANDLE/BINDER_TYPE_WEAK_HANDLE),还是文件(BINDER_TY... 阅374 转1 评0 公众公开 12-01-06 10:07 |
Android-IPC-Binder(4)Service Manager Handle Add Service。// platform/frameworks/base/cmds/servicemanager/binder.c int binder_parse(struct binder_state *bs, struct binder_io *bio, uint32_t *ptr, uint32_t size, binder_handler func) { ...... case BR_TRANSACTION: { struct binder_txn *txn ... 阅379 转1 评0 公众公开 12-01-06 09:33 |
create_proc_read_entry(strbuf, S_IRUGO, binder_proc_dir_entry_proc, binder_read_proc_proc, proc);} if (binder_debug_mask & BINDER_DEBUG_READ_WRITE) printk(KERN_INFO "binder: %d:%d write %ld at %08lx, read %ld at %08lx/n", proc->pid, thread->pid, bwr.write_size, bwr.write_bu... 阅364 转2 评0 公众公开 12-01-06 09:32 |
Android-IPC-Binder(2)Generate AudioFlinger Service。if (binder !} else { obj.type = BINDER_TYPE_BINDER;} } else { obj.type = BINDER_TYPE_BINDER;view plaincopy to clipboard// frameworks/base/libs/binder/BpBinder.cpp status_t BpBinder::transact( uint32_t code, const Parcel& data, Parcel* repl... 阅458 转1 评0 公众公开 12-01-06 09:31 |
Android-IPC-Binder(1)// frameworks/base/cmds/servicemanager/binder.c void binder_loop(struct binder_state *bs, binder_handler func) { int res;BINDER_SERVICE_MANAGER是service_manager注册的handle。// frameworks/base/include/binder/IInterface.h template<typename INTERFACE> inline sp<INTERFACE> inte... 阅409 转1 评0 公众公开 12-01-06 09:29 |
binder驱动-交互时的传输实现(四)其实我们可以想一下,这个binder_thread_read()函数执行完的时候,异步任务还没开始执行,驱动还会将binder_transaction_data结构体传回上层程序,上层程序才真正开始执行异步任务,不过通常上层应用程序在执行完异步任务(其实不只是异步任务,应该是所有类型的任务)被执行完,都应该发送BC_FREE_BUFFER这个命... 阅816 转3 评0 公众公开 12-01-03 15:55 |
接着如果运气好的话,才有可能将binder_transaction移动到目标进程的全局任务队列binder_node.todo中,这时binder驱动就会给他找一个空闲线程来处理这个请求数据包。该函数调用传递的参数有:当前task所在的进程对应的binder_proc和binder_thread结构体指针,用户空间的read_buffer地址,想读取数据的大小,已经打开binder节点的时候是否是非阻... 阅796 转4 评0 公众公开 12-01-03 15:53 |
某个进程在调用了binder_open()之后将会在驱动中各有一个binder_proc结构体与之对应,而每一个线程(包括主进程)却不一定在驱动中有一个binder_thread结构体与之对应(除非有调用ioctl进行过读写),如果有binder_thread存在,那么这些binder_thread结构体均以域rb_node挂在对应进程的binder_proc.threads这颗红黑树上。fp->type = BINDER_TYPE... 阅1046 转4 评0 公众公开 12-01-03 15:52 |
proc/state、proc/stats、proc/transactions、proc/transaction_log、proc/failed_transaction_log。这些接口文件对应的proc读取函数分别是:binder_read_proc_state()、binder_read_proc_stats()、binder_read_proc_transactions()、binder_read_proc_transaction_log()、binder_read_proc_transaction_log()。/* 以proc->pid作为名字在pro... 阅1166 转6 评0 公众公开 12-01-03 15:45 |
a. 如果没有搜索到,就说明这是第一次发送需要创建对应的内核binder节点,也就是要构建内核中的binder_node结构体,当然同时还需要构建binder_proc结构体来记录server进程的信息填充到binder_node.proc中,也要把flat_binder_object.binder值赋值给binder_node.ptr做备份,最后就是设置一些flag和保存cookie了,最后通过binder_node.rb_node将这... 阅1247 转6 评0 公众公开 12-01-02 14:31 |