android底层开发学习笔记四(Android启动流程)

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

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启动的过程

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值