init进程总结

1.创建一些文件夹并挂载设备

2.初始化和启动属性服务

3.解析init.rc配置文件并启动zygote进程



1.binder是一个本地的c/s结构


init进程总结_第1张图片


IBinder通过内存映射实现一次拷贝的,内存映射就是将用户空间的一块内存区域映射到内核空间,用户对这块内存区域的修改可以直接反映到内核空间,反之内核空间对这段区域的修改也能直接反映到用户空间,内存映射能减少数据拷贝次数,实现用户空间和内核空间的高效互动,两个空间各自修改能直接反映在映射的内存区域,从而被对方空间及时感知

Binder ipc的实现原理


init进程总结_第2张图片

binder通信过程


init进程总结_第3张图片

1.进程使用binderSectionExt_MGR命令通过binder驱动将自己注册成为ServiceManager

2.Server通过驱动向servicemanager中注册binder,表明可以对外提供服务,驱动为这个binder创建位于内核中的实体节点以及serviceManager对实体的引用,将名字以及新建的引用打包传给servicemanager,serviceManager将其填入查找表

3.client通过名字,在binder驱动的帮助下,从serviceManager中获得对binder实体的引用,通过这个引用就能实现和server进程的通信


binder通信的代理模式


init进程总结_第4张图片

当A进程想要获取B进程的object时,驱动并不会真的给B进程的object返回给A,而是返回了跟Object一模一样的代理对象,这个代理对象具有和Object一模一样的方法,但是这些方法没有B进程中Object对象那些方法的能力,这些方法只需要把请求参数交给驱动即可,对于A进程来说和直接调用Object中的方法是一样的

当binder接收到A进程的消息后,发现这是一个ObjectProxy就去查询自己维护的表单,一旦发现这是B进程Object的代理对象,于是就去通知B进程去调用object方法,并要求B进程给返回结果发给自己,当驱动拿到B进程的返回结果后就会转发给A进程,一次通信就完成了。






handler源码分析:

MessageQueue(消息队列)

入队

handler.sendMessage-queue.enqueueMessage

出队

looper.loop->queue.next



init进程总结_第5张图片

你可能感兴趣的:(init进程总结)