资源描述:
《Android设备节点》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第1章Android设备节点的创建在编写linux设备驱动程序的时候,很多时候都是利用mknod命令来手动创建设备节点的,带上名字和主次设备号就可以在/dev目录下生成设备节点。同样Android沿用了linux内核,很多设备驱动的节点是又是什么时候创建的呢?在kernel自解压模块加载完成之后,会去运行android第一个应用程序init。在init.c的main函数中。System/core/init/init.cintmain(intargc,char**argv){……action_for_each_trigger("boot",action_add_queue_t
2、ail);……}在init进程解析init.rc脚本完成后,在onboot的最后两句是classstartmain和core,其中classStart是命令,在keyword.h中定义了class_start对应的function实际就是do_class_start。System/core/init/builtins.cintdo_class_start(intnargs,char**args){service_for_each_class(args[1],service_start_if_not_disabled);return0;}System/core/init/in
3、it_parser.cvoidservice_for_each_class(constchar*classname,void(*func)(structservice*svc)){……list_for_each(node,&service_list){svc=node_to_item(node,structservice,slist);if(!strcmp(svc->classname,classname)){func(svc);}}在之前解析init.rc脚本的时候,service会被放在service_list的链表里。接下来就是要执行service_for_each_
4、class的func(svc),也就是service_start_if_not_disabled。System/core/init/builtins.cstaticvoidservice_start_if_not_disabled(structservice*svc){if(!(svc->flags&SVC_DISABLED)){service_start(svc,NULL);}}Android的service大都是编译成可执行文件以命令的格式,我们注意到在init.rc中又这么个6service值得关注下。serviceueventd/sbin/ueventdclassc
5、orecriticalAndroid的服务不是选项不是disabled并且带core和main的选项的服务都是需要开机自动加载的服务。而ueventd是由system/core/init/ueventd.c编译而成的。System/core/init/ueventd.cintueventd_main(intargc,char**argv){……ueventd_parse_config_file("/ueventd.rc");……snprintf(tmp,sizeof(tmp),"/ueventd.%s.rc",hardware);ueventd_parse_config_f
6、ile(tmp);……device_init();……while(1){ufd.revents=0;nr=poll(&ufd,1,-1);if(nr<=0)continue;if(ufd.revents==POLLIN)handle_device_fd();}}Ueventd的main函数做的事情比较多,首先是要解析根文件系统下的ueventd.rc以及ueventd.${hardware}.rc。System/core/init/ueventd_parser.cintueventd_parse_config_file(constchar*fn){char*data;dat
7、a=read_file(fn,0);if(!data)return-1;parse_config(fn,data);DUMP();return0;}staticvoidparse_config(constchar*fn,char*s){……state.parse_line=parse_line_device;……6for(;;){……switch(token){caseT_EOF:state.parse_line(&state,0,0);return;caseT_NEWLINE:if(nargs){tate.par