Wie erkenne ich, ob ein Programm im Kernel- oder im Benutzerbereich ausgeführt wird?

Wie erkenne ich, ob ein Programm im Kernel- oder im Benutzerbereich ausgeführt wird?

Ich habe ein Linux-Betriebssystem von Grund auf neu entwickelt. Dabei bin ich aufDasArtikel, der ein Linux-Betriebssystem mit absolutem Minimum erstellt, das beim Booten des Linux-Kernels einfach „Hallo Welt“ ausgibt.

Meine Frage ist also, in welchem ​​Bereich (Kernel oder Benutzerbereich) ein solches Hallo-Welt-Programm ausgeführt wird. Mein Gewissen sagt mir, es ist der Kernelbereich, aber wie kann ich es dann im Benutzerbereich ausführen?

Für alle, die den langen Artikel nicht lesen möchten, hier die Kurzfassung.

  • Ich habe meinen USB-Stick [/dev/sdb auf meinem Linux-System] mit dem ext4-Dateiformat formatiert.
  • Habe es im Ordner /mnt/mylinux gemountet.
  • Darin wurden die Ordner /boot und /bin erstellt.
  • Habe eine Kopie des Linux-Kernels [ich habe ihn aus dem GitHub-Quellcode kompiliert.] bzImage im /boot-Ordner abgelegt.
  • Grub2 im /boot-Ordner von /dev/sdb installiert und die Datei grub.cfg erstellt, um mein Init-Programm anzugeben.

Mein Init-Programm.

#include <stdio.h>
#include <unistd.h>

int main(void){
    while(1){
        printf("Hello World\n");
        sleep(1);
    }
}

Mein Init-Programm wird statisch kompiliert und im Ordner /bin abgelegt.

Wenn ich dieses Laufwerk also boote, beginnt es zu drucken: Hallo Welt

Bildbeschreibung hier eingeben

Antwort1

In Ihrem Fall handelt es sich um einen Benutzerbereich: Sie verwenden Standardbibliotheken und nutzen daher die Benutzerbereich-API, um Dinge zu erledigen.

Wenn Ihr Programm vom Kernel ausgeführt wird, haben Sie nur die interne Kernel-API (also kprintf) und viele Einschränkungen in Ihren Möglichkeiten. Darüber hinaus müssen Sie es in den Kernel oder als Kernelmodul einfügen. Der Kernel führt keinen externen Code als Kernelspeicher aus.

Hinweis: Es gibt Hybridfälle, die jedoch immer vom Kernel initiiert werden, um lang anhaltende Prozesse zu gewährleisten und den Kernel nicht zu blockieren. In diesem Fall wird der Code vom Scheduler verarbeitet und in der Liste der Prozesse angezeigt (normalerweise niedrige PID-Nummern, aber nicht 1).

verwandte Informationen