android启动流程
Android的本地启动流程1
本地部分启动流程
在 Android 系统运行的通常情况下,根文件系统 只是一个较小的部分,例如包括 init 、 init.rc 和少数 的几个目录。其他的文件系统通常需要由 init 根据 init.rc 脚本的中内容进行挂接。 默认的文件系统挂接方法:
mount mount mount mount yaffs2 yaffs2 yaffs2 yaffs2 mtd@system /system mtd@system /system ro remount mtd@userdata /data nosuid nodev mtd@cache /cache nosuid nodev
Android 的本地启动流程
韩 超 @ Android 技术
本地部分启动流程
Android 系统的启动流程为: BootLoader 启动(标准) Linux 内核启动(标准) 内核加载根文件系统 init 进程启动 运行 init.rc 脚本 加载 system 和 data 文件系统 启动各种可执行程序
谢谢!
本地部分启动流程
Linux 内核在加载完成根文件系统后,将运行根文 件系统中的一个名称为 init 的可执行程序,作为用户 空间的第一个进程。 在 Android 中,这个 init 就是根目录中的 init 可执 行程序,它被内核启动后,作为系统的用户空间的第 一个进程来运行。 init 可执行程序运行后,系统的用 户空间部分进入了 Android 系统特定环境。 init 程序运行后,程序将会在根目录中找到名称为 init.rc 的文件作为启动脚本。在不同的平台中, init.rc 脚本中的内容可能有自定义的部分。
# cat /proc/cmdline qemu=1 console=ttyS0 android.checkjni=1 android.qemud=ttyS1 ndns=-1
Android系统完整的启动过程
Android系统完整的启动过程,从系统层次角度可分为Linux系统层、Android系统服务层、Zygote进程模型三个阶段;从开机到启动Home Launcher完成具体的任务细节可分为七个步骤,下面就从具体的细节来解读Android系统完整的初始化过程。
一、启动BootLoaderAndroid 系统是基于Linux操作系统的,所以它最初的启动过程和Linux一样。
当设备通电后首先执行BootLoader引导装载器,BootLoader是在操作系统内核运行之前运行的一段小程序。
通过这段小程序初始化硬件设备、建立内存空间映射图,从而将系统的软硬件环境引导进入合适的状态,以便为最终调用操作系统内核准备好正确的运行环境。
而Linux系统启动时:1)首先要加载BIOS的硬件信息,并获取第一个启动设备的代号2)读取第一个启动设备的MBR的引导加载程序(lilo、grub等)的启动信息。
3)加载核心操作系统的核心信息,核心开始解压缩,并且尝试驱动所有的硬件设备。
…………在嵌入式系统中,通常不会有像BIOS那样的固件程序,因此整个系统的加载任务都是通过BootLoader完成的。
二、加载系统内核Linux内核映像通常包括两部分代码,分别为实模式代码和保护模式代码。
当BootLoader装载内核映像到代码段内存时,分别放置实模式代码和保护模式代码到不同的位置,然后进入实模式代码执行,实模式代码执行完成后转入保护模式代码。
实模式和保护模式的概念再次不做过多解释,读者可以自行查阅资料。
三、启动Init进程当系统内核加载完成之后,会首先启动Init守护进程,它是内核启动的第一个用户级进程,它的进程号总是1。
Init进程启动完成之后,还负责启动其他的一些重要守护进程,包括:Usbd进程(USB Daemon):USB连接后台进程,负责管理USB连接。
adbd 进程(Android Debug Bridge Daemon):ADB连接后台进程,负责管理ADB连接。
Android 开机启动流程
Android的开机流程1. 系统引导bootloader1) 源码:bootable/bootloader/*2) 说明:加电后,CPU将先执行bootloader程序,此处有三种选择a) 开机按Camera+Power启动到fastboot,即命令或SD卡烧写模式,不加载内核及文件系统,此处可以进行工厂模式的烧写b) 开机按Home+Power启动到recovery模式,加载recovery.img,recovery.i mg包含内核,基本的文件系统,用于工程模式的烧写c) 开机按Power,正常启动系统,加载boot.img,boot.img包含内核,基本文件系统,用于正常启动手机(以下只分析正常启动的情况)2. 内核kernel1) 源码:kernel/*2) 说明:kernel由bootloader加载3. 文件系统及应用init1) 源码:system/core/init/*2) 配置文件:system/rootdir/init.rc,3) 说明:init是一个由内核启动的用户级进程,它按照init.rc中的设置执行:启动服务(这里的服务指linux底层服务,如adbd提供adb支持,vold提供SD卡挂载等),执行命令和按其中的配置语句执行相应功能4. 重要的后台程序zygote1)源码:frameworks/base/cmds/app_main.cpp等2) 说明:zygote是一个在init.rc中被指定启动的服务,该服务对应的命令是/system/bin/app_processa)建立Java Runtime,建立虚拟机b) 建立Socket接收ActivityManangerService的请求,用于Fork应用程序c) 启动System Server5. 系统服务system server1)源码:frameworks/base/services/java/com/android/server/SystemServer.jav a2) 说明:被zygote启动,通过SystemManager管理android的服务(这里的服务指frameworks/base/services下的服务,如卫星定位服务,剪切板服务等)6. 桌面launcher1)源码:ActivityManagerService.java为入口,packages/apps/launcher*实现2) 说明:系统启动成功后SystemServer使用xxx.systemReady()通知各个服务,系统已经就绪,桌面程序Home就是在ActivityManagerService.systemReady()通知的过程中建立的,最终调用()启launcher7. 解锁1) 源码:frameworks/policies/base/phone/com/android/internal/policy/impl/*lock* 2) 说明:系统启动成功后SystemServer调用wm.systemReady()通知WindowManagerService,进而调用PhoneWindowManager,最终通过LockPatternKeyguardView显示解锁界面,跟踪代码可以看到解锁界面并不是一个Activity,这是只是向特定层上绘图,其代码了存放在特殊的位置8. 开机自启动的第三方应用程序1) 源码:ﻫframeworks/base/services/java/com/android/server/am/ActivityManagerService.java2) 说明:系统启动成功后SystemServer调用ActivityManagerNative.getDefa ult().systemReady()通知ActivityManager启动成功,ActivityManager会通过置变量mBooting,通知它的另一线程,该线程会发送广播android.intent.action.BOOT_COMPLETED以告知已注册的第三方程序在开机时自动启动。
安卓启动流程
安卓启动流程Android启动流程是指当我们按下手机开机键之后,系统如何进行初始化和加载应用程序等相关操作,最终完成系统的正常启动并进入主界面的过程。
下面将详细介绍Android启动流程的主要步骤。
1. 加电与引导当我们按下手机的开机键时,电源管理芯片开始提供电力供应并接通整个电路。
同时,电源管理芯片会发送信号给处理器引导启动系统。
2. 启动引导加载程序处理器接收到启动信号后,会加载引导加载程序(Bootloader)。
引导加载程序主要负责初始化硬件设备、加载系统内核等操作。
引导加载程序是嵌入式系统中运行的一段代码,它的作用是为系统加载内核和其他软件。
3. 加载内核引导加载程序会根据设备启动模式(Fastboot、Recovery或正常启动)来选择加载相应的内核。
内核是操作系统的核心,它负责管理和控制系统的硬件资源,提供各种功能的驱动程序,同时也会启动各种系统服务。
4. 初始化设备驱动在内核加载完成后,系统会初始化设备驱动程序。
设备驱动程序负责与硬件设备进行通信和控制,让硬件设备可以正确地与系统交互。
5. 启动init进程在设备驱动程序加载完毕后,系统会启动init进程。
init进程是Android系统中的第一个用户级进程,它的PID(Process ID)为1。
init进程负责启动和管理其他用户级进程,它通过读取init.rc配置文件来确定要启动的进程和服务。
6. 启动系统服务init进程会根据init.rc配置文件的指令,启动各种系统服务,例如Binder服务、Activity Manager服务、Window Manager服务等。
这些系统服务是Android系统的核心组件,负责管理应用程序的生命周期、绘制界面等功能。
7. Zygote进程与应用程序加载在系统服务启动完成后,init进程会启动Zygote进程。
Zygote进程是Android系统中的特殊进程,其作用是为应用程序提供应用程序运行环境(即Dalvik或ART虚拟机环境)。
Android 开机启动流程
Android的开机流程1. 系统引导bootloader1) 源码:bootable/bootloader/*2) 说明:加电后,CPU将先执行bootloader程序,此处有三种选择a) 开机按Camera+Power启动到fastboot,即命令或SD卡烧写模式,不加载内核及文件系统,此处可以进行工厂模式的烧写b) 开机按Home+Power启动到recovery模式,加载recovery.img,recovery.img包含内核,基本的文件系统,用于工程模式的烧写c) 开机按Power,正常启动系统,加载boot.img,boot.img包含内核,基本文件系统,用于正常启动手机(以下只分析正常启动的情况)2. 内核kernel1) 源码:kernel/*2) 说明:kernel由bootloader加载3. 文件系统及应用init1) 源码:system/core/init/*2) 配置文件:system/rootdir/init.rc,3) 说明:init是一个由内核启动的用户级进程,它按照init.rc中的设置执行:启动服务(这里的服务指linux底层服务,如adbd提供adb支持,vold提供SD卡挂载等),执行命令和按其中的配置语句执行相应功能4. 重要的后台程序zygote1) 源码:frameworks/base/cmds/app_main.cpp等2) 说明:zygote是一个在init.rc中被指定启动的服务,该服务对应的命令是/system/bin/app_processa) 建立Java Runtime,建立虚拟机b) 建立Socket接收ActivityManangerService的请求,用于Fork应用程序c) 启动System Server5. 系统服务system server1) 源码:frameworks/base/services/java/com/android/server/SystemServer.java2) 说明:被zygote启动,通过System Manager管理android的服务(这里的服务指frameworks/base/services下的服务,如卫星定位服务,剪切板服务等)6. 桌面launcher1) 源码:ActivityManagerService.java为入口,packages/apps/launcher*实现2) 说明:系统启动成功后SystemServer使用xxx.systemReady()通知各个服务,系统已经就绪,桌面程序Home就是在ActivityManagerService.systemReady()通知的过程中建立的,最终调用()启launcher7. 解锁1) 源码:frameworks/policies/base/phone/com/android/internal/policy/impl/*lock*2) 说明:系统启动成功后SystemServer调用wm.systemReady()通知WindowManagerService,进而调用PhoneWindowManager,最终通过LockPatternKeyguardView显示解锁界面,跟踪代码可以看到解锁界面并不是一个Activity,这是只是向特定层上绘图,其代码了存放在特殊的位置8. 开机自启动的第三方应用程序1) 源码:frameworks/base/services/java/com/android/server/am/ActivityManagerService.java2) 说明:系统启动成功后SystemServer调用ActivityManagerNative.getDefault().systemReady()通知ActivityManager启动成功,ActivityManager会通过置变量mBooting,通知它的另一线程,该线程会发送广播android.intent.action.BOOT_COMPLETED以告知已注册的第三方程序在开机时自动启动。
android开机过程
一、Android开机启动流程简介1、OS-level:由bootloader载入linux kernel后kernel开始初始化, 并载入built-in 的驱动程序。
Kernel完成开机后,载入init process,切换至user-space。
Init进程是第一个在user-space启动的进程。
2、Android-level:由init process读取init.rc,Native 服务启动,并启动重要的外部程序,例如:servicemanager、Zygote以及System Server等。
由 init process 根据硬件类型读取init.xxx.rc。
由init.xxx.rc加载init.xxx.sh。
由 init.xxx.sh 加载特定的硬件驱动。
如hi_tuner.ko、hi_demux.ko等。
3、Zygote-Mode:Zygote 启动完SystemServer 后,进入Zygote Mode,在Socket 等候命令。
随后,使用者将看到一个桌面环境(Home Screen)。
桌面环境由一个名为[Launcher]的应用程序负责提供。
本文档重点研究Android-level中的启动流程。
启动流程如下图所示:二、init process流程分析init进程简介init进程是第一个在user-space启动的进程。
由内核启动参数[init]传递给内核,如果该项没有设置,内核会按/etc/init,/bin/init,/sbin/init,/bin/sh的顺序进行尝试,如果都有的都没找到,内核会抛出 kernel panic:的错误。
init进程包含在跟文件系统中,跟文件系统被直接编译到了内核。
对init 进程的修改,需要重新编译烧写内核。
编译命令:#cd kernel#make uImagCONFIG_INITRAMFS_SOURCE=../out/target/product/Hi3716C/root/ -j 8#cp kernel/arch/arm/boot/uImage out/target/product/Hi3716C/kernel -afv 源代码路径:froyo\system\core\init编译的文件:builtins.cinit.cdevices.cproperty_service.cutil.cparser.clogo.c编译命令:make init生成的文件:/out/target/product/Hi3716C/root/initinit进程启动流程1.安装SIGCHLD信号。
Android启动流程(一)
Android启动流程(⼀)Android 的启动流程话不多说上图内核⾥⾯第⼀个进程 idle 进程⼜叫做Swapper进程 PID = 0Kthread 进程相当于内核的⿐祖init 进程启动⽤户空间的⿐祖zygote java 进程⿐祖SystemServer zygote 的⼤⼉⼦SystemServer ⼜会启动很多服务, 90多个,我们很多服务都在SystemServer进程中SystemServer通过AMS 在zygote 出app进程进程启动⽅式 fork线程启动 new Thread在内核中没有进程和线程之分init 进程的启动kernel/common/init/main.c -> kernel_initinit的⼊⼝函数 -》 main.cppinit.rc脚本⽂件按照init.rc 的内容去执⾏first_state_main主要做⼀些挂载/ 创建⼀些⽂件重定向输⼊输出 error初始化内核的⽇志打印启动 selinux_setupSelinuxSetupSetupSelunx linux这块的安全策略 --- Android ---- 权限最⼩权限原则second_stage_mainPropertyInit(); --- 初始化属性域处理⼦进程终⽌信号 --- 僵⼫进程InstallSignalFdHandler(&epoll);InstallInitNotifier(&epoll);StartPropertyService(&property_fd);GetBultinFunctionmap () 匹配命令和函数之间的关系LoadBootScripts() 解析init.rc--> CreateParser : parserparser.AddSectionParser("server" , xxxx);parser.AddSectionParser("on" , xxxx);parser.AddSectionParser("import" , xxxx);parser.ParseConfig("/system/etc/init/hw/init.rc"); // 解析 init.rcparserConfigDir();parseConfigFile();ParseData() 解析init ⽂件进⼊while 循环 ---- 等待auto pending_function = epoll.Wait(epoll_timeout);⼩结:init处理的重要事情:1. 挂载⽂件2. 设置 seLinux -- 安全策略3. 开始属性服务注册到 epoll中4. 解析 init.rc5. 循环处理脚本⽂件 -- 启动 zygote6. 循环等待输⼊输出stdio --Linux ⼀切皆⽂件system.out.println(); 把这句话写到⽂件夹中(dev/nulll 管道⽂件夹)zygote 进程启动孵化器最重要的作⽤有⼀部分在nitive ⼀部分在javazygote 第⼀个进⼊Java的。
安卓系统启动流程
安卓系统启动流程第一步:启动电源以及系统启用当电源按下,引导芯片代码从指定位置(固化在ROM中)开始执行,加载引导程序到RAM,然后执行。
第二步:引导程序引导程序是在安卓操作系统开始运行前的一个小程序,它是针对针对特定芯片与主板的,设备制造商要么使用很受欢迎的引导程序,比如redboot、uboot、qi bootloader或者自己开发的引导程序。
它不是安卓操作系统的一部分。
引导程序是OEM厂商和设备制造商限制和加锁的地方。
引导程序分两个阶段运行。
第一阶段,检测外部的RAM以及加载对第二阶段的有用的程序;第二阶段,引导程序设置网络、内存等等。
这些对于运行内核是有必要的,为了达到特殊的目标,引导程序可以根据配置参数和输入数据设置内核。
传统的加载器包含两个文件1. init.s初始化堆栈,清零BBS段,调用main.c的_main()函数2. mian.c初始化硬件(主板、键盘、控制台),创建Linux标签第三步:内核内核启动时,设置缓存、被保护存储器、计划列表、加载驱动。
当内核完成系统设置,他首先在系统文件中寻找init文件,然后启动boot进程或者系统的第一个进程第四步:init进程init是第一个进程,可以说它是root进程或者所有进程的父进程。
init进程有两个责任:1.一是挂载目录,比如/sys、/dev、/proc,二是运行init.rc脚本init进程在/system/core/init找到init.rc在/system/core/rootdir/init.rc找到readme.txt在/system/core/init/readme.txt找到对于init.rc文件,安卓中有特定的格式和规则,在安卓中,我们叫做安卓初始化语言。
安卓初始化语言由四大类型的声明组成,即Action(动作)、Commands(命令)、Services(服务)、Options(选项)。
Action(动作):动作是以命令流程命名的,有一个触发器决定动作是否发生。
Android系统启动流程(四)Launcher启动过程与系统启动流程
Android系统启动流程(四)Launcher 启动过程与系统启动流程前言此前的文章我们学习了init进程、Zygote进程和SyetemServer进程的启动过程,这一篇文章我们就来学习Android系统启动流程的最后一步:Launcher的启动流程,并结合本系列的前三篇文章的内容来讲解Android系统启动流程。
建议读这篇文章前要通读本系列的前三篇文章,否则你可能不会理解我在讲什么。
uncher概述Android系统启动的最后一步是启动一个Home应用程序,这个应用程序用来显示系统中已经安装的应用程序,这个Home应用程序就叫做Launcher。
应用程序Launcher在启动过程中会请求PackageManagerService返回系统中已经安装的应用程序的信息,并将这些信息封装成一个快捷图标列表显示在系统屏幕上,这样用户可以通过点击这些快捷图标来启动相应的应用程序。
uncher启动流程SyetemServer进程在启动的过程中会启动PackageManagerService,PackageManagerService 启动后会将系统中的应用程序安装完成。
在此前已经启动的ActivityManagerService会将Launcher启动起来。
启动Launcher的入口为ActivityManagerService的systemReady函数,如下所示。
frameworks/base/services/Java/com/android/server/SystemServer.javaprivate void startOtherServices() {...mActivityManagerService.systemReady(new Runnable() {@Overridepublic void run() {Slog.i(TAG, "Making services ready");mSystemServiceManager.startBootPhase(SystemService.PHASE_ACTIVITY_MANAGER_READY);...}...}在startOtherServices函数中,会调用ActivityManagerService的systemReady函数:frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.javapublic void systemReady(final Runnable goingCallback) {...synchronized (this) {...mStackSupervisor.resumeFocusedStackTopActivityLocked();mUserController.sendUserSwitchBroadcastsLocked(-1, currentUserId);}}systemReady函数中调用了ActivityStackSupervisor的resumeFocusedStackTopActivityLocked 函数:frameworks/base/services/core/java/com/android/server/am/ActivityStackSupervisor.javaboolean resumeFocusedStackTopActivityLocked(ActivityStack targetStack, ActivityRecord target, ActivityOptions targetOptions) { if (targetStack != null && isFocusedStack(targetStack)) {return targetStack.resumeTopActivityUncheckedLocked(target, targetOptions);//1 }final ActivityRecord r = mFocusedStack.topRunningActivityLocked();if (r == null || r.state != RESUMED) {mFocusedStack.resumeTopActivityUncheckedLocked(null, null);}return false;}在注释1处会调用ActivityStack的resumeTopActivityUncheckedLocked函数,ActivityStack 对象是用来描述Activity堆栈的,resumeTopActivityUncheckedLocked函数如下所示。
Android开机启动流程
Android启动流程
• 第四步 Home启动
在ServerThread@SystemServer.java后半段,我们可以看到系统在启 动完所有的Android服务后,做了这样一些动作: (1) 使用xxx.systemReady()通知各个服务,系统已经就绪。 (2) 特别对于ActivityManagerService.systemReady(回调) Widget.wallpaper,imm(输入法)等ready通知。 Home就是在ActivityManagerService.systemReady()通知的过程中建 立的。下面是ActivityManagerService.systemReady()的伪代码: systemReady()@ActivityManagerService.java resumeTopActivityLocked() startHomeActivityLocked();//如果是第一个则启动HomeActivity。 startActivityLocked(。。。)CATEGORY_HOME
Android启动流程
• 第二步 Zygote
Servicemanager和zygote进程就奠定了Android的基础。Zygote这个进程起来才会建立起真正的 Android运行空间,初始化建立的Service都是Navtive service.在.rc脚本文件中zygote的描述: service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server 所以Zygote从main(…)@frameworks/base/cmds/app_main.cpp开始。 (1) main(…)@frameworks/base/cmds/app_main.cpp 建立Java Runtime runtime.start("com.android.internal.os.ZygoteInit", startSystemServer); (2) runtime.start@AndroidRuntime.cpp 建立虚拟机 运行:com.android.internal.os.ZygoteInit:main函数。 (3)main()@com.android.internal.os.ZygoteInit//真正的Zygote。 registerZygoteSocket();//登记Listen端口 startSystemServer(); 进入Zygote服务框架。 经过这几个步骤,Zygote就建立好了,利用Socket通讯,接收ActivityManangerService的请求, Fork应用程序。
Android 启动过程详解
1. Boot系统初始化,具体过程参见(systemcoreinitInit.c)中的main函数,这时候,手机或者模拟器出现的画面是一个console,显示“ANDROID”msg。
2. 初始化成功后,就开始mounting系统,具体参见(systemcoremountdMountd.c) 中的main函数。
3.接下来运行ndroidRuntime,并开始启动java虚拟机dalvikvm。
4. Java虚拟机启动成功后,开始系统初始化。
系统初始的第一步是用JNI方式实现的,对应java代码为(frameworks ase servicesjavacomandroidserverSystemServer.java) init1(Native)函数,对应的JNI C++代码为(frameworks asecorejniserver com_android_server_SystemServer.cpp),而实现的C++代码为(frameworks asecmdssystem_serverlibrary System_init.cpp) 中的system_init()函数。
5. system_init调用SurfaceFlinger,SurfaceFlinger的readyToRun()函数用BootAnimation来实现开机动画,这时候手机或者模拟器显示是一副背景图加一个动态的小机器人。
6. 系统初始化的第二步,将启动ServerThread进程,参见SystemServer.init2()。
ServerThread将启动各种系统服务Activity Manager等等,具体参见ServerThread的run函数,ServerThread同在SystemServer.java中。
7.这之后的事,应该就是进入系统了。
(这部分没有调查过)。
#####################################################对于关注Android底层的朋友来说,其具体的启动过程应该是比较吸引我们的。
Android系统启动过程从下往上的一个过程
init进程启动MediaServer(多媒体服务)、servicemanager(binder服务管
家)、bootanim(开机动画)等重要服务;
init进程还会孵化出installd(用于App安装)、ueventd、adbd、lmkd(用于
内存管理)等用户守护进程;
init进程孵化出Zygote进程,Zygote进程是Android系统的第一个Java
进程,Zygote是所有Java进程的父进程,Zygote进程本身是由init进程孵化
而来的。
4、Framework
Zygote进程,是由init进程通过解析init.rc文件后fork生成的,Zygote进
程主要包含:-加载ZygoteInit类,注册ZygoteSocket服务端套接字;-加载
虚拟机;-PreloadClasses;-PreloadResouces。
Zygote进程fork出SystemServ
一个进程,地位非常重要。
SystemServer进程:负责启动和管理整个Javaframework,包含
ActivityManager,PowerManager等服务。
MediaServer进程:负责启动和管理整个C++framework,包含
进程是所有内核进程的鼻祖。
Android基于Linux提供核心系统服务,
例如:安全、内存管理、进程管理、网络堆栈、驱动模型。LinuxKernel
也作为硬件和软件之间的抽象层,它隐藏具体硬件细节而为上层提供统一的
服务。如果你只是做应用开发,就不需要深入了解LinuxKernel层
3、Native
启动init进程(pid=1),是Linux系统的用户进程,init进程是所有用户进
android开机启动流程说明
android开机启动流程说明第一步:启动linux1.Bootloader2.Kernel第二步android系统启动:入口为init.rc(system\core\rootdir)1./system/bin/service manager: Binder 守护进程;2.Runtime;3.Zygote :app-process/app-main;4.Start VM;5.Start server6.Start android service:Register to service Manager7.Start Launcher第三步:应用程序启动:运行package Managerl Init进程Android系统在启动时首先会启动Linux系统,引导加载Linux Kernel并启动init进程。
Init进程是一个由内核启动的用户级进程,是Android系统的第一个进程。
该进程的相关代码在platform\system\core\init\init.c。
在main 函数中,有如下代码:open_devnull_stdio();log_init();INFO("reading config file\n");init_parse_config_file("/init.rc");/* pull the kernel commandline and ramdisk properties file in */import_kernel_cmdline(0);get_hardware_name(hardware, &revision);snprintf(tmp, sizeof(tmp), "/init.%s.rc", hardware);init_parse_config_file(tmp);这里会加载解析init.rc和init.hardware.rc两个初始化脚本。
Android系统启动过程-uBoot+Kernel+Android
Android系统启动过程-uBoot+Kernel+Android摘要:本⽂是参考⼤量⽹上资源在结合⾃⼰查看源代码总结出来的,让⾃⼰同时也让⼤家加深对Android系统启动过程有⼀个更加深⼊的了解!再次强调,本⽂的⼤多数功劳应归功于那些原创者们,同时⼀些必要的参考链接我会⼀⼀附上。
注:由于本⼈采⽤Exynos4412开发板学习,所以本⽂⼤部分资料都是基于此处理器的简介:对于整个Android系统的启动总的来说分为三个阶段: BootLoader引导即uBoot.bin linux内核启动即zImage Android系统启动即ramdisk.img与system.img 以上四个⽂件都是经过⾃⼰编译后⽣成的且通过烧写测试,接下来开始说这三⼤部分的启动过程。
⽬录:⼀、BootLoader的启动 1.汇编部分 2.c部分 ⼆、Kernel的启动 1.zImage解压缩 2.kernel的汇编启动阶段 3.kernel的c启动阶段 三、Android的启动 1.init进程 2.init启动的各种服务 3.android启动图⽰第⼀部分:BootLoader的启动流程 uBoot的第⼀条指令从cpu/arm920t/start.S⽂件开始 1. 设置CPU进⼊SVC模式(系统管理模式),cpsr[4:0]=0xd3。
1 #include <common.h>2 #include <config.h>34/*5 *************************************************************************6 *7 * Jump vector table as in table 3.1 in [1]8 *9 *************************************************************************10*/111213 .globl _start14 _start: b start_code15 ldr pc, _undefined_instruction16 ldr pc, _software_interrupt17 ldr pc, _prefetch_abort18 ldr pc, _data_abort19 ldr pc, _not_used20 ldr pc, _irq21 ldr pc, _fiq2223 _undefined_instruction: .word undefined_instruction24 _software_interrupt: .word software_interrupt25 _prefetch_abort: .word prefetch_abort26 _data_abort: .word data_abort27 _not_used: .word not_used28 _irq: .word irq29 _fiq: .word fiq3031 .balignl 16,0xdeadbeef 接着进⼊Start_code中:设置CPU进⼊SVC模式。
android系统开机启动流程分析
一,系统引导bootloader加电,cpu执行bootloader程序,正常启动系统,加载boot.img【其中包含内核。
还有ramdisk】二,内核kernelbootloader加载kernel,kernel自解压,初始化,载入built-in驱动程序,完成启动。
内核启动后会创建若干内核线程,在后装入并执行程序/sbin/init/,载入init process,切换至用户空间(user-space)内核zImage解压缩head.S【这是ARM-Linux运行的第一个文件,这些代码是一个比较独立的代码包裹器。
其作用就是解压Linux内核,并将PC指针跳到内核(vmlinux)的第一条指令】首先初始化自解压相关环境(内存等),调用decompress_kernel进行解压,解压后调用start_kernel启动内核【start_kernel是任何版本linux内核的通用初始化函数,它会初始化很多东西,输出linux版本信息,设置体系结构相关的环境,页表结构初始化,设置系统自陷入口,初始化系统IRQ,初始化核心调度器等等】,最后调用rest_init【rest_init会调用kernel_init启动init进程(缺省是/init)。
然后执行schedule开始任务调度。
这个init是由android的./system/core/init下的代码编译出来的,由此进入了android的代码】。
三,Init进程启动【init是kernel启动的第一个进程,init启动以后,整个android系统就起来了】init进程启动后,根据init.rc 和init. <machine_name>.rc脚本文件建立几个基本服务(servicemanager zygote),然后担当property service 的功能打开.rc文件,解析文件内容。
【system/core/init/init.c】将service信息放置到service.list中【system/core/init/init_parser.c】。
Android系统启动过程详解(DOC)
Android系统启动过程详解Android系统启动过程首先Android框架架构图:(来自网上,我觉得这张图看起来很清晰)Linux内核启动之后就到Android Init进程,进而启动Android相关的服务和应用。
启动的过程如下图所示:(图片来自网上,后面有地址)下面将从Android4.0源码中,和网络达人对此的总结中,对此过程加以学习了解和总结,以下学习过程中代码片段中均有省略不完整,请参照源码。
一Init进程的启动init进程,它是一个由内核启动的用户级进程。
内核自行启动(已经被载入内存,开始运行,并已初始化所有的设备驱动程序和数据结构等)之后,就通过启动一个用户级程序init的方式,完成引导进程。
init始终是第一个进程。
启动过程就是代码init.c中main函数执行过程:system\core\init\init. c在函数中执行了:文件夹建立,挂载,rc文件解析,属性设置,启动服务,执行动作,socket监听……下面看两个重要的过程:rc文件解析和服务启动。
1 rc文件解析.rc文件是Android使用的初始化脚本文件(System/Core/Init/readm e.txt中有描述:four broad classes of statements which are Actions, Commands, Services, and Options.)其中Command 就是系统支持的一系列命令,如:export,hostname,mkdir,mount,等等,其中一部分是linux 命令,还有一些是android 添加的,如:class_start <serviceclass>:启动服务,class_stop <serviceclass>:关闭服务,等等。
其中Options是针对Service 的选项的。
系统初始化要触发的动作和要启动的服务及其各自属性都在rc脚本文件中定义。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
android启动流程
Android启动流程:
Android是一款广泛使用的移动操作系统,其启动流程是一个
相对复杂的过程,涉及到多个模块的加载和启动。
下面将详细介绍Android的启动流程。
1、开机自检(Boot)
当手机开机时,首先进行开机自检。
在这个阶段,系统会检测硬件设备的状态,包括电池是否齐全、屏幕是否正常等。
如果硬件设备通过了自检,系统将会开始启动。
2、引导加载程序(Bootloader)
开机自检完成后,系统会加载引导加载程序(Bootloader)。
引导加载程序是硬件平台的一部分,其主要作用是启动操作系统。
在加载引导加载程序的过程中,系统会自动检测手机的存储器设备,确定存储设备中是否有可用的引导文件。
3、Linux内核加载
一旦引导加载程序找到可用的引导文件,系统将会加载Linux
内核。
Linux内核是Android系统的核心组件,负责管理内存、文件系统、驱动程序等。
4、文件系统加载
一旦Linux内核加载完成,系统将会加载文件系统。
Android
系统使用的是基于Linux的文件系统,在这个过程中,系统会
加载并初始化各个文件系统,包括根文件系统、系统文件系统、
数据文件系统等。
5、初始化进程(Init)
一旦文件系统加载完成,系统将会启动初始化进程(Init)。
初始化进程是Android系统的第一个进程,其作用是启动系统的各个进程和服务。
6、启动用户空间(System Server)
在初始化进程启动后,系统会启动用户空间,加载系统的用户界面等组件。
7、启动应用程序
一旦用户空间加载完成,系统将会启动应用程序。
应用程序是Android系统的核心功能,包括系统应用程序和用户安装的应用程序。
系统应用程序包括电话、短信、浏览器等,而用户安装的应用程序则是用户根据自己的需求下载和安装的。
8、应用程序启动完成
一旦应用程序启动完成,系统将进入正常运行状态,用户可以通过界面操作手机。
总结:
Android系统的启动流程是一个复杂而严密的过程,经过开机自检、引导加载程序、Linux内核加载、文件系统加载、初始化进程、启动用户空间、启动应用程序等多个步骤,最终实现用户界面的显示和应用程序的运行。
每个步骤都有其特定的目
的和作用,而整个启动流程的设计和优化,可以有效提高系统的启动速度和用户的体验。