标签:
Init是linux kernel启动的第一个进程,理解init,对熟悉android系统非常重要。
Android的每个目录下面都有一个非常重要的文件Android.mk,负责编译该目录下面的代码。
System/core/init/android.mk
上面的代码会生成一个叫init的可执行程序,它会被放在/下面,且同时 会产生一个符号链接/sbin/eventd,指向/init. 我们不禁要问,为什么这样做?
Init是一个脚本解释器,它会对目标系统下的两个文件解析,
/init.rc
/init.xxx.rc (xxx代表平台平台名)
先看看源代码目录/device/xxx/init.rc
看来init在解析脚本的时候又启动了一个自己的进程,只是进程名变成了ueventd.
System/core/init/init.c/main
根据进程名不同,程序执行路径不同。Ueventd顾名思义应该是接收uvent的守护进程,这里它的主要作用根据uevent是创建或删除/dev/xxx(xxx设备名),我们知道在linux下面创建设备节点的接口mknod,我们跟进去看看这个接口是在哪里调用的
System/core/init/Ueventd.c/ueventd_main
ueventd有两个脚本需要解析,ueventd.rc,ueventd.xxx.rc,脚本,又见脚本这个脚本可以让客户设置/dev 或 /sys目录及子目录的权限.
system/core/rootdir/ueventd.rc
这里请注意,ueventd_parse_config_file并不创建设备节点,它的作用是提供数据库,当有设备节点生成的时候,eventd会参考这个数据库设置设备节点的权限。
system/core/init/devices.c/device_init
这个函数很简单,主要是创建了uevent的socket handle,同时触发/sys/clas,/sys/block,/sys/devices这三个目录及其子目录下的uevent,然后接受并创建设备节点,至此设备节点才算创建,coldboot里面有个很有意思的函数do_coldboot,这是一个递归调用函数,实现的很有意思,大家可以看看.
system/core/init/Ueventd.c/ueventd_main
死循环,接受kernel传过来的uevent,动态创建或删除节点.
handle_device_fd会最终调用mknod创建设备节点,流程如下:
handle_device_fd-> handle_device_event-> make_device-> mknod
标签:
原文地址:http://www.cnblogs.com/walter-huang/p/4277610.html