备案网站负责人必须为法人吗,苏州姑苏区专业做网站,wordpress调用栏目名称,wordpress怎么自己写代码第二天#xff0c;google说#xff0c;荒芜要被开垦#xff0c;系统便运作了#xff0c;它是linux。 --xxx 荒蛮大地就要变得肥沃#xff0c;linux已经运行起来了。。。。 linux就不多讲了#xff0c;这里只讲讲被google大刀阔斧改了内核后的linux。 第一天最后#xff…第二天google说荒芜要被开垦系统便运作了它是linux。 --xxx 荒蛮大地就要变得肥沃linux已经运行起来了。。。。 linux就不多讲了这里只讲讲被google大刀阔斧改了内核后的linux。 第一天最后内核init已经干完了自己的事把控制权交给了第一个用户级进程也叫做init。 想知道这个init干了什么事我们只能看看源码不贴代码这里只说说它干了什么。 (system/core/init/init.c --main) 一、清空umask 也就是设置缺省权限这里设置为0umask为0000的话就相当于chmod中的0777经常使用linux对于chmod 777应该很熟悉就是赋予某个文件的权限为所有组、所有用户可读可写可运行也就是最宽松的权限。 二、创建并挂载一些基本的目录 创建目录并挂载相应系统 /dev 设备目录所有的外围设备都在这里了包括真实的设备如sim卡也包括虚拟的设备如必不可少的null设备。挂载关系是 /dev - tmpfstmpfs顾名思义就是临时文件系统这个系统只占用内存空间。 /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信息我的如下 # cat cpuinfo
cat cpuinfo
Processor : ARMv7 Processor rev 2 (v7l)
BogoMIPS : 299.11
Features : swp half thumb fastmult vfp edsp neon vfpv3
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x3
CPU part : 0xc08
CPU revision : 2Hardware : mapphone_UMTS
Revision : 0000
Serial : 0000000000000000
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.changenet.gprs.local-ip ctrl.start 控制命令 启动init.rc中标注为service的服务 setprop ctl.start bootanim 启动boot动态图像第二屏启动画面 一个服务设置后其结果会以下面的属性返回例如 init.svc.bootanimrunning ctrl.stop 停止init.rc中标注为service的服务 setprop ctl.stop bootanim 停止boot动态图像第二屏启动画面 一个服务设置后其结果会以下面的属性返回例如 init.svc.bootanimstoped 想要查看并设置属性可以通过以下三种途径 shell浏览文件 /default.prop /system/build.prop /data/property/* java: System.getProperty(“xxxx”); System.setProperty(“xxxx”); c/c: demo.c: #include cutils/properties.h
#include stdio.h
void print_prop(const char* key,const char* value,void* cookie)
{printf(key%s,value%s/n,key,value);
}int main()
{property_list(print_prop,NULL);
} Android.mk: LOCAL_PATH: $(call my-dir)include $(CLEAR_VARS)LOCAL_SRC_FILES: /list_property.cpp /LOCAL_SHARED_LIBRARIES : /libcutils /libutils /LOCAL_MODULE: list_propinclude $(BUILD_EXECUTABLE)include $(call all-makefiles-under,$(LOCAL_PATH)) 2、动态生成设备节点 android的linux下面是没有udev的udev可以说是一个根据内核的硬件消息来自动发现设备的一个程序android下面根据硬件相应的也就是键盘与内存卡在平板上面的话就更多了比如鼠标、键盘等等。没有udev的话android是如何实现硬件的热插拔呢 和udev一样init守护神同样监听了uevent事件自己根据uevent的内容来做相应的事情与udev做了异曲同工之事。 看一下大致流程。首先设备状态更改内核会检测到并发出uevent消息字符串init检测到消息交给相应函数处理这个函数根据uevent的内容再做进一步处理。除了插拔内存卡等android有专门的外存管理机制就是vold其它比如数据线插入、鼠标插入都会处理。 3、监听keychord事件 keychord是组合按键从源码的行为来看应该是考虑到组合键盘这种外设大部分情况不会用到手机上而多用在智能设备上也就是没有触屏以及按键很少的android设备比如运行android的手表神马的通过不同的按键组合来代表一个标准键盘的输入。 这个东东估计用的不多。 4、杀死僵尸进程 什么是僵尸进程 linux的进程有个特点一个主进程可以分裂(fork)子进程android的受精卵zygote完美的发扬了这种精神在桌面版的一些linux中查看系统监视器仔细看看进程信息会发现很多进程会是树状结构点击一个进程后面又展开了好几个进程而且是个多级树。这都是一个进程有fork了好几个子进程的结果。 如果主进程被kill的话那么它的子进程就有可能成为僵尸进程所谓僵尸就是不干活但占用空间的程序死尸这时init守护神就负责回收这些无辜的灵魂来释放本来就稀缺的内存资源。 5、守护重要服务 这些服务是native层面的服务比如servicemanager、vold。例如重要的zygote有时候不经常碰到的感觉和突然重启一样这八成就是zygote崩溃并重启了要知道java世界可是zygote孵化出来的。 解读init.rc android的init.rc语法是独有的可以说是一种语言吧。 init.rc的语法分为行为(Actions),、命令(Commands) 、服务(Services)、选项(Options)。 类别 名称 描述 SECTIONon触发条件同上..service解析serviceCOMMANDchdir更改当前工作目录同上..chroot更改参考的根目录位置..class_start启动某个设置了class名称的服务..class_stop停止某个设置了class名称的服务..domainname域名..exec调用程序并转移进程..export提交变量..hostname主机名..ifup激活网卡..insmod挂载模块..import引入配置比如etc下的一些rc文件和java中的import差不多..mkdir建立目录..mount挂载文件系统..setkey从源码看应该是设置一个命令的关键字缩写比如可以将domainname映射为dn..setprop设置一个属性..setrlimit 设置当前程序可以打开的最大文件数到系统规定程序可以打开的最大文件数 ..start启动服务..stop停止服务..trigger不清楚难道是自定义触发器..symlink建立符号链接..sysclktz 设置基准时间 ..wait等待文件准备好Linux中这是进程调度的函数..write向文件、设备写个什么东西。肯定不是传消息的那个wirte..copy不解释..chown更改所有者..chmod更改权限..loglevelLog输出级别低于这个级别的就输出..restart重启服务OPTIONcapability能力也就是系统对进程的一种权限控制。同上..class设置class name..console启用控制台..critical是否关键也就是4分钟之内重启超过4次的话重启之后就进入recovery模式..disabled不随class自动启动..group组归属..keycodes不明白。。。。。..oneshot只启动一次意外退出后不必重启..onrestart重启时..setenv增加环境变量..socket申请socket资源..user用户归属..ioprioio调度优先级(很多属性与命令用法都与linux中同名命令差球不多) init是分段(section)解析init.rc的在keywords.h中可以查看关键字的定义。init是以什么标志来分段解析init.rc呢结合init.rc的内容可以看出分段标记是以on 和 service来标记的。下面详细说明。 on 啥时候干什么 on属于行为。 on early-init init之前、加载完所有rc文件后即执行在miui的rom中init.rc在early-init执行的是start ueventd根据keywords.h的定义start是个命令(COMMAND)。 这里顺便说下ueventdandroid中底层一般指驱动通知上层的事件用的是ueventjava层通过观察者模式实现用到的类为 UEventObserver使用intent来传递native层用的是android_os_UEventObserver.cpp使用uevent.c通过socket传递。当然这是framework及以下的层面一般开发不经常用到更何况这几个类都没有被暴露出来。 on init 加载propety各项属性文件之前执行在init变为propety service之前都属于init阶段。 on early-boot 启动属性服务后即执行。 on boot boot的时候执行。 on property:xxxxxx 当某个属性设置为预期值时执行。 关于init.rc其实结合/src/system/core/init/* 源码和init.rc文件来看会明白许多。 水平有限错误之处请指正多谢 创世纪:第一天连接http://www.cnblogs.com/hangxin1940/archive/2011/10/01/2196964.html 创世纪:第三天连接http://www.cnblogs.com/hangxin1940/archive/2011/10/22/2221451.html 原创文章转载请说明出处 http://www.cnblogs.com/hangxin1940/archive/2011/10/01/2196964.html