目录
1 引言
前段时间参与一个kernel层的应用开发,所以简单的总结了从linux启动到android应用加载。如下图所示,主要将启动流程分为了6个步骤,其实里面还有很多细分的步骤,但是我主要总结的是linux层的流程。5个步骤为:
- ROM Code
- U-boot
- kernel
- init进程
- 系统应用

2 启动流程分析
2.1 ROM Code
[扩展:ROM是Read Only Memory的缩写,是一种半导体内存,其特性是一旦储存资料就无法再将之改变或删除。通常用在不需经常变更资料的电子或电脑系统中,资料并且不会因为电源关闭而消失。当前的ROM已经由EEPROM升级为FLASH,FLASH存储器又称闪存,它结合了ROM和RAM的长处,不仅具备电子可擦除可编程(EEPROM)的性能,还不会断电丢失数据同时可以快速读取数据。
RAM是Random Access Memory的缩写。
又称为随机存取存储器;存储单元的内容可按需随意取出或存入,且存取的速度与存储单元的位置无关的存储器。这种存储器在断电时将丢失其存储内容,故主要用于存储短时间使用的程序。
ROM在系统停止供电的时候仍然可以保持数据,而RAM通常都是在掉电之后就丢失数据,典型的RAM就是计算机的内存。]
ROM Code(芯片内固化好的一段代码),起最初的引导功能,包括初始化时钟、片内RAM、相关外设等,读取引脚配置信息等。
2.2 U-Boot
通常CPU会从某一个固定的物理地址开始运行,这个物理地址一般是Flash芯片的起始物理地址。Flash芯片的最初一段通常存放的是U-Boot,于是CPU就会开始运行U-Boot的代码。进行初始化相关硬件设备,引导系统加载内核镜像的一段程序。
U-Boot分为两个部分:
第一部分是汇编代码且不做压缩,第二部分是C代码且有压缩的。Bootloader开始执行时,第一部分汇编代码先负责初始化CPU、PLL、DDR、Cache等硬件,让CPU和内存能够稳定运行。
然后解压第二部分的Image,并拷贝到到内存执行。第二部分C代码完成串口、flash、网口等驱动的加载,并构建一个shell环境来接受用户输入。
完成Bootloader初始化后,根据代码中设定的内核区物理地址,Bootloader会把内核区压缩后的Linux镜像拷贝到内存中并解压。同时准备好内核的启动参数,如:console=ttyS0,115200 root=31:2 mtdparts=ar7100-nor0:196608(boot),835236(kernel),-(rootfs),这里主要是把Bootloader里设置的MTD分区信息传递给内核,还有需要加载的根文件系统。最后跳转到内核入口开始运行。
2.3 Kernel
Linux内核代码开始执行,会先进行内核各个子系统初始化,并完成对MMU的初始化。接下来Linux内核会挂载根文件系统,要挂载的根文件系统是通过内核启动参数来获取的。最后,Linux内核继续初始化各种类型的驱动程序,完成之后会启动第一个应用程序,它的进程ID为1。这个应用程序可以由内核启动参数传入,如果没有则会默认执行/sbin/init。init进程会读取配置文件/etc/inittab,根据配置文件的内容它会完成两个工作,执行rcS和启动Shell。
2.4 init
Init进程一起来就根据init.rc和init.xxx.rc脚本文件建立了几个基本的服务:
- servicemanamger
- zygote
- 等
最后Init并不退出,而是担当起property service的功能。Servicemanager和zygote进程就奠定了Android的基础。Zygote这个进程起来才会建立起真正的Android运行空间
2.5 系统应用
到此通过zygote fork各种系统应用,比如:bootanimation和Surfaceflinger等。到此可以总结:对于Android来说,前面的流程都是一样的,而当init进程创建之后,会fork出一个Zygote进程,这个进程是所有Java进程的父进程。我们知道,Linux是基于C的,而Android是基于Java的(当然底层也是C)。所以这里就会fork出一个Zygote Java进程用来fork出其他的用户进程。
3 参考文献
https://www.cnblogs.com/zyanrong/p/5661114.html
https://blog.youkuaiyun.com/zhangcanyan/article/details/72846931
https://www.cnblogs.com/linux-xin/p/8119480.html
http://m.elecfans.com/article/679227.html
https://blog.youkuaiyun.com/johnWcheung/article/details/82948571
https://blog.youkuaiyun.com/jichuang123/article/details/52556867
本文详细解析了从Linux启动到Android应用加载的过程,涵盖了ROMCode、U-Boot、Kernel、init进程及系统应用的启动流程。深入探讨了每个阶段的关键操作与功能,为理解Android系统启动机制提供了全面的视角。
1811

被折叠的 条评论
为什么被折叠?



