• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[geklärt] fork im Kernel

Hi,

ich versuche mich gerade etwas tiefer in den Linux-Kernel einzuarbeiten. Extrem lesenswert ist übrigens dazu "Linux Kernel 0.01 Commentary" (unter http://pramode2.tripod.com/kerneldocs/ ); da wird der erste (und noch übersichtliche ;-)) Kernel 0.01 gut erläutert.

Wo ich derzeit hänge ist: weshalb genau forkt sich der Kernel? :???:

Hier mal die main-Funktion aus main.c des Kernels 0.01:
Code:
int main(void)          /* This really IS void, no error here. */
{                       /* The startup routine assumes (well, ...) this */
/*
 * Interrupts are still disabled. Do necessary setups, then
 * enable them
 */
        time_init();
        tty_init();
        trap_init();
        sched_init();
        buffer_init();
        hd_init();
        sti();
        move_to_user_mode();
        if (!fork()) {          /* we count on this going ok */
                init();
        }
/*
 *   NOTE!!   For any other task 'pause()' would mean we have to get a
 * signal to awaken, but task0 is the sole exception (see 'schedule()')
 * as task 0 gets activated at every idle moment (when no other tasks
 * can run). For task0 'pause()' just means we go check if some other
 * task can run, and if not we return here.
 */
        for(;;) pause();

        return 0;
}

Soweit ich das bislang verstehe, wird in main() nach dem Initialisieren der Interrupts per move_to_user_mode() in den User-Modus übergegangen. D.h. (meine ich) nicht, dass hier Kernelprivilegien abgegeben werden, sondern dass von nun an nicht mehr der (sehr begrenzte) Kernelstack sondern der User-Mode-Stack verwendet wird (Sehe ich das soweit noch richtig? :???: )
Unmittelbar danach forkt sich der Kernel. Der init-Prozess steht an der Spitze des Prozessbaums und erzeugt über fork/exec neue (child) Prozesse; soweit ist mir das klar.

Aber weshalb genau forkt sich der Kernel und welche Aufgaben hat der Prozess, der nun in einer endlosen for-Schleife pause() aufruft?

Es wäre nett wenn mir jemand das erklären könnte.

Gruß
 
A

Anonymous

Gast
Ein Prozess kann nicht einfach aus dem Nichts entstehen. Das geht immer nur durch fork(). Irgendwie muss ja auch der init-Prozess erzeugt werden, und das geht eben nur in dem der Kernel geforkt wird und dann daraus der erste Prozess geformt wird. Was hier task0 macht, ist doch im Kommentar ausreichend beschrieben. Das ist die idle-Warteschleife, die immer nur dann ausgeführt wird, wenn sonst nichts anderes zu tun ist. Der Prozessor muss ja immer laufen und kann nicht einfach per Maschinen Code Befehl gestoppt werden. Wenn er immer laufen soll, benötigt er ständig irgendwelche Befehle die er ab arbeiten kann. Doch was tun, wenn nun wirklich überhaupt nichts für die CPU zu tun ist? Schäfchen zählen geht nicht, da würde die CPU vielleicht zu weit auf die Wiese raus laufen und dann hätte der Kernel keine Kontrolle mehr darüber. ;) Also lässt der Kernel hier dann immer permanent (in einer Endlosschleife) einen NOP (short for No Operation; a instruction without any effect) ausgeführen, in dem er einfach diesen Prozess an die CPU lässt, wenn der Scheduler sonst keinen Prozess hat den er die CPU zuweisen kann.

robi
 
Danke Dir robi für Deine Antwort.

Das ein Prozess nicht aus dem Nichts entstehen kann ist schon klar. Der Init-Prozess könnte theoretisch zunächst aber auch ohne fork(), ganz einfach nur durch Aufruf von init() erzeugt werden.

Aber das hier ist der springende Punkt:
Der Prozessor muss ja immer laufen und kann nicht einfach per Befehl gestoppt werden, Also wird hier permanent ein NOP (short for No Operation) ausgeführt, wenn der Scheduler sonst keinen Prozess hat den er die CPU zuweisen kann.
Mit dieser Erklärung wird mir klar weshalb der Kernel sich forken muss. Danke Dir vielmals!

Theoretisch wäre es aber doch auch denkbar dass der Kernel sich nicht forkt, dafür aber die init() Funktion dann den Job der idle-Task übernimmt falls sonst nix zu tun wäre, oder übersehe ich da was ?


Gruß
 
Oben