2016-04-05 7 views
1

Ich bin ein Anfänger und ich versuche, die Kernel-Android-Schnittstelle zu verstehen.Android Init Startup - Ueventd und watchdogd

Im system/core/init/init.c, der erste Teil hat den folgenden Code ein. Diese

wird durch die Analyse des Brettes spezifischen init.rc Dateien gefolgt.

Die ueventd_main Analysiert den Vorstand bestimmten uevent.rc Dateien.

Die watchdogd_main versucht, das Timeout & setzt dann schreibt ein leeres Zeichen an die /dev/watchdog in einer Endlosschleife.

In dem Buch 'Embedded Android' von Karim Yaghmour wird wie erwähnt

Eines der ersten Dinge init tut, ist zu überprüfen, ob es als ueventd aufgerufen wurde. init enthält eine Implementierung der udev hotplug events Handler. Da dieser Code in dem eigenen Code von init kompiliert wird, überprüft init die Befehlszeile, die zum Aufrufen verwendet wurde, und wenn er über die symbolische Verbindung/sbin/ueventd zu/init aufgerufen wurde, wird init sofort als ueventd ausgeführt.

Meine Fragen sind

1) Ich glaube, dass die Argumente für diese Hauptfunktion von Kernel bootcmd Parameter empfangen werden "init =". Habe ich recht?

2) Unter welchem ​​Szenario würde man eine init aufrufen, um nur als ueventd oder watchdogd ausgeführt werden?

3) Was bedeuten sie symbolisch/init verknüpft?

Antwort

3

1) Ich glaube, daß die Argumente zu dieser Hauptfunktion vom Kernel bootcmd Parametern "init =" empfangen werden. Habe ich recht?

Nein, nicht bootcmd Argumente. argv[0] ist der Name der ausführbaren Datei, die gestartet wird.

Wenn man sich die Android.mk für init anschauen, werden Sie sehen:

# 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 

Hier können Sie sehen, dass zwei zusätzliche symbolische Links erstellt werden, die beide zeigen init. Diese werden in der endgültigen Android-Boot-Image enthalten sein in /sbin/

2) Unter welchem ​​Szenario würde man eine init aufrufen, um nur als ueventd oder watchdogd ausgeführt werden?

In init.rc können Sie sehen:

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

Dies ist der Dienst ueventd erklärt und einen Pfad zum ueventd Pfad angeben. Wenn also der Dienst ueventd gestartet wird, wird die init-Programmdatei ausgeführt, aber das argv[0]-Argument lautet ueventd.

watchdogd erfolgt auf die gleiche Weise.

So ist es die gleiche ausführbare Datei mit drei verschiedenen Namen init, ueventd oder watchdogd aufgerufen. Abhängig davon, mit welchem ​​Namen er aufgerufen wird, wird einer von drei verschiedenen Codepfaden ausgeführt (wie in dem Code, auf den Sie verwiesen haben).

Dies wird oft gemacht, wenn verschiedene Befehle in der Implementierung im Wesentlichen gleich sind. Auf meinem Ubuntu-System:

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

können Sie sehen, dass unxz-xz Aus der Manpage für xz verbunden: unxz is equivalent to xz --decompress.

Also hier gibt es nur eine ausführbare Datei, sondern in Abhängigkeit von dem Namen der ausführbaren Datei ist verwendet, um es zu starten, ist das Verhalten anders.

3) Was bedeuten sie symbolisch mit/init verknüpft?

In den vorherigen zwei Antworten beantwortet.