Autor Thema: woher 1:1 gemappten speicher  (Gelesen 2878 mal)

faulancer

  • Beiträge: 4
    • Profil anzeigen
Gespeichert
« am: 18. July 2006, 03:38 »
Hallo zusammen,

ich brauch dringend ein paar Ratschläge. Ich lande wie auch immer ich es angehe im Chaos.

Ich versuche gerade, Stack-basiertes Multitasking in mein OS zu implementieren. Funktioniert auch wunderbar, solange ich im Ring 0 bleibe und alles im selben Adressraum laufen lasse.
Als nächsten Schritt sollte nun mein Test-Task ein eigenes CR3 bekommen, und daran ist es auch gleich gescheitert.
Im Prinzip benötigt ja jeder Task ein eigenes Pagedirectory, min. ein Pagetable für den Programmcode und ein Pagetable für den Stack.
Das sind immerhin schonmal 3kb / Task, welche direkt 1:1 gemappt werden müssen.
Um mir das Leben einfach zu gestalten, habe ich nun 1mb innerhalb der ersten 4mb reserviert, die ich eh direkt mappe.
Mein Plan war zuerst einige Helferfunktionen zu schreiben, welche dann in diesem Bereich nach ungenutzen Pagedirectorys / -tables suchen, die dann der Taskmanager nutzen kann. Wie gesagt, Chaos (meiner Meinung nach). Andere Idee: Pagedirectorys an ihrer Adresse lassen und beid jedem Taskswitch den Inhalt erneuern: vieeeel zu langsam.

Habt ihr eine Funktion, welche speziell 1:1 gemappten Speicher zurückgibt oder wie macht ihr das? Gibt es dafür irgentwelche sauberen Lösungen, ohne zig Helfer-Funktionen, 20 reservierte Speicherblöcke und kiloweise verschwendetetn Speicher?

EDIT
Irc sei dank habe ich inzwischen schon einige Lösungsvorschläge erhalten und werde mich mal an folgender Methode versuchen:
Einen definierten bereich virtuellen Speicher nutzen, um diesen immer direkt auf den zu beschreibenden physikalischen Speicher zu mappen.
Nach dem Motto: warum einfach, wenns auch kompliziert geht.
Irgentwie kommen mir meine alten Ideen inzwischen recht absurd vor ;)

Grüße vom Faulancer.

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #1 am: 18. July 2006, 05:11 »
Hi,

bist du noch im Protected Mode? Also ich bin mit meinem OS jetzt im Long Mode *stolz*. Entlich läuft alles, war auch ne arbeit. Also, was ich sagen wollte ist, wenn man im Long Mode (64 Bit Mode) ist, muss jeder Task sowieso eigene Pagetables haben. Da im 64 Bit Mode es ja keine Segmentierungen mehr gibt und ein Task immer bei Null starten muss. Somit muss beim Taskwechsel das cr3 zwischengespeichert werden und das neue geholt werden. In dem neuen wird dann Null was weiß ich wo hingemappt. So brauch jeder Task seine eigenen Pagetables. Im Protected Mode war das ja nicht unbedingt nötig. Man konnte dort ja Segmentieren und brauchte so keine Null als Anfang. Aber damit du später beim Umstieg auf 64 Bit es einfacher hast, würde ich an deiner Stelle jetzt schon, auch wenn du noch im PM bist, jedem Task seine eigenen Pagetables geben. Viel spass und Erfolg noch.

bitmaster
In the Future everyone will need OS-64!!!

faulancer

  • Beiträge: 4
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 18. July 2006, 09:24 »
Hi,

ja, ich bin noch im Protected Mode.
Ich wollte nun jeweils das erste GB des Kernels mappen, um beim Taskswitch keine Probleme mit der Adresse des kernel-space stacks der Tasks zu bekommen. Dies geschieht, in dem ich einfach die ersten x(0...0x0FF) Einträge des Kernel-Pagedirectorys für jeden Task übernehme.

Dann sollten die ersten Einträge ab der Adresse 0x40000000 (1GB) auf die physikalishe Adresse des Task-Codes Zeigen, und z.B. 0xC0000000 auf die Stelle des usermode Stacks).
Beim Task-Switch sollen dann die register DS/CS im usermode auf ein Segment gesetzt werden, welches bei 0x40000000 beginnt, sodass der Task "denkt", er läuft bei 0x00000000.
Mein Problem war nun, bei aktivem Paging jeweils die Directorys+Tables für die Tasks auszufüllen. Das will ich nun wie oben genannt lösen.

Mit dem Longmode beschäftige ich mich dann, wenn ich das geschafft habe.  :D

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #3 am: 18. July 2006, 12:15 »
Zitat
Mit dem Longmode beschäftige ich mich dann, wenn ich das geschafft habe.
Jo, und dann musste wieder alles ändern. ^^

bitmaster
In the Future everyone will need OS-64!!!

 

Einloggen