一.操作系统基础
1.进程间通信。
操作系统中的各个进程通常运行于独立的内存空间,并且有严格的机制来防止进程间的非法访问,操作系统提供很多种进程间通信的方式,有共享内存,管道,Unix Domain Socket,RPC等等,android还有binder通信
a.内存寻址
简单点来说吧,举个例子,x86微处理器包含三种地址:逻辑地址(包含在机器语言指令中用来指定一个操作数或一条指令的地址及),线性地址(线性地址通常用十六进制数表示),物理地址(用于内存芯片级内存单元寻址)。等等,这TM说的是啥意思,waf。
通俗点讲比如你找一本书中的某个知识点,你可以一页页的翻着去寻找,也可以通过目录再去寻找,你可以把逻辑地址理解为书的目录,线性地址为具体的页数,物理地址为该页对应的在哪的知识点(这解释好像有点牵强,就这样吧,哈)。也就是说我们得到的机器语言最开始的逻辑地址,需要一层一层转化为物理地址。
逻辑地址转线性地址:逻辑地址由段选择符和offset组成,段选择符存在于段寄存器中,段寄存器介绍几种熟悉的,例如cs(代码寄存器),ss(栈寄存器),ds(数据段寄存器,指向包含静态数据或者全局数据段),从段寄存器中取出地址,再加上offset中的就是线性地址了(当然了,实际上还涉及到gtdr,ldtr等,不纠结这些细节)
为什么在进程通信中讲内存寻址,自己的理解就是在逻辑地址转线性地址中,会有ldtr,这个跟具体进程有关,也就是每个进程的规则是不一样的,也就是说跨进程不用别的方式是通信不了的,因为内存寻址规则都是不一样的。
b.进程通信的经典实现
共享内存:基本理念应该是打通内存寻址的同一个规则,具体实现:一:进程1 shmget函数生成共享内存块讲某个特定的key(shmget的第一个参数)进行绑定。二:shmat将共享内存映射到进程1的内存空间。三:进程2通过第一步的key,shmget得到共享内存。
管道:管道有自己的局限,适用于父子进程。可以理解为在两个进程间插了了管子,一根管子同时具有读取跟写入两端,用pipe函数
Unix Domain Socket:这个玩意使用上跟我们平时接触的TCP/IP协议中的Socket使用方法类似,内部原理不太一样
Binder:这是安卓系统中大量使用的跨进程通信方式,这个讲起来篇幅比较大,以后再写吧
二.android启动过程简析
1.第一个系统进程(init)
有时我们会听到Android系统,但安卓又是基于linux的,严格来说,Android系统实际上是运行于Linux内核之上的一系列"服务进程",并不算一个完整意义上的"操作系统",这些进程是维持设备正常工作的关键,而他们的“老祖宗”就是init。init进程PID为0,它通过init.rc脚本来构建出系统给的初始运行形态---其他Android系统服务大多是在这个脚本中描述并被相继启动的。
1.1 init.rc语法
一个完整的init.rc脚本由4种类型的声明组成。
Action(动作),Commands(命令),Services(服务),Options(选项)
.........
1.2 系统关键服务的启动
init将通过解析init.rc来陆续启动其他关键的系统服务进程——其中最重要的就是ServiceManager,Zygote和SystemServer。
1.2.1 Android的“DNS服务器”——ServiceManager
ServiceManager这个是个啥服务呢,这里就不得不先简单提下Binder了,简单来说,Binder是Android中使用最为广泛的IPC机制。
大家对TCP/IP网络应该比较熟悉,Binder中各个组成元素跟TCP/IP网络有很多相似之处。Binder驱动(路由器);ServiceManager(DNS);Binder Client(客户端);Binder Server(服务器)。ServiceManager既然是DNS,那么在用户可以浏览网页前就必须就位。SM也是同样的道理,它要保证在有人使用Binder机制前就处于正常状态。所以每次ServiceManager重启的时候,其他关键进程如zygote,media等也会restart。
1.2.2 “孕育”新的线程和进程——Zygote
和ServiceManager类似,Zygote也是有init解析rc脚本时启动的。
1.2.3 Android的"系统服务" ——SystemServer
SystemServer是Android进入Launcher前的最后准备,它提供了众多由Java语言编写的"系统服务",会生成一个新的进程,用来承载各系统服务。
三.Activity ManagerService(AMS)
AMS是Android提供的一个用于管理Activity(和其他组件)运行状态的系统进程。其中的两个核心就是ActivityStack(Activity的记录者与管理者)和ActivityTask。
1.功能概述
和WMS一样,AMS也是寄存于systemServer中的,它会在系统启动时,创建一个线程来循环处理客户的请求,而且AMS会向ServiceManager登记多种Binder server,如“activity”,“meminfo”,“cpuinfo”等——不过只有第一个“activity”才是AMS中的“主业”,并由ActivityManagerService实现,剩余服务的功能由其他类提供。
未完待续......