基于MT6752的 android 系统启动流程分析报告
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启动流程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内核加载、文件系统加载、初始化进程、启动用户空间、启动应用程序等多个步骤,最终实现用户界面的显示和应用程序的运行。
MTK系统启动
MTK系统启动流程启动流程图:一 BootRom系统开机,最先执行的是固化在芯片内部的bootrom,其作用比较简单,主要有a.初始化ISRAM和EMMCb.当系统全擦后,也会配置USB,用来仿真USB端口下载镜像。
c.从EMMC中加载preloader到ISRAM中执行。
二 Preloaderpreloader用来初始化外设,配置软件执行环境。
Preloader执行之前,外部Memory没有初始化,故Preloader在内部ISRAM中执行的,其会初始化外部Memory,这样以后的镜像数据就可以加载到外部Memory中来执行。
同时preloader还会初始化UART用来调试,进行META模式握手,配置USB用来下载镜像数据,查找PMT分区表,最后会根据PMT表从EMMC中加载lk/uboot到Memory中来执行。
我们系统有个PMT表,这个是个总的分区表,每个分区数据都可以从这个表中找到。
第一列是该分区起始地址,第二列是该分区占用多少个block,第三列是分区名字。
[0x0000000000000000-0x0000000000ffffff] ( 32768 blocks): "PRELOADER"[0x0000000001000000-0x000000000107ffff] ( 1024 blocks): "MBR" [0x0000000001080000-0x00000000010fffff] ( 1024 blocks): "EBR1" [0x0000000001100000-0x00000000013fffff] ( 6144 blocks): "PRO_INFO" [0x0000000001400000-0x00000000018fffff] ( 10240 blocks): "NVRAM" [0x0000000001900000-0x00000000022fffff] ( 20480 blocks): "PROTECT_F"[0x0000000002300000-0x0000000002cfffff] ( 20480 blocks): "PROTECT_S"[0x0000000002d00000-0x0000000002d1ffff] ( 256 blocks): "SECURE"[0x0000000002d20000-0x0000000002d7ffff] ( 768 blocks): "UBOOT" [0x0000000002d80000-0x000000000417ffff] ( 40960 blocks): "BOOTIMG" [0x0000000004180000-0x000000000557ffff] ( 40960 blocks): "RECOVERY" [0x0000000005580000-0x0000000005b7ffff] ( 12288 blocks): "SECSTATIC" [0x0000000005b80000-0x0000000005bfffff] ( 1024 blocks): "MISC"[0x0000000005c00000-0x0000000005efffff] ( 6144 blocks): "LOGO" [0x0000000005f00000-0x0000000005f7ffff] ( 1024 blocks): "EBR2" [0x0000000005f80000-0x0000000031b7ffff]( 1433600 blocks): "CUSTPACK" [0x0000000031b80000-0x000000003237ffff] ( 16384 blocks): "MOBILE_INFO" [0x0000000032380000-0x0000000032d7ffff] ( 20480 blocks): "APANIC"[0x0000000032d80000-0x000000005537ffff] ( 1126400 blocks): "ANDSYSIMG"[0x0000000055380000-0x0000000061b7ffff] ( 409600 blocks): "CACHE"[0x0000000061b80000-0x00000000a1b7ffff] ( 2097152 blocks): "USER"三 LK(little kernel)lk最主要的工作就是加载kernel和ramdisk,然后跳转到kernel中去执行。
mtk开机启动过程
第一步:启动simulator的时候,直接进入:MMI_task( )1. iacMemInit();2.进入一个while(1)循环。
以后的过程都是通过消息机制,即:一直在这个循环中读取消息,然后做相应的处理。
第一次进入while(1)之后,OslReceiveMsgExtQ(qid, &Message)就读取到一个消息:PRT_MMI_TIMER_IND。
然后就一直在这个循环中读消息。
第二步:Power On读取到消息:MMI_EQ_POWER_ON_INDcase MMI_EQ_POWER_ON_IND:gdi_init();switch (p->poweron_mode) //判断power on的模式{case POWER_ON_KEYPAD: //用户按下开机键OslMemoryStart(TRUE);g_charbat_context.PowerOnCharger = 0; //不是因为充电而开机的InitializeAll(); //初始化,重点学习OslDumpDataInFile();//这个函数不能进入,直接跳过InitNvramData(); //加载保存在NVRAM中的设置的参数mmi_pwron_entry_animation_screen(); //开机动画break;case case POWER_ON_PRECHARGE:case POWER_ON_CHARGER_IN:g_pwr_context.PowerOnMode = p->poweron_mode;InitializeChargingScr();break;case POWER_ON_ALARM: //定时开机AlmInitRTCPwron();break;case POWER_ON_EXCEPTION: //For abnormal reset when invalid SIMOslMemoryStart(TRUE);SetAbnormalReset();InitializeAll();OslDumpDataInFile();ClearInputEventHandler(MMI_DEVICE_ALL);ClearKeyHandler(KEY_END, KEY_LONG_PRESS);InitNvramData();AlmReInitialize();InitAllApplications();mmi_pwron_exception_check_display();break;}执行过开机之后,就不会进入这里了。
android启动流程
android启动流程Android启动流程。
Android系统启动流程是指Android设备在开机时,系统从无到有的整个启动过程。
了解Android启动流程对于开发者和系统维护者来说都是非常重要的,因此本文将对Android启动流程进行详细介绍。
1. 加电启动。
当用户按下设备的电源按钮时,电源管理芯片开始为设备供电,同时CPU开始执行启动代码。
此时,设备进入了启动阶段。
2. Bootloader启动。
在加电启动后,设备会首先运行Bootloader,Bootloader是设备的引导程序,负责初始化硬件并加载操作系统。
Bootloader会检查设备的硬件情况,然后加载操作系统内核。
3. 内核启动。
一旦Bootloader加载了操作系统内核,内核开始初始化设备的硬件,包括CPU、内存、外设等。
内核还会挂载根文件系统,并启动init进程。
4. init进程启动。
init进程是Android系统的第一个用户空间进程,它负责启动系统的其他进程和服务。
init进程会读取init.rc文件,根据文件中的配置启动系统服务和应用程序。
5. 系统服务启动。
在init进程启动后,系统服务会被依次启动。
这些系统服务包括SurfaceFlinger、Zygote、AMS(Activity Manager Service)、PMS(Package Manager Service)等,它们负责管理系统的各个方面,如界面显示、应用程序管理、包管理等。
6. Launcher启动。
当系统服务启动完成后,Launcher会被启动,用户可以看到设备的桌面界面。
Launcher是Android系统的桌面管理器,负责显示桌面、启动应用程序等功能。
7. 应用程序启动。
最后,用户可以通过桌面上的图标启动各种应用程序,进入到自己想要使用的应用程序中。
总结。
Android启动流程经历了Bootloader启动、内核启动、init进程启动、系统服务启动、Launcher启动和应用程序启动等步骤。
android起步过程及各个镜像间的关系
android启动过程及各个镜像间的关系Android启动过程Android在启动的时候,会由UBOOT传入一个init参数,这个init参数指定了开机的时候第一个运行的程序,默认就是init程序,这个程序在ramdisk.img中。
可以分析一下它的代码,看看在其中到底做了一些什么样的初始化任务,它的源文件在system/core/init/init.c 中。
它会调用到init.rc初始化文件,这个文件在out/target/product/generic/root下,我们在启动以后,会发现根目录是只读属性的,而且sdcard的owner是system,就是在这个文件中做了些手脚,可以将它改过来,实现根目录的可读写。
通过分析这几个文件,还可以发现,android启动时首先加载ramdisk.img镜像,并挂载到/目录下,并进行了一系列的初始化动作,包括创建各种需要的目录,初始化console,开启服务等。
System.img是在init.rc中指定一些脚本命令,通过init.c进行解析并挂载到根目录下的/system目录下的。
ramdisk.img、system.img、userdata.img镜像产生过程:首先在linux终端下使用命令file ramdisk.img,打印出如下字符ramdisk.img: gzip compressed data, from Unix,可以看出,它是一个gzip压缩的格式,下面对其进行解压,使用fedora自带的工具进行解压,或者使用gunzip进行解压(可能需要将扩展名改为.gz),可以看到解压出一个新的ramdisk.img,这个ramdisk.img是使用cpio压缩的,可以使用cpio 命令对其进行解压,cpio –i –F ramdisk.img,解压后可以看到生成了一些文件夹和文件。
看到这些文件就会明白,它和root目录下的内容完全一样。
说明了ramdisk.img其实是对root 目录的打包和压缩。
Android手机开机问题分析流程
Android手机开机问题分析流程本篇文章主要介绍 Android 开发中的部分知识点,通过阅读本篇文章,您将收获以下内容:一、如何抓取开机问题Log一、如何抓取开机问题Log当我们遇到开机问题时候,不同阶段,我们需要不同的Log分析,这样才可以快速方便的解决开机问题,如果没有Log,我们几乎很难分析解决开机问题。
开机问题抓取 Log 流程如下:如何抓取开机问题Log二、开机问题Log 分析流程通过不同阶段的Log,我们进行不同的重点分析。
开机问题Log 分析流程如下:开机问题Log分析流程三、 kernel Log 搜索关键字 fs_mgr在 kernel Log 中搜索关键字 fs_mgr 初步分析定位分区问题。
1. fs_mgr: __mount(source=/dev/block/dm-0,target=/system,type=ext4)=-1System分区mount失败debug方法•a.Kernel log中有emmc “I/O error” ,需要检查emmc相关供电,替换物料交叉实验•b.Log中没有I/O error,回读system分区对比正常机器system.img看文件是否被破坏2.fs_mgr: __mount(source=/dev/block/dm-0,target=/data,type=ext4)=-1Data分区mount失败debug方法a.一般加密的情况/userdata分区会先出现 mount fail情况,然后才解密节点/dev/block/dm-0 or dm-1 , target=/data mount成功,正常userdata mount失败,可能是分区数据毁损,请先readback img, 然后手动进recovery mode 做factory reset 看能否恢复Readback 的userdata img可以对比正常机器看是哪个文件毁损3. init: fs_mgr_mount_all returned an errorDm-verity配置错误引起user版本开不了机(eng版本正常)同步打开/kernel-3.18/arch/arm/configs/${project}_defconfig 中如下两个定义:1.CONFIG_DM_VERITY=y2.CONFIG_DM_VERITY_FEC=y4.fs_mgr: Error loading verity table (Invalid argument) 跳转至3四、uart log中搜索关键字 SBC,是否存在error/ fail/ assert五、开始时间长的问题分析方法1. MTK 平台开机时间保存的文件a.手机中(/proc/bootprof)mobile Log中的bootprof文件。
android手机启动过程与刷机简单分析
android手机启动过程与刷机简单分析这几天看了一些嵌入式linux系统和智能手机android系统的资料,琢磨了一下安卓手机的启动过程,虽然每种手机的CPU、主板和存储器有差别,但大致过程相似。
分享一下:手机按下电源开关键后:1、主板上电,CPU芯片加载自身片上的一小段引导代码bootloader(代码的作用:告诉CPU到哪里去寻找系统启动程序,比如到NAND flash接口去读用户程序);2、CPU按扇区方式将NAND FLASH第一个block内的SPL(Second Program Loader二次引导程序即fastboot)加载到RAM,读取分区表,加载基本设备驱动,读取boot分区的linux内核系统;由于SPL对usb设备的支持,所以我们在手机开机时通过按开机键+音量键(不同手机可能按键组合不同),可以进入fastboot工程模式,在这种模式下能通过电脑、USB线对手机进行底层操作。
3、由linux内核加载sysytem分区内的安卓系统程序;第一段引导代码bootloader很小,cpu出厂前已经固化在芯片上了,也叫onchip引导代码,不可人工改写。
二次引导程序SPL是利用JTAG仿真器固化在Nand flash的最前端或后端,我们刷机时能进入fastboot工程模式就是它的功劳。
手机厂商对这段引导程序一般都会加锁,防止用户修改,如果这段代码被破坏,手机就成砖了,只能靠专用设备烧录或返厂维修。
只要手机能进fastboot工程模式,刷recovery、root和刷Rom都是以后的事情了,基本上不会破坏以上两段引导程序。
只要固化的引导程序完好,即使刷机时手机不能进入系统,只要能显示第一屏,一般来说都有挽救的希望,不要变砖。
刷recovery就是在recovery分区安装类似于电脑上ghost一键恢复的程序。
刷Rom包就更简单了,跟电脑装系统一样,就是将安卓系统文件覆盖进手机的system分区。
深入浅出_Android系统移植与平台开发(4)_Android启动流程
深入浅出- Android系统移植与平台开发(四)-Android启动流程作者:唐老师,华清远见嵌入式学院讲师。
一、Android init进程启动还是从Linux的启动开始吧。
Linux被bootloader加载到了内存之后,开始运行,在初始化完Linux运行环境之后,挂载ramdisk.img根文件系统映像,运行里面的init程序,这也是Linux的第一个用户程序,其pid为1。
下面的文章是作者关于init进程启动的描述。
/mr_raptor/article/details/7666906二、Android本地服务的启动init进程启动完之后,开始初始化并启动Dalvik虚拟机,在Dalvik虚拟机启动之前做了一些工作,请看下面一篇文章。
/mr_raptor/article/details/7804984Android启动总结:init进程在执行过程中可以分为以下几个阶段:Ø 启动准备:创建文件系统的基本目录、打开标准输入、标准输出、标准错误,初始化log日志功能等Ø 解析init.rc和init.hardware.rc文件:将rc文件逐行解析成Action或Service。
解析出来的Action和Service分别存放在action_list和service_list链表里,每个Action都对应一个或多个Commands,每个依附于Action的Commands 也由一个链表维护。
Ø 将early-initAction添加到action_queue队列里,等待执行Ø 将init Action添加到action_queue队列里,等待执行Ø 添加其它条件的Action到action_queue队列里Ø 进入死循环o 从action_queue队列里依次取出每个Action,执行其维护的Commands链表里的命令o 重新启动service_list中标记为SVC_RESTARTING服务o 监听系统属性状态变化事件、子进程信号、Keychord组合按键事件注:在代码里没有明显运行service_list里服务的代码,每个服务都有一个class属性,该属性决定了服务的分类,在init.rc文件的on boot Action最后有两个命令:[plain] view plaincopy1. on boot2. …3. ...4. class_start core5. class_start mainclass_start命令是指运行某一类的服务,先启动了class为core的服务,然后再启动了class为main的服务。
Android教程之开机流程全面解析
Android教程之开机流程全⾯解析本⽂详细讲述了Android的开机流程。
分享给⼤家供⼤家参考,具体如下:开机过程中⽆线模块的初始化过程;如果sim卡锁开启,或者pin被锁住的时候,会要求输⼊pin或者puk,但是这个解锁动作必须在系统初始化完成以后才能进⾏。
(图形系统都还没有初始化怎么输⼊密码阿?)当系统初始化完成以后会调⽤wm.systemReady()来通知⼤家。
这时候该做什么就做什么。
开机过程中⽆线模块的初始化过程:rild 调⽤参考实现 Reference-ril.c (hardware\ril\reference-ril) 中的函数:const RIL_RadioFunctions *RIL_Init(const struct RIL_Env *env, int argc, char **argv)ret = pthread_create(&s_tid_mainloop, &attr, mainLoop, NULL);static void *mainLoop(void *param)ret = at_open(fd, onUnsolicited);RIL_requestTimedCallback(initializeCallback, NULL, &TIMEVAL_0);在 initializeCallback 函数中对猫进⾏了初始化。
static void initializeCallback(void *param){ATResponse *p_response = NULL;int err;setRadioState (RADIO_STATE_OFF);at_handshake();/* note: we don't check errors here. Everything important willbe handled in onATTimeout and onATReaderClosed *//* atchannel is tolerant of echo but it must *//* have verbose result codes */at_send_command("ATE0Q0V1", NULL);/* No auto-answer */at_send_command("ATS0=0", NULL);/* Extended errors */at_send_command("AT+CMEE=1", NULL);/* Network registration events */err = at_send_command("AT+CREG=2", &p_response);/* some handsets -- in tethered mode -- don't support CREG=2 */if (err < 0 || p_response->success == 0) {at_send_command("AT+CREG=1", NULL);}at_response_free(p_response);/* GPRS registration events */at_send_command("AT+CGREG=1", NULL);/* Call Waiting notifications */at_send_command("AT+CCWA=1", NULL);/* Alternating voice/data off */at_send_command("AT+CMOD=0", NULL);/* Not muted */at_send_command("AT+CMUT=0", NULL);/* +CSSU unsolicited supp service notifications */at_send_command("AT+CSSN=0,1", NULL);/* no connected line identification */at_send_command("AT+COLP=0", NULL);/* HEX character set */at_send_command("AT+CSCS=\"HEX\"", NULL);/* USSD unsolicited */at_send_command("AT+CUSD=1", NULL);/* Enable +CGEV GPRS event notifications, but don't buffer */at_send_command("AT+CGEREP=1,0", NULL);/* SMS PDU mode */at_send_command("AT+CMGF=0", NULL);#ifdef USE_TI_COMMANDSat_send_command("AT%CPI=3", NULL);/* TI specific -- notifications when SMS is ready (currently ignored) */at_send_command("AT%CSTAT=1", NULL);#endif /* USE_TI_COMMANDS *//* assume radio is off on error */if (isRadioOn() > 0) {setRadioState (RADIO_STATE_SIM_NOT_READY);}}默认状况下假设射频模块是好的,通过 setRadioState (RADIO_STATE_SIM_NOT_READY) 来触发对⽆线模块的初始化。
android开机启动流程简单分析
android开机启动流程简单分析android启动当引导程序启动Linux内核后,会加载各种驱动和数据结构,当有了驱动以后,开始启动Android系统同时会加载用户级别的第一个进程init(system\core\init\init.cpp)代码如下:int main(int argc, char** argv) {.....//创建文件夹,挂载// Get the basic filesystem setup we need put together in the initramdisk// on / and then we'll let the rc file figure out the rest.if (is_first_stage) {mount("tmpfs", "/dev", "tmpfs", MS_NOSUID, "mode=0755");mkdir("/dev/pts", 0755);mkdir("/dev/socket", 0755);mount("devpts", "/dev/pts", "devpts", 0, NULL);#define MAKE_STR(x) __STRING(x)mount("proc", "/proc", "proc", 0, "hidepid=2,gid=" MAKE_STR(AID_READPROC));mount("sysfs", "/sys", "sysfs", 0, NULL);}.....//打印日志,设置log的级别klog_init();klog_set_level(KLOG_NOTICE_LEVEL);.....Parser& parser = Parser::GetInstance();parser.AddSectionParser("service",std::make_unique<ServiceParser>());parser.AddSectionParser("on", std::make_unique<ActionParser>());parser.AddSectionParser("import", std::make_unique<ImportParser>());// 加载init.rc配置文件parser.ParseConfig("/init.rc");}加载init.rc文件,会启动一个Zygote进程,此进程是Android系统的一个母进程,用来启动Android的其他服务进程,代码:从Android L开始,在/system/core/rootdir 目录中有4 个zygote 相关的启动脚本如下图:在init.rc文件中,有如下代码:import /init.environ.rcimport /b.rcimport /init.${ro.hardware}.rcimport /b.configfs.rcimport /init.${ro.zygote}.rc注意到上面的代码import /init.${ro.zygote}.rc,这里会读取ro.zygote这个属性,导入相应的init.rc文件。
Android 启动流程分析
1.Android2.3.1 (Tiny210 Source) 启动分析Tiny210 的入口: /linuxrc,该程序并不开源,从符号表信息推测其加入触摸屏校准的功能,最终调用Android的/sbin/init。
1.1init 干的那些事儿干吗的:保姆(打扫卫生),父亲(制造儿子)谁找她:她干爹(内核或者switch_root切换)代码阅读指数:★★★★★重点阅读函数:* main 入口* parse_new_section 处理init.rc配置文件(注意这里默认的service不指定class属性,则默认的classname为"default",将被init.rc脚本的中的语句class_start default 逐一启动)* service_start 启动服务思考:* init.rc 规则* Android 系统中常用用户名和组ID及其应用范围1.2init.rc 规则init.rc最重要的两个keyword,以On开头的"ACTION",以service开头的"Service"。
具体请参考Android源码system\core\init\readme.txt1.2.1ACTION以on打头的“ACTION”,定义启动顺序的流程(early-init,XXXXX这里省略后面详细说init, early-fs, fs, post-fs, early-boot, boot)。
它的触发是被动的,在init.c定义了启动顺序,如前面所述,可以理解为信号触发及回调。
1.2.2SERVICE* 以service打头的"SERVICE",顾名思义,服务服务,为别人服务,是属于预先定义,1.2.3常用command1.3启动流程Android 启动流程跟init程序源码的ACTION定义有关,具体的Service跟/init.rc中的定义有关。
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 启动过程分析
Android 启动过程分析本文来自moko365的Jollen Chen老师的分析,网络一些文章还有加上个人理解。
不一一写明出处。
首先看看整体开机流程。
这个对于软件开发测试工作非常有用,特别是在项目初期的时候,通常出在驱动或者启动参数上面的问题比较多,比如关机充电,连接charger关机等问题。
一般开机过程大致可以分为三个大阶段:1. OS级别,由bootloader载入linux kernel后(注:bootloader和制造商有关,一般都是自己修改后的bootloader,大同小异,无外乎加载了自己的安全机制,我们可以用最常见的uboot来考虑),kernel开始初始化, 并载入built-in 的驱动程序。
Kernel完成开机后,载入init process,切换至user-space后,结束kernel 的循序过程(sequence),进入排程模式(process scheduling)。
2. Android-level,由init process 开始,读取init.rc,Native 服务启动,并启动重要的外部程序,例如:servicemanager、Zygote以及System Server。
3. Zygote-Mode,Zygote 启动完SystemServer 后,进入Zygote Mode,在Socket 等候命令。
随后,使用者将看到一个桌面环境(Home Screen)。
桌面环境由一个名为[Launcher]的应用程序负责提供。
注:Zygote干嘛用的?主要负责启动system server和执行android程序(APK)。
成功启动system server后会使用socket 方式监听(monitor android apps/prcesses)我们的image都包含什么?Bootloader,system(是Android镜像),data(用户数据/data),kernel(android linux kernel,基础OS,负责process 管理,HAL和一些系统程序),ramdisk(init装载,/system/init/init.c).关于开机时间长短问题,对于产品开机和关机时间长短,直接影响到用户的感受,所以我们需要对开机时间进行评估。
武装联发科MT6752的智能手机
武装联发科MT6752的智能手机作者:来源:《电脑爱好者》2015年第04期联发科的拳头产品以魅蓝Note为代表的新一代千元手机最大的优势就是性能够给力,超过40000分的安兔兔测试成绩,足以让它们抗衡那些配备骁龙801的旗舰手机们。
而赋予这些千元级澎湃性能的“源动力”,就是来自联发科的最新64位8核处理器:MT6752。
因此,本文所推荐的产品,也必须要以武装这款芯片为前提。
MT6752性能有多强MT6752是一款基于Cortex-A53架构设计的8核处理器,在8核全开的状态时,其性能可以与Exynos5420和骁龙801媲美,但全速工作时的发热量却比上述高端处理器低了很多。
此外,MT6752还集成了ARM Mali-T760MP2 GPU,支持AFBC帧缓冲压缩技术,可以在1080P 分辨率下实现60fps的标准。
换句话说,MT6752足以“带得动”1080P屏幕,不会像联发科上代MT6592(Cortex-A7架构8核处理器)那样,在配备1080P屏幕时会有略微的延迟感。
我们不妨以具体的3D游戏来量化一下MT6752的性能。
在《现代战争5》中,MT6752与1080P级别屏幕搭档时平均帧数可以维持在24fps左右,《极品飞车17》和《狂野飙车8》级别的竞速类游戏的速度可维持在40fps以上。
总之,现阶段还没有MT6752跑不动的游戏,非常适合预算有限的游戏爱好者选择。
魅蓝Note与同价位手机相比,魅蓝Note最大的优势就是细腻的做工和简洁易用的系统,并武装了1080P全高清屏幕,整体实力不逊于更高端的魅族MX4。
遗憾的是,魅蓝Note不支持存储卡,对影音和游戏爱好者而言,就需要购买价格更高的32GB版本了。
小哇手机小哇手机的硬件规格和魅蓝Note相似,其外观设计有些像OPPO的Find7。
该产品的特色在于增加了一颗支持自定义的“哇”键,前置摄像头达到了800万像素,并且支持更换电池。
可惜,小哇手机的系统缺乏特色,注重系统体验的用户可以自行安装第三方UI桌面弥补。
基于MT6752的 android 系统启动流程分析报告
基于MT6752的Android系统启动流程分析报告1、Bootloader引导 (2)2、Linux内核启动 (23)3、Android系统启动 (23)报告人:日期:2016.09.03对于Android整个启动过程来说,基本可以划分成三个阶段:Bootloader引导、Linux kernel启动、Android启动。
但根据芯片架构和平台的不同,在启动的Bootloader阶段会有所差异。
本文以MTK的MT6752平台为例,分析一下基于该平台的Android系统启动流程。
1、Bootloader引导1.1、Bootloader基本介绍BootLoader是在操作系统运行之前运行的一段程序,它可以将系统的软硬件环境带到一个合适状态,为运行操作系统做好准备,目的就是引导linux操作系统及Android框架(framework)。
它的主要功能包括设置处理器和内存的频率、调试信息端口、可引导的存储设备等等。
在可执行环境创建好之后,接下来把software装载到内存并执行。
除了装载software,一个外部工具也能和bootloader握手(handshake),可指示设备进入不同的操作模式,比如USB下载模式和META模式。
就算没有外部工具的握手,通过外部任何组合或是客户自定义按键,bootloader也能够进入这些模式。
由于不同处理器芯片厂商对arm core的封装差异比较大,所以不同的arm处理器,对于上电引导都是由特定处理器芯片厂商自己开发的程序,这个上电引导程序通常比较简单,会初始化硬件,提供下载模式等,然后才会加载通常的bootloader。
下面是几个arm平台的bootloader方案:marvell(pxa935) : bootROM + OBM + BLOBinformax(im9815) : bootROM + barbox + U-bootmediatek(mt6517) : bootROM + pre-loader + U-bootbroadcom(bcm2157) : bootROM + boot1/boot2 + U-boot而对MT6752平台,MTK对bootloader引导方案又进行了调整,它将bootloader分为以下两个部分:(1) 第1部分bootloader,是MTK内部(in-house)的pre-loader,这部分依赖平台。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于MT6752的Android系统启动流程分析报告1、Bootloader引导 (2)2、Linux内核启动 (23)3、Android系统启动 (23)报告人:日期:2016.09.03对于Android整个启动过程来说,基本可以划分成三个阶段:Bootloader引导、Linux kernel启动、Android启动。
但根据芯片架构和平台的不同,在启动的Bootloader阶段会有所差异。
本文以MTK的MT6752平台为例,分析一下基于该平台的Android系统启动流程。
1、Bootloader引导1.1、Bootloader基本介绍BootLoader是在操作系统运行之前运行的一段程序,它可以将系统的软硬件环境带到一个合适状态,为运行操作系统做好准备,目的就是引导linux操作系统及Android框架(framework)。
它的主要功能包括设置处理器和内存的频率、调试信息端口、可引导的存储设备等等。
在可执行环境创建好之后,接下来把software装载到内存并执行。
除了装载software,一个外部工具也能和bootloader握手(handshake),可指示设备进入不同的操作模式,比如USB下载模式和META模式。
就算没有外部工具的握手,通过外部任何组合或是客户自定义按键,bootloader也能够进入这些模式。
由于不同处理器芯片厂商对arm core的封装差异比较大,所以不同的arm处理器,对于上电引导都是由特定处理器芯片厂商自己开发的程序,这个上电引导程序通常比较简单,会初始化硬件,提供下载模式等,然后才会加载通常的bootloader。
下面是几个arm平台的bootloader方案:marvell(pxa935) : bootROM + OBM + BLOBinformax(im9815) : bootROM + barbox + U-bootmediatek(mt6517) : bootROM + pre-loader + U-bootbroadcom(bcm2157) : bootROM + boot1/boot2 + U-boot而对MT6752平台,MTK对bootloader引导方案又进行了调整,它将bootloader分为以下两个部分:(1) 第1部分bootloader,是MTK内部(in-house)的pre-loader,这部分依赖平台。
(2) 第2部分bootloader,是LK(little kernel的缩写,作用同常见的u-boot差不多),这部分依赖操作系统,负责引导linux操作系统和Android框架。
1.2、bootloader的工作流程1.2.1 bootloader正常的启动流程先来看启动流程图:正常启动的主要工作如下:(1) 设备上电后,Boot ROM开始运行。
(2) BootROM初始化软件堆栈(software stack)、通信端口和可引导存储设备(比如NAND/EMMC)。
(3) BootROM从存储器中加载pre-loader到内部SRAM(ISRAM)中,因为这时候还没有初始化外部的DRAM。
(4) BootROM跳转到pre-loader的入口处并执行。
(5) Pre-loader初始化DRAM和加载U-Boot到RAM中。
(6) Pre-loader跳转到U-Boot中并执行,然后U-Boot做一些初始化,比如显示的初始化等。
(7) U-Boot从存储器中加载引导镜像(boot image),包括linux内核和ramdisk(Android呢?)(8) U-Boot跳转到linux内核并执行。
正常的下载主要工作如下:(1) 设备上电后,Boot ROM开始运行。
(2) BootROM初始化软件堆栈(software stack)、通信端口和可引导存储设备(比如NAND/EMMC)。
(3) BootROM通过UART/USB和flash工具握手。
(4) BootROM通过UART下载pre-loader镜像到NAND flash/EMMC中,然后重启。
(5) BootROM加载pre-loader到内部SRAM汇总,因为DRAM还没有初始化。
(6) BootROM跳转到pre-loader并执行。
(7) Pre-loader初始化DRAM和通过USB与flash工具握手。
(8) Pre-loader通过USB下载其余镜像文件,比如U-Boot、boot image、recovery image、android system image、user data到NAND FLASH/EMMC中。
1.2.3 Bootloader备用的下载流程(emergency download procedure)(1) 设备上电后,Boot ROM开始运行。
(2) BootROM初始化软件堆栈(software stack)、通信端口和可引导存储设备(比如NAND/EMMC)。
(3) BootROM在emergency DL按键按下后,通过USB和flash工具握手。
(4) BootROM通过USB把指定的镜像文件下载到NAND FLASH/EMMC中。
1.3、Pre-loader启动过程1.3.1 Pre-loader的功能pre-loader是MTK内置的loader,它的主要功能如下:(1) 负责在芯片组平台(chipset platform)上准备好可执行的环境(2) 如果外部工具有效,它会试图通过UART或是USB来和外部工具握手。
(3) 从NAND/EMMC加载U-Boot,并跳转到U-Boot。
(4) 使用工具握手,设备能够触发进入下载模式来下载需要的镜像,或是进入工厂/测试模式,比如META模式和ATE工厂模式,在这些模式下可以测试模块,或是通过传递引导参数给U-Boot和linux内核来校准设备(device calibration)1.3.2 Pre-loader中涉及的硬件部分当系统启动时,芯片组(chipset)内部的可引导ROM开始执行,并从可引导存储设备(NAND/EMMC等等)上拷贝pre-loader。
所以,需要通过初始化一些硬件模块来为软件创造必要的可执行环境(essential execution environment),所有这些硬件模块在接下来描述。
(1) PLL模块1) PLL模块用于调整处理器和外部内存的频率。
2) 在PLL模块初始化后,处理器和外部内存的频率可由26MHZ/26MHZ增加到1GHZ/192MHZ。
(2) UART模块1) UART模块用于调试或是META模式下的握手。
2) 默认情况下,UART4初始化波特率为9216000bps和用于调试信息的输出,UART1初始化为115200bps和作为UART META默认端口。
但也可以使用UART1作为调试或是UART META端口。
(3) 计时器(timer)模块这是个基本的模块,用来计算硬件模块所需要的延时或是超时时间。
(4) 内存模块1) Pre-loader由boot ROM加载和在芯片组内部的SRAM中执行,因为外部的DRAM还没有初始化。
2) 为了准备软件整个可执行环境,pre-loader采用内置的内存设置来初始化DRAM(DRAM is initialized upon pre-loader built-inmemory settigns)。
这样,U-Boot 就能够被加载到DRAM中并执行。
(5) GPIO模块(6) PMIC模块为了提供一些基本的硬件功能,比如控制外设电源,pre-loader初始化上层模块(upper modules)。
(7) RTC模块1) 当通过power按键开机后,pre-loader拉高RTC的PWBB来保持设备一直有电(keepthe device alive)和继续引导U-Boot。
2) RTC闹钟(alarm)有可能是设备开机的启动源,对于这种情况,设备部需要按power按键就可自动启动。
(8) USB模块当USB线插入时,它初始化来和外部工具通信,比如用于升级系统的下载工具或是META模式触发器的META工具。
(9) NAND模块(10) MSDC模块Pre-loader可以从NAND flash或是EMMC中加载U-Boot,这两者只能选择其中一种来启动。
1.3.3 Pre-loader的过程(procedure)和流程(flow)1.3.4 pre-loader的上电情景函数位置在:\mediatek\platform\mt6752\preloader\src\core\download.c定义。
1.3.6 具体的代码分析过程代码位置:\mediatek\platform\mt6752\preloader\src\core\main.c代码位置:mediatek\platform\mt6752\preloader\src\core\handshake_usb.c代码位置:mediatek\platform\mt6752\preloader\src\src\drivers\usbtty.c代码位置:\mediatek\platform\mt6752\preloader\src\core\handshake_usb.c代码位置:\mediatek\platform\mt6752\preloader\src\core\download.c 从Bus_hound分析工具,可以看到usb与flash tool工具的握手情况。
1.4、LK启动过程LK是little kernel的简称,是一种bootloader(作用同常见的u-boot差不多),是Travis Geiselbrecht开发的一个开源项目,github地址为git:///travisg/lk.git,而mtk的代码中就用到了LK。
它由pre-loader引导并执行。
从根本上来说(basically),pre-loader已经初始化了相关的硬件模块,而不需要在LK中重新配置这些模块了。
但一些模块在LK中被重新复位来配置硬件寄存器,这样可创造一个干净的环境。
比如计时器模块,在LK中,计时器重新复位清零硬件计数来对计时进行复位。
所有在LK中需要初始化的列在下面:(1) 计时器模块通过复位硬件寄存器来复位计时。
(2) 串口模块LK采用串口模块来配置它的输入/输出系统,在这个模块初始化后,我们可以使用LK提供的“printf(…)”等函数来使用串口功能。
(3) I2C模块(4) PWM模块(5) PMIC模块(6) RTC模块和计时器模块一样,在LKt中,I2C/PMIC/RTC重新复位寄存器来复位这些模块。