android内核设计思想(笔记)

一.操作系统基础

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实现,剩余服务的功能由其他类提供。


未完待续......

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容