Autor Thema: scheduling verstaendnisfrage  (Gelesen 14393 mal)

freeka

  • Beiträge: 3
    • Profil anzeigen
Gespeichert
« am: 24. March 2005, 23:52 »
moin moin

ich lese momentan linux kernelarchitektur, und vom beginn an plagt mich eine verstaendnisfrage, die einen staendig verfolgt, und jetz bei kapitel 5 mag ich nicht mehr weiterzulesen bevor ich das verstanden habe :D

ich hab in verschiedenen, meist programmiertechnischen oder linux bezogenen foren gefragt, aber nie eine zufriedenstellende antwort bekommen; vielleicht bin ich ja hier richtig, wo sich doch hier alle mit os dev beschaeftigen :)

ok, also folgendes: der kernel, oder halt das betriebssystem, managed den verfuegbaren ram, verteilt die rechenzeit der cpu, ermoeglicht den zugriff auf I/O usw. pro cpu kann aber immer nur ein process laufen.

am anfang war mein verstaendnis so: der kernel ist ebenfalls ein process, und immer wenn ein programm was will, zb ram reservieren oder eine datei oeffnen, wird der sheduler irgendwie aktiv (wie wusste ich auch net, da die cpu ja den einen process rennt, der keinen scheduler kennt), welcher den kernel auswaehlt, welche den ram fuer den process organisiert, und dann wird zurueckgewechselt

damit bin ich erstmal in foren fragen gegangen, aber irgendwie konnte mir da keiner was zu sagen.

grade, wo ich durch die linux ml gucke, sehe ich folgendes:

Zitat

The kernel is not a separate task. If you call read() for example, you change
from user to kernel space,[...]

aha, der kernel ist kein seperater process. und die geschichte mit dem kernelspace und dem userspace gibts ja auch noch... das verstehe ich allerdings dann garnicht mehr... wie kann denn ein process bzw ein programm von userspace in den kernel space wechseln (ich nehme mal an PM is das dann? irgendwo mal sowas in den lowlevel magazin gelesen *g*) und dann zb ram reservieren?

keine ahnung wie ich das ausdruecken soll... nehmen wa wieder ein beispiel:

auf nem singleprocessor system laeuft process A. dieser process will speicher. er wechselt von userspace in kernelspace (das sag ich jetz einfach mal so, obwohl ich nicht verstehe wie das geht und worin dieser wechsel besteht), so und nun, im kernelspace, kriegt er speicher.
aber wie? ich mein im kernel gibts ja funktionen usw dafuer, das buddy system blah kenne ich ja alles, aber wie wird das aufgerufen wenn der kernel garkein process ist?

ich hoffe ihr versteht was ich meine, wenn nicht hole ich nochmal weiter aus, will aber keinen mit nem zulangen text abschrecken ; )

ich habe mir jetz viel zu scheduling usw und sogar den einstieg zu os dev angeguckt, aber es ist mir einfach immer noch nicht klar.

und da es ja hier einige gibt, die ihr eigenes os schreiben/geschrieben haben/mitgeschrieben haben, koennt ihr mir das evtl ganz gut erklaeren *hoff*  ich meine ihr habt ja auch irgendwie nen scheduler implementiert fuer multitasking

danke fuer jede antwort & erklaerungshilfe

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 25. March 2005, 00:10 »
Zitat von: freeka
auf nem singleprocessor system laeuft process A. dieser process will speicher. er wechselt von userspace in kernelspace (das sag ich jetz einfach mal so, obwohl ich nicht verstehe wie das geht und worin dieser wechsel besteht),

Das macht man über einen Interrupt, genauer gesagt ein Gate (glaub ich). Wenn man diesen Interrupt (unter Linux ist es AFAIK Int 0x80) aufruft, wird einfach in den Kernel gesprungen und der Kernelcode ausgeführt. Ein paar Register wie z.B. die Segmentregister, der Stackpointer und die Flags werden vorher durch den Interruptbefehl noch geändert. In den Flags wird z.B. der Privilege Level 0 (PL0) eingestellt, d.h. der Code ist auf höchster Ebene, dem Kernel Mode. (Vorher war er PL3, also User Mode.) PL0 erlaubt die Ausführung spezieller Befehle, die im PM für einen Kernel halt wichtig sind und besser nicht von User Mode Programmen aus Sicherheitsgründen ausgeführt werden dürfen (daher das "Protected" in PM) und dort auch mit einem General Protection Fault (oder Invalid Opcode) bestraft werden.

Mit dem Scheduler hat das eigentlich nichts zu tun. Solche syscalls kann man auch in einem Monotasking-System implementieren.
Dieser Text wird unter jedem Beitrag angezeigt.

freeka

  • Beiträge: 3
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 25. March 2005, 00:41 »
Zitat

Das macht man über einen Interrupt, genauer gesagt ein Gate (glaub ich). Wenn man diesen Interrupt (unter Linux ist es AFAIK Int 0x80) aufruft, wird einfach in den Kernel gesprungen und der Kernelcode ausgeführt.

mh, also hier faengst schoa an, gehen wir mal langsam durch. nehmen wir mal den startup von gnu/linux, wobei es latten ist ich denke fast jedes os startet so

also pc an->bios->bootloader. der bootloader laedt das erste programm, den kernel. zu dem zeitpunkt rennt ja wirklich nur der kernel, er initialisiert die hardware usw, und wenn er fertig ist startet er den ersten userspace-process(in dem fall init). hier stellt sich die frage erstmal wie dieser gestartet wird. muss dazu der kernel von PL0 in PL3 wechseln? und wenn der kernel, der einzige process der auf der cpu momentan noch laeuft, in PL3 ist, wo kommt der userspace prozess dann her?

sagen wir der userspace prozess laeuft nun auf der cpu und moechte direkt erstmal ram. nun kommt dein erwaehnter interrupt; wo wurde der ueberhaupt festgelegt und wie wird erkannt (und wer erkennt es)? ich denke mal vom kernel oder? er sagt gut wenn ein process ram moechte soll interrupt 0x80 ausgefuehrt werden, sodass ich (der kernel) bescheid weiss und ram reservieren kann. aber wo wurde das dann gespeichert? ich meine es laeuft ja grade ein anderer process auf der cpu, der nichts von anderen processen weiss und auf keinen anderen speicherbereich zugreifen kann.
wenn nun der process zb ram moechte, ja woher weiss nun wer welcher interrupt wohin geschickt werden soll? es rennt doch nur dieser process der davon nichts weiss: der kernel, wo der interrupt handler etc sitzt, weiss das alles, aber der laeuft ja nicht.

also um diese grundlegende sache ging es mir erstmal; in linux kernelarchitktur zb wird ganz toll beschrieben wie der kernel aufgebaut ist, welche strukturen und buddy memory allocater und scheduler und queries und IPC und was weiss ich, aber das alles nuetzt mir irgendwie nix wenn ich das oben genannte nicht begreife, da ich ja quasi ueberhaupt nicht weiss wie der kernel und die processe laufen

und sorry wenn das nix mit dem scheduler ansich zu tun hat, dachte das fasst man dadrunter ;D

hannibal

  • Host
  • Beiträge: 400
    • Profil anzeigen
    • brainsware - the rock.
Gespeichert
« Antwort #3 am: 25. March 2005, 10:21 »
du weisst aber schon was interrupts sind, ja? ;)

nehmen wir mal dein beispiel vom user-thread, der ram haben will; der user-thread ruft, zb, malloc() auf und genau hier tritt dann der kernel in kraft, da die funktion wohl teil des kernels sein muesste.

wenn du jetzt den scheduler hernimmst, so besteht der im grunde aus einem aufbaucode, der einmal ausgefuehrt wird um die interrupts zu registrieren, und einigen interrupts, die dann aufgerufen werden, wenn zb. eine gewisse zeitspanne um ist und der naechste thread dran ist. (ein task-switch passiert ;) ).

und falls du noch immer nicht ganz verstanden hast: "to interrupt" heisst unterbrechen. im speziellen fall der cpu heisst das einfach, dass der momentane code abgebrochen wird und zum code des interrupts gehuepft wird.

verstanden?
\\o
o//
\o/

freeka

  • Beiträge: 3
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 25. March 2005, 12:10 »
yoa was interrupts sind weiss ich eigentlich; sie werden zb von der prepherie ausgeloest, wenn sie einen job fertig hat, damit die cpu ihre aktuelle arbeit unterbrechen kann und sich der prephierie bzw den process widmen kann, der die prephierie benutzt. oder so ;)

Zitat

nehmen wir mal dein beispiel vom user-thread, der ram haben will; der user-thread ruft, zb, malloc() auf und genau hier tritt dann der kernel in kraft, da die funktion wohl teil des kernels sein muesste.

malloc gehoert aber net zum kernel, das ist doch part der (g)libc oder nicht?! also user-libary oder wie man sie dann nennt.

Zitat

der einmal ausgefuehrt wird um die interrupts zu registrieren

wo werden die denn registriert? der pc muss ja auch wissen, was zu tun ist, wenn ein process drann ist. sind die entsprechenden sachen direkt in der cpu(register?) gespeichert?

Zitat

und einigen interrupts, die dann aufgerufen werden, wenn zb. eine gewisse zeitspanne um ist und der naechste thread dran ist.

yea, aber da kommt ja wieder kernelcode zum einsatz.
bei linux zb liegt der kernel im bereich zwischen _text und _etext, wobei _text 0x100000 ist, also nach dem erste mbyte des ram, und _etext ist halt das ende, also die groesse des kernel. da liegt nun der linux kernel in binaerform, und damit auch die ganzen anweisungen.

so, wenn nun also ein process mittels einen interrupt unterbrochen wird, weil seine zeitscheibe abgelaufen ist, muss ja direkt der kernel code am start sein, um die register zu sichern, die processstrukturen zu aktualisieren und einen neuen process auszuwaehlen. heisst das, das mittels des interrupt zu einer anderen stelle im code gesprugen wird, der dann ausgefuehrt wird (aber nicht als process?! wie gehtn das dann) und sagen wir mal dann der code ab 0x100000 ausgefuehrt wird (oder wo sich der kern und damit auch irgendwo der sheduler befindet)? aber woher weiss man dann, wo ab 0x100000 was (zb der scheduler) liegt?

hannibal

  • Host
  • Beiträge: 400
    • Profil anzeigen
    • brainsware - the rock.
Gespeichert
« Antwort #5 am: 26. March 2005, 10:37 »
Zitat

malloc gehoert aber net zum kernel, das ist doch part der (g)libc oder nicht?! also user-libary oder wie man sie dann nennt.


jain. wenn du einen C-kernel schreibst und die funktion brauchst, muss sie ja 'im' kernel vorhanden sein, richtig?

Zitat

wo werden die denn registriert? der pc muss ja auch wissen, was zu tun ist, wenn ein process drann ist. sind die entsprechenden sachen direkt in der cpu(register?) gespeichert?


lowlevel ausgaben 2 und 3 würde ich dir waermstens ans herz legen ;)



Zitat

so, wenn nun also ein process mittels einen interrupt unterbrochen wird, weil seine zeitscheibe abgelaufen ist, muss ja direkt der kernel code am start sein, um die register zu sichern, die processstrukturen zu aktualisieren und einen neuen process auszuwaehlen. heisst das, das mittels des interrupt zu einer anderen stelle im code gesprugen wird, der dann ausgefuehrt wird (aber nicht als process?! wie gehtn das dann) und sagen wir mal dann der code ab 0x100000 ausgefuehrt wird (oder wo sich der kern und damit auch irgendwo der sheduler befindet)? aber woher weiss man dann, wo ab 0x100000 was (zb der scheduler) liegt?


ich glaub du missverstehst da ein wenig was...der kernel-code an sich, also der wuerschtelcode vom starten, tritt ja nur einmal in aktion - beim starten eben. den rest erledigen (interrupt-)routinen.
achja: du brauchst ja nicht wissen wo die liegen, das weiss ja deine interrupt vector table ;)
\\o
o//
\o/

 

Einloggen