Ich versuche, eine Linux-Anwendung auszuführen, und alles, was ich ausführen möchte, ist diese eine Anwendung vom Start weg. Ich brauche Netzwerk und das ist alles (kein Display, Peripheriegeräte usw.). Ich möchte, dass keine anderen Anwendungen ausgeführt werden, damit die von mir ausgeführte Anwendung 100% der CPU enthält. Ist das möglich?
17
Antworten:
Minimales Start-CPIO-Hallo-Welt-Programm Schritt für Schritt
Kompilieren Sie eine Hallo-Welt ohne Abhängigkeiten, die in einer Endlosschleife endet.
init.S
::Wir können nicht verwenden
sys_exit
, sonst die Kernel-Panik.Dann:
Dadurch wird ein Dateisystem mit unserer Hallo-Welt erstellt
/init
, das das erste Userland-Programm ist, das der Kernel ausführen wird. Wir hätten auch weitere Dateien hinzufügen können, aufd/
die über das/init
Programm zugegriffen werden kann, wenn der Kernel ausgeführt wird.Dann
cd
in den Linux - Kernel - Baum, Build ist wie üblich, und führen Sie es in QEMU:Und Sie sollten eine Linie sehen:
auf dem Emulatorbildschirm! Beachten Sie, dass dies nicht die letzte Zeile ist. Sie müssen also etwas weiter nach oben schauen.
Sie können C-Programme auch verwenden, wenn Sie sie statisch verknüpfen:
mit:
Sie können auf echter Hardware mit einem USB-Anschluss ausgeführt werden
/dev/sdX
und:Hervorragende Quelle zu diesem Thema: http://landley.net/writing/rootfs-howto.html Außerdem wird die Verwendung
gen_initramfs_list.sh
eines Skripts aus dem Linux-Kernel-Quellbaum zur Automatisierung des Prozesses erläutert .Nächster Schritt: Richten Sie BusyBox ein, damit Sie mit dem System interagieren können: /unix/2692/what-is-the-smallest-possible-linux-implementation/203902#203902
Getestet unter Ubuntu 16.10, QEMU 2.6.1.
quelle
Sie können den Kernel mit einem
init=/path/to/myapp
in Ihrem Bootloader definierten Parameter starten .quelle
Es hört sich so an, als würden Sie versuchen, einen Kiosk einzurichten . Die meisten Anleitungen im Internet konzentrieren sich auf einen Webbrowser wie Firefox als einzige Anwendung, die ausgeführt wird. In diesem Handbuch finden Sie Ideen.
quelle
Sie können nach dem Booten des Kernels sicher nur eine Benutzeranwendung ausführen. Es wird jedoch nicht 100% der CPU vorhanden sein, da einige andere kernelbezogene Prozesse vorhanden sein müssen. Dies geschieht üblicherweise bei Embedded-Linux-Geräten, z. B. WLAN-Routern. Ich habe auch Erfahrungen aus erster Hand damit, dies für eine Multithread-Anwendung zu tun.
Nach dem Start des Kernels wird ein Initialisierungs- oder Startskript ausgeführt. Informieren Sie sich über Linux- Runlevel und den Init-Prozess. Es werden verschiedene Startschemata verwendet, daher ist es nicht möglich, spezifisch zu sein. Mit Linux können Sie jedoch genau konfigurieren, welche Anwendungen und Daemons für Ihre Situation ausgeführt werden. Abgesehen von einer Startdatei im Stammverzeichnis befinden sich die zu ändernden Dateien in / etc und insbesondere in /etc/init.d
Übrigens, es sei denn, Sie sind ein Superprogrammierer oder bevor Sie einen Remote-GDB-Server zum Laufen bringen, benötigen Sie eine Art Debug-Konsole (entweder die PC-Konsole oder eine serielle Schnittstelle) für Ihre Anwendung. Auf diese Weise können Sie über Seg-Fehler, Busfehler und Assertionsfehler informiert werden. Planen Sie also neben "Networking" auch eine Art "Peripherie".
quelle
Es gibt einige Systemanwendungen, die ausgeführt werden müssen. Außerdem können Sie den Rest der Computerressourcen dieser Anwendung zuweisen. Um das Minimum zu erreichen, können Sie sich wirklich kleine Linux-Distributionen wie TinyCore Linux usw. ansehen.
Es würde auch von der Anwendung selbst abhängen, welche Dienste sie neben dem Netzwerk usw. benötigt.
Ich denke, wenn Sie spezifischere Informationen liefern können, erhalten Sie eine detailliertere Antwort.
Wie welche Art von App usw.
quelle
Wenn Sie wirklich nur den Linux-Kernel, das Netzwerk und Ihre Anwendung möchten, können Sie dies nur folgendermaßen tun:
make menuconfig
Ihren eigenen benutzerdefinierten Kernel herunterladen und konfigurieren ( ) und alle Funktionen entfernen, die nicht mit der Ausführung des Systems und des Netzwerks zusammenhängen. Sie möchten deaktivieren, um die Ebene zu blockieren. Ich weiß nicht, wie dies bei den letzten Kerneln durchgeführt werden sollmake menuconfig
.init
dies nicht der Fall ist, oder Sie müssen darauf vorbereitet sein, mit einem zusätzlichen User-Space-Prozess zu leben.Ich weiß, dass Kernelmodule Prozesse erstellen können - eine einfache
ps aux
würde viele auf einem typischen System anzeigen (sie sind alle in Klammern angegeben). Sie möchten wahrscheinlich, dass Ihr Modul einen Kernelprozess erstellt. Um alle vom Kernel erstellten Prozesse außer Ihren zu entfernen, müssen Sie Threads [kthreadd
], Energieverwaltung [pm
], die Ereignisebene [events
] und andere deaktivieren .Wenn Sie eine praktischere Einrichtung des Kernel + 1-User-Space-Prozesses wünschen, ist dies möglich.
Linux hat eine Kernel-Befehlszeilenoption namens
init=
- dies ist, was der Kernel startet, wenn er geladen ist. Das Programm muss sich auf dem Root-Gerät befinden, das mitroot=
oder in der initrd angegeben ist (von Ihrem Bootloader geladen).Wenn dieses Programm beendet wird, gerät Linux in Panik. Stellen Sie daher sicher, dass es niemals beendet wird.
Viele moderne Linux-Distributionen haben es so eingerichtet, dass ein
init
Programm in der initrd vor dem Start/sbin/init
oder eine zusätzliche Initialisierung des Benutzerraums durchführt/sbin/systemd
. Sie müssen hier herausfinden, was Ihre Distribution tut (Informationen zu Debian finden Sie hier ) und herausfinden, wo Sie das endgültige "Handoff" -Programm angeben können. Von dort aus können Sie es anweisen, Ihre Anwendung anstelle voninit
oder zu startensystemd
.systemd
verwaltet viele grundlegende Funktionen wie/dev
das Erstellen, Festlegen des Hostnamens und andere Dinge. Wenn Sie also flexibel sind, sollten Sie sich stattdessen mit der Konfiguration befassensystemd
, um einen einzelnen Prozess zu erzeugen, und ihn optional neu starten, wenn er fehlschlägt. Wenn ich mich nicht irre, wird dies im Grunde genommen für den Einzelbenutzer- oder Wiederherstellungsmodus ausgeführt - es wird eine Shell gestartet.Es werden 2 Prozesse ausgeführt (
systemd
und Ihr Programm), aber das System gerät nicht in Panik, wenn Ihr Programm beendet wird oder abstürzt.Betrachten Sie auch einfach eine einfache Installation von Debian - eine "netinst" -Installation hat außer dem Kernel, einer Shell und einigen Diensten nicht viel zu tun - oder OpenWRT / LEDE - es gibt einen Webserver für Luci, der standardmäßig ausgeführt wird, und a paar andere Dienste, ist aber leicht deaktiviert.
quelle