转载请注明出处:http://blog.csdn.net/droyon/article/details/38022887
Linux启动流程大体分三歩:1、开机启动bootloader。2、操作系统内核初始化。3、执行第一个应用程序。
1、开机就是给硬件设备上电,在上电过程中cpu的作用是执行执行,故而,只有其他硬件设备初始化ok,cpu执行指令才有意义,故而cpu最后上电。
cpu复位完毕就开始执行固定内存的程序指令,此时的执行所在的程序称作“bootloader”引导程序。用于装载用户程序。装载需要应用程序地址。
2、内核初始化。除bootloader以为的程序,在cpu看来都是用户程序。故而此时的内核程序就是上一步中的应用程序。从软件的角度来说,又可分为“内核程序”,应用程序。
内核程序的作用是初始化各种硬件,包括内存、网络接口,显示器,输入设备等。执行完这些内核程序就开始执行应用程序了。
3、第一个应用程序就是Home程序。就是Launcher,用于管理各种App。Launcher提供一种入口进而启动其他应用程序。
Android所使用的Linux架构:
1、处理器复位完毕,执行只读ROM区的程序,此程序就是bootloader。这段程序会从处理器的引脚高低电平状态装载应用程序。比如:usb口,串口,sd卡,并口flash等。
多数会从NAND Flash芯片中的0X00000000地址开始装载程序。对于小型嵌入式系统,此段程序就是最终要执行的程序。但对android而言,该地址中的程序还不是android应用程序,只是uboot或者fastboot程序,其作用是初始化硬件设备。比如网口。同时提供刷机(内核烧写、升级)也就是向NAND Flash中写入新的数据。
uboot执行时,会检测一些特定按键,这些按键是uboot在编译时预先约定好的,用于进入调试模式。例如:电源键 + 音量下键。
如果用户没有按这些按键,则uboot会跳过加载调试模式,进入NADN Flash中装载内核程序。装载地址由uboot指定。
2、Linux内核装载完毕后,开始执行内核初始化。
android内核会加载init.rc文件,根据此脚本文件初始化应用程序。
言归正传,上述为android内核启动流程,对于Linux来说,Android系统仅仅是其一个应用程序。应用程序包含很多进程,android系统第一个应用进程就是zygote,这个进程就是LInux进程根据上述init.rc中配置信息启动的。zygote是一个中心进程,他会孵化其他应用进程,包含我们每一个apk所在的进程。
zygote进程主要包括两个模块。1、socket服务端:用于接受并启动新Dalvik进程的命令。每一个apk进程都是一个新的dalvik虚拟机进程,我们可以直接使用dalvik虚拟机识别的java程序开发android应用程序。2、Framework共享类和资源。加载preload-classes,preload-resources定义的类和资源。
zygote是android第一个进程,其应用程序名为:app_process,位于system/bin下。zygote是第一个应用程序,其孵化的第一个应用程序叫做system server,也运行在app_process中。