Android Init 启动之Ueventd 和 watchdogd

lovecherry 阅读:56 2024-10-25 08:56:14 评论:0

我是一个初学者,我正在尝试理解 Kernel-Android 界面。

system/core/init/init.c ,初始部分有以下代码。

if (!strcmp(basename(argv[0]), "ueventd")) 
        return ueventd_main(argc, argv); 
 
if (!strcmp(basename(argv[0]), "watchdogd")) 
        return watchdogd_main(argc, argv); 

接下来是板特定的解析 init.rc文件。
ueventd_main解析板特定 uevent.rc文件。
watchdogd_main尝试设置超时,然后继续向 /dev/watchdog 写入一个空字符在无限循环中。

在 Karim Yaghmour 的“嵌入式 Android”一书中,它被称为:

One of the first things init does is check whether it was invoked as ueventd. init includes an implementation of the udev hotplug events handler. Because this code is compiled within init’s own code, init checks the command-line that was used to invoke it, and if it was invoked through the /sbin/ueventd symbolic link to /init, then init immediately runs as ueventd.



我的问题是

1)我相信这个主函数的参数是从内核bootcmd参数“init =”接收的。我对吗?

2) 在什么情况下会调用一个 init 以仅作为 ueventd 或 watchdogd 运行?

3) 符号链接(symbolic link)到/init 是什么意思?

请您参考如下方法:

1) I believe that the arguments to this main function are received from kernel bootcmd parameters "init=". Am I right?



不,不是 bootcmd 参数。 argv[0]是正在启动的可执行文件的名称。

如果您查看 Android.mk对于 init , 你会看见:
# Create symlinks. 
LOCAL_POST_INSTALL_CMD := $(hide) mkdir -p $(TARGET_ROOT_OUT)/sbin; \ 
    ln -sf ../init $(TARGET_ROOT_OUT)/sbin/ueventd; \ 
    ln -sf ../init $(TARGET_ROOT_OUT)/sbin/watchdogd 

在这里您可以看到创建了两个额外的符号链接(symbolic link),都指向 init。这些将包含在 /sbin/ 中的最终 Android 启动镜像中

2) Under what scenario one would invoke an init to be run only as ueventd or watchdogd?



init.rc ,你可以看到:
## Daemon processes to be run by init. 
## 
service ueventd /sbin/ueventd 
    class core 
    critical 
    seclabel u:r:ueventd:s0 
    shutdown critical 

这是声明服务 ueventd 并指定 ueventd 的路径小路。所以当 ueventd服务启动后,它将执行 init,但 argv[0]参数将是 ueventd .
watchdogd以同样的方式完成。

所以它是用三个不同名称调用的同一个可执行文件 init , ueventd , 或 watchdogd .根据调用它的名称,会执行三种不同的代码路径之一(如您引用的代码中所示)。

当不同的命令在实现上基本相同时,通常会这样做。在我的 Ubuntu 系统上:
$ ls -l /usr/bin/unxz 
lrwxrwxrwx 1 root root 2 Oct  3 11:04 /usr/bin/unxz -> xz 

你可以看到 unxz链接到 xz来自 xz 的手册页: unxz is equivalent to xz --decompress.
所以在这里,只有一个可执行文件,但根据用于启动它的可执行文件名称,行为是不同的。

3) What do they mean by symbolically linked to /init?



在前两个答案中回答。


标签:Android
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号