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:
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ß
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ß