《深入理解Android内核设计思想》第6章

来源:互联网 发布:科瑞明软件 编辑:程序博客网 时间:2024/05/18 11:39

总结:

同一个程序中的两个函数之间能直接调用的根本原因是处于相同的内存空间(同一个内存空间)。


同一进程间的对象传递都是通过引用来做的,因而本质上是传递了一个内存空间。


Binder节点并不对应真实的硬件设备。binder驱动运行于内核态。提供open(),ioctl(),mmap()等常用的文件操作。binder注册成misc device驱动。


Linux中的字符设备通常要经过alloc_chrdev_region(),cdev_init()等一系列操作才能在内核中注册自己。 而misc类型驱动则相对简单。 只需要调用misc_register()就可以解决。


mmap()可以把设备指定的内存块直接映射到应用程序的内存空间中。


对于应用程序而言,通过mmap()返回值得到一个内存地址(虚拟地址)这个地址通过虚拟内存转换后最终将指向物理内存的某个位置。对于binder而言,他也有一个指针(binder_proc->buffer)指向某个虚拟内存地址,而经过虚拟内存转换后,它和应用程序中指向的物理内存处于同一个位置。这时binder和应用程序就拥有了若干共用的物理内存块。另一个程序和binder拥有共同内存,这样,就做到A,B两进程 共享同一块内存。


binder_ioctl实现了应用进程与binder驱动之间的命令交换,承载了binder驱动中的大部分业务。



如果要访问SM(binder server)的服务,流程是:打开binder设备,执行mmap,通过binder驱动向SM发送请求。获得结果。





未完待续.....

0 0
原创粉丝点击