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信息,我的如下:
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 ,