Android的启动流程4步:
1. 硬件BOOT、加载Linux内核并挂载Rootfs(根文件系统)
2. 安卓init进程启动及Native服务启动 (本地服务)
3.zygote启动(进程孵化器), SystemServer(使用binder机制)及Android服务启动
4. Home桌面启动 (launcher)(这一步未分析)
1. 硬件BOOT、加载Linux内核并挂载Rootfs
【0】上电启动
BL0阶段
运行芯片厂(如三星)固化在irom的程序
进行一些初始化设置
读OM管脚(拨码开关),判断从SD卡还是emmc中读取BL1段的代码
将BL1代码加载到iRAM运行
BL1阶段
初始化时钟,栈
读OM管教(拨码开关),判断从SD卡还是emmc中读取BL2段的代码
将BL2代码加载到iRAM运行
BL2阶段
对ddr内存初始化
将uboot程序加载到ddr3运行
跳转到uboot起始地址运行
【1】Uboot的启动流程
Uboot的启动分为两个阶段。
第一阶段(start.S):
设置异常向量表
设置ARM核为svc模式(管理模式),设置CPSR寄存器
关cache和关mmu
关看门狗
初始化时钟
初始化串口(编译调试)
初始化内存
初始化栈空间(0-3G的内存空间,c程序代码依赖栈)
清bss段。
跳转到第二阶段。
第二阶段(c代码):
硬件的初始化,
读取环境变量,
将内核从emmc加载到内存中,调用内核
【2】kernel的启动流程 Linux驱动开发:Linux内核启动流程详解-CSDN博客
设置cpu为svc模式,关中断
为内核的解压做准备(内存,中断等等)
内核完成自解压(内核镜像uImage是Image压缩成zImage,并加一些头部信息构成的,因此运行前需要先解压)
调用__start_kernel来执行内核
初始化内存,时钟,串口
解析设备树
加载驱动程序
挂载根文件系统
开启第一个用户进程init,执行linuxrc应用程序
【3】rootfs执行过程
Linuxrc调用inittab文件(规定操作系统行为文件)获取操作系统行为。
执行启动第一个脚本rcS
需要开机执行某些操作,可以在rcs中添加,如加insmod led.ko,使得开机启动时安装led.ko
rcS中调用mount -s 挂载内存文件系统(fstab中所有设备),内存文件系统有/dev或者/proc,它们是能显示内存信息的文件,这些文件在fstab中记录
当控制台登录的时候,执行bin/sh命令,进入shell命令行(在进入前,会执行profile,设置环境变量)
2.init进程的启动
init进程的路径:linux@ubuntu:~/fspad-733-6.0/androidM/system/core/init$ vi init.cpp
1、挂载内存文件系统,挂载文件系统的效果
2、设置日志输出到/dev/kmsg
3、解析内核设备树和内核命令行
4、初始化selinux,安全策略,保护目录权限
5、创建epoll监听多个文件描述符,和select和poll一样,epoll_create1创建带有EPOLL_CLOEXEC 属性的 epoll 文件描述符
6、signal初始化和property初始化
7、解析init.rc配置文件,将actions的内容放到actions链表中,再放到可执行队列的尾部
8、冷启动设备初始化,放到可执行队列中 coldboot是冷启动设备如SD卡,对应的热插拔设备如usb
9、键盘初始化,放到可执行队列中
10、控制台初始化,放到可执行队列中
11、无限循环
等待信号出发:keyboard, property, signal
init.rc配置分析
A、init.rc配置文件的语法:Android 10 启动分析之init语法详解_Android_脚本之家
B、添加一个sevice
1.编写一个服务程序
main
{
while(1){
sleep(10);
}
}
2.Android.mk编译
1 LOCAL_PATH:=$(call my-dir)
2 include $(CLEAR_VARS)
3 LOCAL_MODULE:=test
# 4 LOCAL_MODULE_PATH:=$(LOCAL_PATH)/bin 放到系统的目录下
5 LOCAL_SRC_FILES:= test.c
6 include $(BUILD_EXECUTABLE)
3.在rc配置脚本中添加启动该服务的action
/fspad-733-6.0/androidM/device/softwinner/astar-fspad_733$ vi init.sun8i.rc
194 service hello /system/bin/test
195 class main
196 #oneshot
4.编译
source build/envsetup.sh
lunch
make
5.烧写
boot.img
system.img
adb shell
6、ps查看进程,在Android6.0后,看到服务进程没有启动,原因是selinux禁止了。
C、分析init.rc
路径:~/fspad-733/androidM/system/core/rootdir/init.rc
3、启动DVM虚拟机和zygote
~/fspad-733/androidM/system/core/rootdir/init.zygote32.rc,用于启动zygote服务
要分析zygote服务,需要找到/system/bin/app_process对应的源码
根据可执行程序找到源文件
//app_process是Android.mk中的LOCAL_MODULE变量的值
find -name Android.mk -exec grep -l "app_process" {} \;
./frameworks/base/cmds/app_process/Android.mk
LOCAL_SRC_FILES:= \app_main.cpp
分析app_main.cpp:DVM启动和zygote启动的过程
1271

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



