Android Init启动-Ueventd和watchdogd

Gom*_*omu 3 embedded android init

我是一个初学者,我想了解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);
Run Code Online (Sandbox Code Playgroud)

接下来是对电路板特定init.rc文件的解析。

ueventd_main解析板特有uevent.rc的文件。

watchdogd_main试图设置逾时则保持写一个空字符到/dev/watchdog一个无限循环。

在Karim Yaghmour撰写的《嵌入式Android》一书中,提到的是:

init做的第一件事就是检查它是否是作为ueventd调用的。初始化包括udev hotplug事件处理程序的实现。因为此代码是在init自己的代码中编译的,所以init检查用于调用它的命令行,如果通过/ sbin / ueventd符号链接到/ init调用了它,则init立即作为ueventd运行。

我的问题是

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

2)在哪种情况下,将调用initd或watchdogd运行的init?

3)通过符号链接到/ init意味着什么?

小智 5

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

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

如果你看一下Android.mkinit,你会看到:

# 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
Run Code Online (Sandbox Code Playgroud)

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

2)在哪种情况下,将调用initd或watchdogd运行的init?

init.rc中,您可以看到:

## Daemon processes to be run by init.
##
service ueventd /sbin/ueventd
    class core
    critical
    seclabel u:r:ueventd:s0
    shutdown critical
Run Code Online (Sandbox Code Playgroud)

这是声明服务未声明并指定该路径的ueventd路径。因此,当ueventd服务启动时,它将是init可执行文件,但argv[0]参数将是ueventd

watchdogd 以相同的方式完成。

因此,它是所谓的有三个不同的名称相同的可执行文件initueventdwatchdogd。根据调用它的名称,将执行三个不同的代码路径之一(如您所引用的代码一样)。

当不同的命令在实现上基本相同时,通常会这样做。在我的Ubuntu系统上:

$ ls -l /usr/bin/unxz
lrwxrwxrwx 1 root root 2 Oct  3 11:04 /usr/bin/unxz -> xz
Run Code Online (Sandbox Code Playgroud)

您可以看到它unxz链接到xz xz的From手册页:unxz is equivalent to xz --decompress.

因此,这里只有一个可执行文件,但是根据使用哪个可执行文件名称来启动它,其行为是不同的。

3)通过符号链接到/ init意味着什么?

在前两个答案中得到了回答。