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!
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
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.
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.
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.
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.
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.
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.
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.
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.
Eine eigene Frage?
Dieser Thread ist über 12 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.