Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android Init startup - Ueventd and watchdogd

I'm a beginner and I'm trying to understand the Kernel-Android interface.

In the system/core/init/init.c, the initial part has the following code.

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

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

This is followed by the parsing of the board specific init.rc files.

The ueventd_main parses the board specific uevent.rc files.

The watchdogd_main tries to set the timeout & then keeps writing an empty character to the /dev/watchdog in an infinite loop.

In the book 'Embedded Android' by Karim Yaghmour, it is mentioned as,

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.

My questions are

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

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

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

like image 829
Gomu Avatar asked Mar 12 '23 17:03

Gomu


1 Answers

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

No, not bootcmd arguments. argv[0] is the name of the executable being launched.

If you look at the Android.mk for init, you will see:

# 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

Here you can see that two extra symbolic links are created, both pointing to init. These will be included in the final Android boot image in /sbin/

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

In init.rc, you can see:

## Daemon processes to be run by init.
##
service ueventd /sbin/ueventd
    class core
    critical
    seclabel u:r:ueventd:s0
    shutdown critical

This is declaring the service ueventd and specifying a path to the ueventd path. So when the ueventd service is started, it will the the init executable but the argv[0] argument will be ueventd.

watchdogd is done the same way.

So it is the same executable called with three different names init, ueventd, or watchdogd. Depending on which name it is called with, one of three different code paths are executed (as in the code you referenced).

This is often done when different commands are substantially the same in implementation. On my Ubuntu system:

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

You can see that unxz is linked to xz From the man page for xz: unxz is equivalent to xz --decompress.

So here, there was only one executable, but depending on which executable name is used to launch it, the behavior is different.

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

Answered in previous two answers.

like image 198
Dave B Avatar answered Mar 23 '23 08:03

Dave B