在最后的循环中,监听三个事件,一个是热插拔事件,一个是修改属性服务,几个重要进程的状态.
init.rc文件在Android文件系统运行过程中用于通用的环境设置及进程相关的定义.init.{hardware}.rc用于定义Android在不同平台下的特定进程和环境设置等.
init.rc中的属性值 由执行中的多种进程调用property_get() 来访问
/dev/socket/property_service 进程修改属性值,必须向套接字提交申请
on开头的动作列表 和 以service开头的服务列表
on设置环境变量 挂载根文件系统 NAND闪存采用yaffs2文件系统
58 动作列表和服务列表
关键字symbol 组flags 参数个数args 映射函数func section 0x01 command 0x02 option 0x04
动作列表 on 服务列表 service开头 option运行命令 选项
服务列表和动作列表分别保存到全局变量service_list与action_list中
service_list service
console adbd servicemanager
action_list action
init
socket 创建一个/dev/socket/name
user 执行服务钱改变用户名 group 改变组
oneshot 服务退出后不再启动
创建设备节点文件 通过设备驱动来访问硬件设备 设备节点文件 是设备驱动的逻辑文件
连接已定义的文件 冷插拔 udev自动创建设备节点
系统运行时,某个设备被插入,内核会加载设备相关的驱动程序,驱动程序会调用启动函数probe将主次设备号和设备类型保存到/sys文件系统中,然后出发
uevent,并传递给udev守护进程 而后在/dev目录相应位子创建设备节点文件
使用init进程来扮演udev守护进程的角色 binder驱动程序是冷插拔,一个应用程序若想使用binder,需要通过/dev/binder 设备节点来访问binder驱动程序.
binder驱动程序应该由用户级进程init创建设备节点文件
如果想为用户定义的新设备创建节点文件,需要将驱动相关的信息添加到devperms结构体中
Devices.c (system\core\init)
{ "/dev/cam", 0660, AID_ROOT, AID_CAMERA, 0 }
Devices.c (system\core\init) device_init
/dev/virtual/misc/binder major 10 minor 62 储存设备是block 创建目录是 /dev/block
handle_device_fd创建设备节点 为热插拔 poll函数监听自驱动程序的uevent后调用handle_device_fd函数.创建设备节点文件
vold管理USB存储设备 子进程终止的时候,init会接收传递过来的SIGCHLD信号.并调用相应的处理函数sigchld_handler 套接字对接受的是信号编号9
waitpid wait_for_one_process标记SVC_RESTART函数执行完毕后restart_processes
init进程可以修改属性值 init进程会先检查各属性的访问权限 触发器 记录在on property关键字后的命令即被执行 是共享内存
修改必须向init进程提交属性变更请求 1024个字节作为属性域头property_get 和property_set
/data/property目录中的 属性变更handle_prope_set_fd ctl开头的消息并非是请求系统更改属性值的消息