Beiträge anzeigen

Diese Sektion erlaubt es dir alle Beiträge dieses Mitglieds zu sehen. Beachte, dass du nur solche Beiträge sehen kannst, zu denen du auch Zugriffsrechte hast.


Nachrichten - faulancer

Seiten: [1]
1
Lowlevel-Coding / jmp-Befehl???
« am: 19. July 2006, 11:53 »
oha, da habe ich wirklich lange einem Irrglauben unterlegen. Gut das du mich berichtigt hast, hat mir auf jedenfall geholfen, als sich mein Taskhandler geweigert hat in ein DPL3-Segment zu springen =)
2
Lowlevel-Coding / woher 1:1 gemappten speicher
« 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
3
Lowlevel-Coding / woher 1:1 gemappten speicher
« 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.
4
Lowlevel-Coding / jmp-Befehl???
« am: 18. July 2006, 03:11 »
Hi,

das Segment wird nicht als Nummer angegeben, sondern als Speicherstelle in der GDT.
Für jeden Descriptor werden 8 byte benötigt, also errechnet sich das Segment wie folgt:

Segment = EintragnummerImGDT * 8
Seiten: [1]

Einloggen