研究Binder也有段时间了,最开始是囫囵吞枣,死记硬背,为了面试的需要,后面一直没用到这个技术,然后就忘记了。当某一天,你想看看源码的时候,你又会遇到Binder这个坎,然后你又去网上找些博客,速看,又记住了一些内容,可是,心里总是不踏实。
从去年下半年开始,一直在补习基础知识,主要围绕着计算机组成原理和Linux内核这两块,可是自从搞Android后,C一直是软肋,C++更是只懂皮毛,要想将书中的原理融汇贯通,还非得写代码,调试不可。在我看来,原理、概念,好比骨骼,语言好比血液,懂了原理,还必须让血液流通,方可虎虎生威。
在学习了一些基础书籍之后,大致明白了一些概念,如内核和操作系统究竟是什么关系,函数调用栈是什么鬼,CPU是如何执行指令的,源代码是如何从文件中被加载到内存中执行的,设备驱动程序是干什么的等等。
如果仅仅是做Java、Android开发,可能你永远也不会去搞清楚这些知识。也许某一刻有那么一闪而过的疑念。我之前就一直研究开源库什么的,代码能够看懂,可是很吃力,当时最大的疑问就是,”我TM什么时候也能写出这么牛掰的代码啊”,然后我也做笔记,一一记下来,用到了什么设计模式,哪些数据结构和算法。。。
回到Binder这个话题上来,最开始是看老罗的博客,可是,老罗有着强大的C++功底,可以通过阅读C++代码去发现问题,解决问题。而我,只懂C++的皮毛,一看C++代码基本就懵逼了,在研究Java源码的时候,一看到native方法就发虚。老罗也在博客里面说,他曾经也希望有一张图,能够简单明了的说明Binder机制,而不用去阅读C++代码,可是,这是不可能的。
某乎上都说,计算机技术最重要的就是”抽象”,我还记得马士兵说过,”都是内存”,的确,搞清楚了内存,你就能搞清楚很多高层的解释,如动态分配,运行时,堆栈。
物理内存—>虚拟内存 这是一个重要的抽象
我突然想到了这样一个比方,物理内存好比一块100x100的地,我们在此基础上抽象出一块虚拟的”地”—带坐标,地上的每栋房子好比一个进程,都有自己的坐标,然后有一个”物业管理处”—操作系统,管理着所有的房子,新建房子,拆件房子,维修房子,都需要经过”物业管理处”,而”物业管理处”也是在”地”上实实在在存在的。只有物理内存是实实在在的,屏幕的显示全靠他,我们在物理内存的基础上抽象出各种技术,框架,使得平凡的我们也可以去造房子。
又走偏了,再回到Binder上来,老罗在C++的源码上已经抽象出了一篇篇的博客,我希望在他那一篇篇的博客上再抽象出一张张的逻辑图,这就是我的目的,站在宏观的角度去理解Binder架构和机制。