Forum: PC Hard- und Software wie startet Embedded Linux die Applikation?


von schönWetter (Gast)


Lesenswert?

Hallo zusammen,

ich habe vor einigen Wochen mit Embedded Linux angefangen, habe mich da 
mittlerweile durch die Bootloader und das Betriebssystem durchgekämpft 
bin aber jetzt an eine Stelle angekommen wo ich nicht mehr weiter weiß 
und keine Hilfe finde, eventuell nicht die richtigen Frage Stelle:

Ich habe ein kleines minimales EmbSys welches über Embbeded Linux läuft 
und frage mich, wie denn genau Linux die Anwendung von allein startet, 
die das System letztendlich kontrolliert/verarbeitet.

Weiß mir jemand einen Rat?

Grüße

Ich!

von Christian Aurich (Gast)


Lesenswert?

Das wird üblicher Weise über Init Skripte gemacht.

Schau dir mal an, was im Ordner /etc/init.d liegt. Evtl. hast du da eine 
Datei rcS drin, wo schon Sachen gestartet werden. Eleganter ist jedoch, 
wenn man für seine Anwendung ein eigenes Init Skript hat, das die 
Anwendung beim Shutdown auch sauber beendet (falls das bei dir nötig 
ist).

Christian

von schönWetter (Gast)


Lesenswert?

na das trifft ja direkt ins Schwarze. Wenn ich mit Buildroot ein BS 
erstelle bekomm ich ja dann die Datei welche auf dem EmbSys gestartet 
wird. Aber ich habe dort (bsp. über make menuconfig) meines Wissens 
nicht einstellen können, was denn eigentlich passieren soll wenn alles 
betriebsbereit ist.

Achja herzlichen Dank für die schnelle Antwort ;) das hat mir schon mal 
mehr Stichworte zum Suchen gegeben.

von Lukas K. (carrotindustries)


Lesenswert?

Bei ganz winzigen Embedded-Systemen besteht init auch nur aus einem 
einzigen Busybox-shellskript, das Netzwerk anwirft, einige Kernelmodule 
lädt und direkt die Anwender-App startet.

von schönWetter (Gast)


Lesenswert?

Aha und wo finde ich dann diesen Busyboxeintrag? Überhaupt, ich kann 
Busybox an- und abwählen aber bei dem, was am Schluss dabei rauskommt 
lässt sich nichts mit >> Busybox << finden.

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

Der erste Prozess, der nach der Initialisierung des Linux-Kernels 
gestartet wird, hat immer die PID 1 und heißt meistens "init". Init 
startet anschließend ggf. alle weiteren Dienste, Anwendungen, usw. und 
bedient sich dabei meist einer Datei namens /etc/inittab.

Die Reihenfolge, in der nach den (Userland-)Programm "init" gesucht 
wird, lautet:

/sbin/init
/etc/init
/bin/init
/bin/sh

Ja, richtig gelesen. Wenn kein init-Programm gefunden werden kann, wird 
direkt eine Shell gestartet. Üblicherweise terminiert die Suche schon 
nach der ersten gefundenen Datei.

Nachzulesen ist das ganze in der Datei ${SRC}/init/main.c

Statt "init" könnte man auch ein beliebiges anderes Programm im Userland 
starten, welches dann selbst weitere Prozesse erzeugt. Bei einem Kernel 
mit statisch gelinkten Modulen gibt es da keine weiteren 
Einschränkungen. Nur werden dann eben die üblichen Daemons nicht laufen, 
was aber durchaus gewünscht sein kann.

von schönWetter (Gast)


Lesenswert?

aha das bringt doch noch mehr Licht ins Dunkel, interessant wär doch zu 
wissen wie solch ein Startbefehl aussieht, sprich wie ich meinem ES 
beibringe meine Applikation auszuführen.

Wenn keines dieser Ordnersturkturen wie im Beitrag von schweigstill 
angegeben vorhanden ist, kann ich dann davon ausgehen dass es gar kein 
Startskript gibt oder können die einfach irgendwo liegen? und wenn sie 
das tun dürfen, dann versteh ich leider noch nicht woher Linux überhaupt 
weiß was es tun soll wenn es betriebsbereit ist.

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

schönWetter schrieb:
> aha das bringt doch noch mehr Licht ins Dunkel, interessant wär doch zu
> wissen wie solch ein Startbefehl aussieht, sprich wie ich meinem ES
> beibringe meine Applikation auszuführen.

Das Programm "init" IST der Startbefehl! Wenn Du Deinem eigenen 
Programm den Namen "init" gibst und es im root-Dateisystem in /sbin/init 
ablegst, dann läuft es sofort nach der Initialisierung los.

Wenn es keine der o.a. Dateien (init bzw. /bin/sh) gibt, dann läuft zwar 
der Linux-Kernel, aber kein einziger Userland-Prozess. Nur 
Kernel-Threads, die durch (statisch gelinkte) Treiber angelegt werden, 
können dann ausgeführt werden. Solch ein minimalistisches System wäre 
denkbar.

Wenn Du wissen willst, wie übliche init-Prozesse arbeiten, muss Du Dir 
in den Busybox-Quellen die Implementierung des init-Befehls/Programms 
anschauen.

: Bearbeitet durch User
von schönWetter (Gast)


Lesenswert?

hmm wenn ich in meinem linux2.6.39 Ordner suche dann zeigt er mir so an 
die 20 init.c Dateien. Aber die oben genannte Verzeichnisstruktur oder 
ein /init/init.c liegt leider nicht vor.

Also woher weiß ich dann welches das "ur"-Init ist. Da muss es doch 
sowas wie ne Default-Datei geben, ich kann mir nicht vorstellen, dass 
das jedesmal woanders liegt.

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

schönWetter schrieb:
> hmm wenn ich in meinem linux2.6.39 Ordner suche dann zeigt er mir so an
> die 20 init.c Dateien. Aber die oben genannte Verzeichnisstruktur oder
> ein /init/init.c liegt leider nicht vor.

Wieso /init/init.c? Die Datei heißt /init/main.c.

von schönWetter (Gast)


Lesenswert?

in der main.c steht auch der aufruf zur kernel-init etc. jetzt verstehe 
ich so einiges. Vielen Dank das hat mir wirklich sehr viel geholfen!

Grüße

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.