Autor Thema: Multitasking  (Gelesen 22935 mal)

ChristianF

  • Beiträge: 296
    • Profil anzeigen
    • DeutschOS - Betriebssystem Projekt
Gespeichert
« Antwort #40 am: 17. August 2009, 08:19 »
Ich bin so langsam dabei, zu beginnen, den ganzen sinnlosen Krempel zu entfernen. Das heißt, dass ich den Code etwas aufräume...
 
Hierzu bin ich momentan beim Multitasking und beim Paging dran. Multitasking deswegen, weil ich bei dem Erstellen des Tasks immer das Page Directory kopiere, dann zu diesem wechsle und dann die Stacks (User-, TSS- und Kernelstack) mappe und mit Werten belege.
Dieses Unterfangen ist gelinde gesagt doof, weswegen ich angefangen habe, eine Funktion zu schreiben, die den Speicher auch dann mappt, wenn das gegebene Page Directory gerade nicht aktuell ist...
 
Hier habe ich mir auch nochmals den Code von Tyndur angeschaut, wobei mir aufgefallen ist, dass nur der User-Stack in das neue Page Directory gemappt wird. Der Kernelstack hingegen wird einfach im Page Directory des Kernels gemappt und initialisiert.
 
Ist es sinnvoll, den Kernelstack immer im Page Directory des Kernels abzulegen, oder sollte ich dabei bleiben, die Stacks immer in das für den Task erstellte Page Directory zu mappen?
 
Gruß Christian

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #41 am: 17. August 2009, 19:54 »
In erster Linie sollte der Stack in dem Page Directory sein, das aktiv ist, wenn er benutzt wird. ;)

Für tyndur ist es so, dass das erste GB in allen Speicherkontexten gleich ist.  Das heißt, wenn es eine Änderung an den Kernelmappings für ein PD gibt, wird diese Änderung auch in alle anderen PDs übertragen. Deswegen ist es das einfachste, den aktuellen Kontext herzunehmen.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

ChristianF

  • Beiträge: 296
    • Profil anzeigen
    • DeutschOS - Betriebssystem Projekt
Gespeichert
« Antwort #42 am: 18. August 2009, 08:19 »
Das macht natürlich einiges einfacher...
 
Mal sehen...
Ich muss auch noch genau festlegen, wo die User-Programme/Treiber liegen und was Part des Kernels ist. Eventuell würde es bei mir so aussehen, dass 0-1 GB und GB 3 - 4 (0xCXXXXXXX) Bereiche des Kernels sind.

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #43 am: 18. August 2009, 09:20 »
Wozu willst du denn den Kernelspeicher auseinanderreißen?
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

ChristianF

  • Beiträge: 296
    • Profil anzeigen
    • DeutschOS - Betriebssystem Projekt
Gespeichert
« Antwort #44 am: 18. August 2009, 10:01 »
Mmmmmhhh...
In 0xCXXXXXXX liegt der Heap des Kernels...
Das hatte ich aus irgendeinem Tutorial mal übernommen und nach dem Neuschreiben des Heapmanagers nicht geändert.
Es wäre vielleicht sogar einfacher für das Zuordnen der Speicherseiten, wenn ich den Heap nach 0xAXXXXXXX verlegen würde und alle User-Programme ab 0xB0000000 zur Verfügung stellen würde...
 
Mal sehen, wie ich das dann letzten endes mache...
 
Noch eine Frage. Ich habe vor, nur einen einzigen Virtual 8086 Mode-Task maximal auszuführen. Das Programm führt also einen System Call aus und teilt mir mit, das der Interrupt 0x13 mit den Parametern xyz ausgeführt werden soll. Dafür erstelle ich einen Stack, sperre alle anderen Tasks für die Ausführungszeit, und führe diesen erstellten Task aus.
Meine Frage ist nun, muss ich dafür noch zusätzlich Speicher reservieren, außer für den Stack? Die Speicherseite < 1MB würde ich einfach für die Zeit der Ausführung des Interrupts in den Usermode mappen.

 

Einloggen