当前位置:操作系统 > 安卓/Android >>

Android 创世纪 第二天

 

第二天,google说,荒芜要被开垦,系统便运作了,它是linux。

               --xxx

 

     荒蛮大地就要变得肥沃,linux已经运行起来了。。。。

 

     linux就不多讲了,这里只讲讲被google大刀阔斧改了内核后的linux。

 

     第一天最后,内核init已经干完了自己的事,把控制权交给了第一个用户级进程,也叫做init。

 

     想知道这个init干了什么事,我们只能看看源码,不贴代码,这里只说说它干了什么。

     (system/core/init/init.c -->main)

 

一、清空umask

     也就是设置缺省权限,这里设置为0,umask为0000的话,就相当于chmod中的0777,经常使用linux对于chmod 777应该很熟悉,就是赋予某个文件的权限为,所有组、所有用户可读可写可运行,也就是最宽松的权限。

 

二、创建并挂载一些基本的目录

      创建目录并挂载相应系统:

        /dev   设备目录,所有的外围设备都在这里了,包括真实的设备如sim卡,也包括虚拟的设备如必不可少的null设备。挂载关系是 /dev -> tmpfs,tmpfs顾名思义就是临时文件系统,这个系统只占用内存空间。

       /proc  系统信息目录,包含了当前系统的所有信息,比如进程、时钟等等动态的信息。挂载关系是 /proc -> proc

        /sys  这里存储的东西,都是硬件设备在linux上映射的对象,比如pci设备。挂载关系是 /sys -> sysfs

        /dev/pts  这个是远程终端控制台设备,字符终端啦,如果木有这个的话,就不可能adb shell调试android。挂载关系是 /dev/pts -> devpts

        /dev/socket  服务于android的,socket是linux中进程通信的一种方式,/dev/socket下面就是已经被系统分配的soket资源,这里基本上是一些本地服务,比如ridl,有兴趣可以adb shell查看一下。

 

三、初始化NULL设备,重定向标准输入输出,初始化kmsg系统,并且解析init.rc文件

      null是Linux的一个标准设备,也就是所谓的黑洞,至于为什么有它,就得从输入输出重定向说起,比如linux控制台下运行一个程序,有时会输出一大堆东西,这是它向标准输出写的,我们不想让它显示出来,就是用 > NULL给它的输出重定向到了这个黑洞设备,系统呢会给这个程序返回一个写入成功的操作,实质上,系统什么都木有干。

      kmsg是linux下的一个内核级的日志系统,kernel message。就好比anroid提供的Log系统一样,只是针对内核级别的。

      对于init.rc文件,这里只进行了解析,并没有执行里面的一些命令。

 

四、获得内核命令参数并且解析特定机型的init.*.rc文件

      获得内核命令参数,也就是显式说明的一些参数,如果配置过grub或者Loli的话,就可能与这个打过交道。

     

      每个手机硬件平台都不一样,adb shell一下,会发现有两个rc文件,其中一个就是与特定平台有关的rc配置文件,比如我的defy就是init.mapphone_umts.rc,为什么叫这个?中间就是手机硬件平台的名字,可以 cat /proc/cpuinfo来获得Hardware信息,我的如下:

 

01    # cat cpuinfo

02    cat cpuinfo

03    Processor       : ARMv7 Processor rev 2 (v7l)

04    BogoMIPS        : 299.11

05    Features        : swp half thumb fastmult vfp edsp neon vfpv3

06    CPU implementer : 0x41

07    CPU architecture: 7

08    CPU variant     : 0x3

09    CPU part        : 0xc08

10    CPU revision    : 2

11   

12    Hardware        : mapphone_UMTS

13    Revision        : 0000

14    Serial          : 0000000000000000

15    CPU Tier        : 10可以看到Hardware的值就是rc的副名称。
 

       init首先会获得/porc/cpuinfo中的这个属性值,然后根据这个字符串查找特定的rc文件,最后根据rc中的配置内容,解析它。

 

五、执行rc文件中的命令

      上一步,init已经解析了那两个rc文件,这里,会根据rc文件中的具体内容,来分别执行对应的动作,后面会独立分析rc文件的格式内容,以及执行方法。

 

六、变为守护神

        到这里,init就进入了死循环了for(;;){}。那么它都守护了些什么?

   

    1、porpety service  启动并守护属性服务

        android下特有的。就好比windows下面的注册表,记录了各种信息。大到系统是否成功运行的标志,小到短信声音。用户在设置一些手机设置的时候,在底层,实际就是和propety service打交道。

        

属性前缀

描述

示例(shell下操作)

ro. 只读属性 setprop ro.media.capture.maxres 5m
摄像头的最大像素

persist.

额外存储到/data/property目录下 setprop persist.sys.country CN
不解释。注意,每个属性都存储为单独的一个文件
net. 联网相关,比如gprs、蓝牙…

setprop net.bt.name CAPF

蓝牙的网络名称为CAPF

net.change的值为最后一次更改net.*属性的属性名,例如:

net.change=net.gprs.local-ip

ctrl.start

控制命令

启动init.rc中标注为service的服务

setprop ctl.start bootanim

启动boot动态图像(第二屏启动画面)

一个服务设置后,其结果会以下面的属性返回,例如

init.svc.bootanim=running

ctrl.stop

停止init.rc中标注为service的服务

setprop ctl.stop bootanim

停止boot动态图像(第二屏启动画面)

一个服务设置后,其结果会以下面的属性返回,例如

init.svc.bootanim=stoped

 

        想要查看并设置属性,可以通过以下三种

补充:移动开发 , Android ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,