Android Init启动 - Ueventd和watchdogd

时间:2016-04-05 13:00:01

标签: android embedded init

我是初学者,我正在尝试了解内核 - 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写一个空字符。

在书中嵌入式Android'作者Karim Yaghmour提到,

  

init做的第一件事就是检查它是否被调用为   ueventd。 init包括udev hotplug事件的实现   处理程序。因为这段代码是在init自己的代码中编译的,所以init   检查用于调用它的命令行,如果是的话   通过/ sbin / ueventd符号链接调用/ init,然后是init   马上就像ueventd一样。

我的问题是

1)我相信这个main函数的参数是从内核bootcmd参数" init ="中获得的。我对吗?

2)在什么情况下,人们会调用init只能作为ueventd或watchdogd运行?

3)它们与符号链接到/ init是什么意思?

1 个答案:

答案 0 :(得分:3)

  

1)我相信收到了这个主要功能的论据   来自内核bootcmd参数“init =”。我是对的吗?

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

如果您查看init的{​​{3}},您会看到:

# 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

在这里你可以看到创建了两个额外的符号链接,都指向init。这些将包含在/sbin/

中的最终Android启动映像中
  

2)在什么情况下,人们只会调用一个init来运行   ueventd或watchdogd?

Android.mk中,您可以看到:

## 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以同样的方式完成。

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

这通常在不同命令在实现中基本相同时完成。在我的Ubuntu系统上:

$ ls -l /usr/bin/unxz
lrwxrwxrwx 1 root root 2 Oct  3 11:04 /usr/bin/unxz -> xz

您可以看到unxzxz相关联 从xz:unxz is equivalent to xz --decompress.

的手册页

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

  

3)它们与符号链接到/ init是什么意思?

回答前两个答案。