- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Android设备节点
Android设备节点的创建在编写linux设备驱动程序的时候,很多时候都是利用mknod命令来手动创建设备节点的,带上名字和主次设备号就可以在/dev目录下生成设备节点。同样Android沿用了linux内核,很多设备驱动的节点是又是什么时候创建的呢?在kernel自解压模块加载完成之后,会去运行android第一个应用程序init。在init.c的main函数中。System/core/init/init.cint main(int argc, char **argv){……action_for_each_trigger(boot, action_add_queue_tail);……}在init进程解析init.rc脚本完成后,在on boot的最后两句是class start main和core,其中classStart是命令,在keyword.h中定义了class_start对应的function实际就是do_class_start。System/core/init/builtins.cint do_class_start(int nargs, char **args){ service_for_each_class(args[1], service_start_if_not_disabled); return 0;}System/core/init/init_parser.cvoid service_for_each_class(const char *classname, void (*func)(struct service *svc)){……list_for_each(node, service_list) { svc = node_to_item(node, struct service, slist); if (!strcmp(svc-classname, classname)) { func(svc); } }在之前解析init.rc脚本的时候,service会被放在service_list的链表里。接下来就是要执行service_for_each_class的func(svc),也就是service_start_if_not_disabled。System/core/init/builtins.cstatic void service_start_if_not_disabled(struct service *svc){ if (!(svc-flags SVC_DISABLED)) { service_start(svc, NULL); } }Android的service大都是编译成可执行文件以命令的格式,我们注意到在init.rc中又这么个service值得关注下。service ueventd /sbin/ueventd class core criticalAndroid的服务不是选项不是disabled并且带core和main的选项的服务都是需要开机自动加载的服务。而ueventd是由system/core/init/ueventd.c编译而成的。System/core/init/ueventd.cint ueventd_main(int argc, char **argv){……ueventd_parse_config_file(/ueventd.rc);……snprintf(tmp, sizeof(tmp), /ueventd.%s.rc, hardware);ueventd_parse_config_file(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.cint ueventd_parse_config_file(const char *fn){char *data; data = read_file(fn, 0); if (!data) return -1; parse_config(fn, data);
文档评论(0)