***************************************************************************************************************************
作者:EasyWave 时间:2013.07.28
类别:Android系统源码分析 声明:转载,请保留链接
注意:如有错误,欢迎指正。这些是我学习的日志文章......
***************************************************************************************************************************
一):Linux是如何Andriod的呢
我们都知道在Linux系统启动文件系统的时候,一般会在Linux内核中指定command line,如下所示:
从图片中我们可以看到,在linux内核的配置中,有个Boot options的选项,进入之后,我们可以看到有这样的一行命令:
console=ttySAC0 root=/dev/mtdblock2 rootfstype=cramfs init=/linuxrc
这行非常重要,要想成功的启动Andriod系统,最需要关注的是init=/linuxrc,这个在后面详细的讲解,现在我们来看看内核启动之后,都会干些什么事情呢,具体的情参考我的另一篇博文:MACHINE_START and MACHINE_END Macro define 这里面详细的介绍了Linux是如何启动的,这里我们只关注这个函数:static noinline int init_post(void)如下所示:
我们可以看到,内核启动后,会自动的去找前面指定的init=/linuxrc,如果找不到的话,那么他就会去找下面的/sbin/init、/etc/init等等。而在andriod的文件系统中正好是在根目录下有个linuxrc文件,如何看到呢,我们可以通过命令解压ramdisk.img,步骤如下[以OK6410的Andriod系统为例]:
在命令行输入命令: cp ramdisk.img ramdisk.img.gz
之后创建一个文件夹,如:mkdir test,然后复制ramdisk.img.gz到新建的test文件中,之后采用命令:gunzip ramdisk.img.gz进行解压,最后才采用如下的命令:
cpio -i -F ramdisk.img 就将文件系统解压出来了,如下所示:
我们可以在test文件夹中看到一个linuxrc的文件,如下所示:
最后,我们打开linuxrc文件看看里面的内容,如下所示:
看到最后一行/init的吗,不错,Linux内核是通过command line来加载linuxrc,进而linuxrc中加载了/init的Andriod的守护进程init。