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.
:
Bearbeitet durch User
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.