Android系统移植
第五章本地层的启动流程、调试和设计结构
一、本地层启动流程的本地阶段
二、本地层的结构设计
本地的启动流程
本地部分内容主要是介绍android系统流程的本地阶段,也就是android系统java部分之前的启动流程。
启动流程的概述:在java启动之前主要设计的几个实体:BootLoader、linux内核、根文件系统和init、、system文件系统及其中的一个作为守护进程的可执行程序。
启动步骤如下:bootloader运行(linux的通用部分,如uboot的启动);linux内核的运行(linux的通用部分);内核加载根文件系统(linux的通用部分,从flash中加载);init进程运行(用户空间的第一个进程);;加载system和data文件系统;运行各种服务(主要为各个守护进程)
Android系统启动时前面的部分和linux区别不大,直到进入用户空间,才体现出android系统和其他linux的区别。这些区别的起点就是被android系统中被运行的第一可执行程序init,其他程序都是被init直接或者间接启动的。
本地的启动流程
了解android系统启动流程需要关注以下几个方面:
系统总体的结构(几个单独的映像)
各个具体的程序的组成部分(如可执行程序和配置内容)
系统运行时的结构(分成若干个进程)
启动流程中系统控制权的转移。
图中的粗线部分表示系统宏观上的几个大模块,细线表示各个独立的文件,虚线的部分则表示了系统运行时的结构,表位数字的表示系统大概的启动流程。
BootLoader运行及加载内核
BootLoader运行到一定的阶段,将加载并启动linux内核,这是一个linux系统标准启动的过程,android中也要通过这种方式实现启动。
BootLoader需要传递内核使用的启动参数,然后跳转到内容地址运行,启动内核,内核启动后BootLoader交出控制权,由linux内核控制系统的启动过程。
一般的android使用的是U-boot,u-boot加载的内容为uImage格式的内核。
linux内核运行和加载根文件系统
Android的linux内核与其他系统中标准的linux内核基本相同。Android只是增加了一些自己的模块,在主体部分是标准的。
Linux内核被BootLoader加载后,传入命令行参数运行,此时内核的运行是一个标准的过程,各个系统差别不大。
Linux内核加载后,进入标准的执行过程,运行到一定的阶段后,将根据实际的命令行参数传入的内容加载根文件系统。在android系统中文件系统常用为内存盘的形式表示,作为ramdisk被加载。
Linux内核启动后会直接运行两个进程,1号进程为init为用户空间进程,2号进程为kthreadd(内核线程的Daemon,linux中进程和线程的概念是统一的,他将启动ksoftirqd、events和kswapd0等内核线程,这些内核线程负责系统的正常运行在各个linux系统中,内核线程的运行方式是相同的)是内核空间进程。
用户空间的第一个进程
Init是linux内核加载完根文件系统后,执行的第一个可执行程序,作为用户空间的第一个进程。
对于linux内核,他只需要知道要运行一个可执行程序,而不用关心这个可执行程序是什么。
对于andriod系统,init就是根目录中的init可执行那个程序,他被内核启动后,作为系用户空间的第一个进程来运行,init执行后系统空间部分进入了android系统特定的环境。
init是一个守护进程,是linux系统中用户空间的第一个进程,即1号进程。由于android是基于linux内核的,所以也是android系统中用户空间的第一个进程。Init进程需要完成极其重要的任务。
,,在不同的平台中,。
挂接各个文件系统
在android系统中根文件系统是一个较小的部分,大约只有几百k字节,其中包括init、、和少数的几个目录,。
挂载的脚本如下:
上述代码描述了挂接system分区、其中的system挂接后被设置为只读方式,这里的几个文件系统都赖在mtd格式的分区。分区名称为system挂接的格式为yaffs2。
通常系统中还会关在date、userdata、cache等分区,当这个几个分区被挂接后,才可以使用systme/
第八章 本地层启动流程 来自淘豆网m.daumloan.com转载请标明出处.