《Android快速启动技术优化研究与实现》由会员分享,可在线阅读,更多相关《Android快速启动技术优化研究与实现(75页珍藏版)》请在金锄头文库上搜索。
1、 分类号 密级 UDC注1 学 位 论 文 AndroidAndroid 快速启动技术优化研究与实现快速启动技术优化研究与实现 (题名和副题名) 张方杰张方杰 (作者姓名) 指导教师 雷航雷航 教授教授 电子科技大学电子科技大学 成都成都 (姓名、职称、单位名称) 申请学位级别 硕士硕士 学科专业 计算机系统结构计算机系统结构 提交论文日期 2014.03 论文答辩日期 2014.05 学位授予单位和日期 电子科技大学电子科技大学 2014 年年 06 月月 日日 答辩委员会主席 评阅人 注 1:注明国际十进分类法 UDC的类号。 RESEARCH AND ACHIEVE ABOUT THE
2、OPTIMIZATION OF ANDROID FAST BOOT TECHNIQUE A Master Thesis Submitted to University of Electronic Science and Technology of China Major: Computer Architecture Author: Fangjie Zhang Advisor: Hang Lei School : School of Computer Science void (*complete)(struct device *dev); int (*suspend)(struct devic
3、e *dev); int (*resume)(struct device *dev); int (*freeze)(struct device *dev); int (*thaw)(struct device *dev); int (*poweroff)(struct device *dev); int (*restore)(struct device *dev); int (*suspend_late)(struct device *dev); int (*resume_early)(struct device *dev); int (*freeze_late)(struct device
4、*dev); int (*thaw_early)(struct device *dev); int (*poweroff_late)(struct device *dev); int (*restore_early)(struct device *dev); int (*suspend_noirq)(struct device *dev); int (*resume_noirq)(struct device *dev); int (*freeze_noirq)(struct device *dev); int (*thaw_noirq)(struct device *dev); int (*p
5、oweroff_noirq)(struct device *dev); int (*restore_noirq)(struct device *dev); int (*runtime_suspend)(struct device *dev); int (*runtime_resume)(struct device *dev); int (*runtime_idle)(struct device *dev); ; 第三章 基于 Swsusp 的快速启动 15 起或者是恢复设备时,是按照 domain、type、class、bus 的优先顺序,调用dev_pm_ops 里面的回调函数。 当系统进入
6、suspend或是hibernation过程,在挂起阶段时,设备操作都会经历prepare,suspend,suspend_noirq。Prepare 是为了阻止新设备注册,因为子系统和内核其他部分禁止新的探测方法。Suspend 操作将禁止设备 IO 操作,保存设备的状态(寄存器),并使设备进入低功耗状态。Suspend_noirq 则是处理设备中断部分,使设备不再响应中断。当这些操作结束后,设备将不进行工作(IO 操作,中断处理),保存运行状态(供下次唤醒设备)进入低功耗状态。在恢复阶段,resume_noirq、resume、complete 等过程。resume_noirq 是进行一些
7、操作使设备能再次处理中断,可能会有一些其他恢复操作。resume 则利用保存的信息恢复设备到工作状态,使得其能处理 IO 请求。complete 即撤销 prepare 阶段的操作,使得能够注册新设备。 Linux 电源管理的入口是 sys 文件系统提供的/sys/power/state。在 Linux shell下输入 cat /sys/power/state 可以输出该系统支持的电源管理状态,一般会输出standy、mem、disk。在 shell 下输入 echo disk /sys/power/state,通过文件系统层,内核会执行 state_store 函数,通过判断输入字符串,s
8、tandy 和 mem 则执行pm_suspend 函数,disk 进入 hibernate 函数。pm_suspend 操作流程如下: 1. 开始会检查状态标志,接着调用 enter_state 函数,该函数开始也会检查状态有效性,进而同步文件系统,将磁盘脏页写回。 2. 然后进入 suspend_prepare 函数,分配一个虚拟终端输出 suspend 信息,并且发出一个 Notify 告知系统要进入 suspend 状态。 3. 接着调用 suspend_freeze_processes 冻结系统进程,之后返回到 enter_state继续调用suspend_devices_and_e
9、nter函数,该函数先挂起虚拟终端,此时就没有信息输出了。 4. 接着执行 dpm_suspend_start,该函数里面会遍历驱动模型建立好的设备链表,运行每个设备的 dev_pm_ops 接口里面的函数,此时是 prepare 和 suspend 等等,该函数返回后,设备链表里面的设备都已经被挂起。 5. 返回 enter_state 后面则执行 suspend_enter,该函数是将整个系统进入指定状态的最后操作,运行注册好的 suspend_ops 里面的函数,禁止 nonboot cpu,挂起 sysdev,最后将 cpu 设置低功耗状态。这样整系统都进入了 suspend 状态,等
10、待唤醒源唤起设备。 Android 的 suspend 过程和 Linux 类似,只是早期加入了 early_suspend 过程,Haibernation 和 suspend 操作原理类似,后续章节会分析改流程。 电子科技大学硕士学位论文 16 3.2 Swsusp 快速启动原理 Swsusp快速启动是基于电源管理机制suspend to disk (又称hibernation休眠) ,在关机的时候,将整个系统的状态,包括内存页面,处理器状态,协处理器状态,外部设备的状态(保存在内存中),按照一定格式制作成镜像保存在外部存储器 flash 中,下次开机的时候在内核启动阶段或是 bootloa
11、der 阶段完成后从 flash读取镜像,然后执行恢复流程,最后的结果是恢复到上次关机的状态。 synchronizing file systemsFreeze processAllocate memoryRestore systemSuspend devicesGenerate imagetriggerWrite imagePower off Start_kernelarchitecture initialization initializationInitcall0-3Initcall4-7Software resumeLoad imageCheck image Perform resto
12、ration procedureNormal bootEntry of resumeSubsys, filesystem, devices initiateCore, arch initiateBootloadersuspend flow resume flowNY图 3-2 Swsusp 快速启动 suspend 和 resume 流程 Swsusp 快速启动基于电源管理 hibernation,分为两个阶段,一个是 suspend阶段,另一个是 resume 阶段。Suspend 阶段为了保存系统状态,制作成镜像写到flash 设备上,包括设备状态,处理器和协处理器的状态,系统运行状态(系
13、统所有进程信息)。Resume 阶段是开机的时候经过启动引导以及 kernel 初始化后,读取镜像,恢复系统到上次关机制作镜像时的状态。Swsusp 快速启动 suspend 和resume 流程如图 3-2 所示。 第三章 基于 Swsusp 的快速启动 17 Swsusp 快速启动和 Android 正常启动区别在于内核启动完成后,快速启动是读取镜像,恢复系统至上次关机时的状态,正常启动则是正常启动 Android 应用系统,图 3-3 显示两者之间区别。 bootloaderKernel initInit 进程Native serviceAndroid servicesHome acti
14、vityAndroid正常启动快速启动bootloaderKernel init读取镜像恢复系统Android应用系统启动图 3-3 Android 正常启动与快速启动对比 3.2.1 suspend 流程 Suspend 流程主要分为几个阶段:准备工作、同步文件系统、冻结进程、挂起设备、创建镜像、写镜像、关机。入口是 echo disk /sys/power/state,进而内核执行 state_store 函数,state_store 函数判断输入的字符串,disk 则是要进行休眠则调用 hibernate 函数,该函数是整个休眠的核心,下面围绕该函数分析 suspend流程经历的各个阶段
15、。 3.2.1.1 准备工作 Haibernate 函数刚开始会做一些准备工作,会给 pm_mutex 加锁防止系统睡眠,接着发出一个 Notify 告知系统要休眠,后续接着生成一个系统内存的位图,该位图标记了系统所有内存页面,到后面生成镜像的时候会遍历系统内存页框,根据使用情况标记位图,供后续制作镜像使用。 电子科技大学硕士学位论文 18 3.2.1.2 同步文件系统 Linux 文件系统是基于缓存机制的,宗旨在于更快的访问文件。Linux 设备的内存大部分被磁盘缓存占据,内存缓存了文件 inode(索引节点)结构,buffer(文件磁盘块)结构,dentry(目录)结构,以及超级块等。同步文件系统是指将被修改过的块写回到文件中去,这样避免文件系统不一致导致信息丢失,在休眠前,这一过程非常必要。通过 sys_sync()函数实现,sys_sync 是一个很重要的系统调用。该函数会唤醒 pdflush 内核线程,其遍历超级块结构的脏 inode 链表,将脏inode 对应的块写回到块设备中。 3.2.1.3 冻结进程 后续的制