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 - s137

Seiten: [1] 2 3 ... 6
1
Lowlevel-Coding / Paging Probleme
« am: 30. June 2015, 23:22 »
Hallo zusammen,

jetzt war ich lange nicht mehr hier und hab mein Betriebssystemprojekt ein bisschen schleifen lassen.

Ich bin damals an Teil 9 des Tutorials gescheitert, dem Paging. An sich eine einfache Sache, wenn da nicht die ganzen Verständnisprobleme wären.
Mein Problem ist hauptsächlich dass ich nicht mehr durchblicke ab dem Zeitpunkt wo nur noch virtuelle Adressen verwendet werden können, wo also Paging eingeschaltet ist.

Ab da muss ich ja immer wenn ich einen Kontext erstelle und diesen dann ansprechen will um zum Beispiel etwas darin zu mappen, seine virtuelle Adresse haben. Die existiert ja aber noch nicht wenn ich ihn grade erstellt habe, also muss ich den Kontext irgendwie temporär mappen. Und da komme ich nichtmehr weiter. Zu viele verschiedene Kontexte und Pagedirectorys. Was ich jetz bräuchte wäre ein kleines Beispiel wie ich das in Code umsetze, also dass ich einen Kontext temporär in den aktuellen mappe und darauf zugreife.

Ich wäre sehr sehr dankbar wenn mir das jemand zeigen könnte, an dem Problem häng ich nämlich jetzt schon viel zu lange, und vermutlich ist es ganz einfach und ich seh den Wald vor lauter Bäumen nicht.

Viele Grüße und schonmal Danke im Vorraus
s137
2
Lowlevel-Coding / Re: Verständnisfrage zu Paging
« am: 17. December 2014, 14:17 »
oh ok, dann ist das ja gar nicht so schlimm, wie ich mir das vorgestellt habe. Naja dann setz ich mich mal dran :DD
3
Lowlevel-Coding / Re: Verständnisfrage zu Paging
« am: 16. December 2014, 22:58 »
ja nein das ist mir schon klar, dass das eine Sache auf Jahre ist, aber es geht mir ja auch nicht um den Aufwand, das mit dem Paging sind immernoch eigentlich Verständnisprobleme, die ich einfach bisher nicht hatte, aber ich versuche mir da gerade irgendwie einen Überblick zu verschaffen, des schwierige für mich ist, das Mappen nachdem Paging eingeschaltet ist und quasi alles nur noch über virtuelle Adressen abläuft und ich mich mit Kontexten rumschlagen muss, und evtl etwas mappen muss das nicht im aktuellen Kontext ist... und ich kann ja nicht in der "vmm_map_page" funktion selber etwas temporär mappen, das ergäbe dann ja eine Rekursion. hmm naja hier hab ich noch gewisse Verständnisprobleme, aber ich bin zuversichtlich dass man die irgendwie aus der Welt schaffen kann.
4
Lowlevel-Coding / Re: Verständnisfrage zu Paging
« am: 16. December 2014, 21:24 »
ok, schion klar ^^ ich meinte jetzt eigentlich nur das Paging, mit dem Rest bin ich eigentlich ziemlich gut klargekommen, bis auf kleine Leichtsinnsfehler, aber das Paging macht mich irgendwie fertig.. aber naja mal schaun wie ich das hinkriege :DD
5
Lowlevel-Coding / Re: Verständnisfrage zu Paging
« am: 16. December 2014, 18:18 »
Also gut, ich bin jetzt grad am überlegen, ob es nicht einfacher wäre, Mappings immer nur für den aktuellen Kontext durchzuführen, weil ich ansonsten irgendwie gar nicht klarkomme. Ich weiß nichtmal ob ich mir bei meiner vmm_map_page die virtuelle oder die physische Adresse des Kontextes übergeben lassen soll... Ich brauche die Physische um in den Kontext zu wechseln, aber die virtuelle um darauf zuzugreifen, dazu muss der Kontext aber im aktuellen Kontext gemappt sein. Das ist mir glaub ich einfach alles zu kompliziert. Gibts da keinen  einfacheren weg, für all das?
6
Lowlevel-Coding / Re: Verständnisfrage zu Paging
« am: 14. December 2014, 14:52 »
oh mann.. und ich hab den Fehler immer in der vmm.c gesucht und nicht den kleinsten Blick in die Headerdatei geworfen weil ich dachte des hätte ich schon überprüft... Danke..
7
Lowlevel-Coding / Re: Verständnisfrage zu Paging
« am: 14. December 2014, 13:26 »
Also ich habe das jetzt mal versucht zu kompilieren, und es tritt auch nach mehrmaligen Korrekturversuchen, diese Reihe von Fehlern auf, die ich versucht habe teilweise zu analysieren.

Wenn ich diese Zeile Beispielsweise kompilieren möchte (Zeile 171):

vmm_map_page( (void*) ((uintptr_t) CURRENT_CONTEXT) , NEW_CONTEXT , (uintptr_t) context, PTE_PRESENT | PTE_WRITE );
wobei CURRENT_CONTEXT so definiert ist: #define CURRENT_CONTEXT    (uintptr_t) ((1023 * 1024) + 1022)* PAGE_SIZE) // 0xFFFFE000 und NEW_CONTEXT so: #define NEW_CONTEXT    (uintptr_t) ((1023 * 1024) + 1021)* PAGE_SIZE) // 0xFFFFD000 und context so:  struct vmm_context* context = pmm_alloc();
erhalte ich folgenen Fehler:


vmm.c: In Funktion »vmm_create_context«:
vmm.c:171:5: Fehler: Zu wenige Argumente für Funktion »vmm_map_page«
vmm.c:50:5: Anmerkung: hier deklariert
vmm.c:171:57: Warnung: linker Operand des Komma-Ausdrucks hat keinen Effekt [-Wunused-value]
vmm.c:171:5: Warnung: Anweisung ohne Effekt [-Wunused-value]
vmm.c:171:59: Fehler: expected »;« before »)« token
vmm.c:171:59: Fehler: expected statement before »)« token
vmm.c:171:71: Fehler: expected expression before »,« token
vmm.c:171:71: Warnung: linker Operand des Komma-Ausdrucks hat keinen Effekt [-Wunused-value]
vmm.c:171:92: Warnung: linker Operand des Komma-Ausdrucks hat keinen Effekt [-Wunused-value]
vmm.c:171:71: Warnung: Anweisung ohne Effekt [-Wunused-value]
vmm.c:171:118: Fehler: expected statement before »)« token


Da ich mehrere solcher Zeilen habe, bekomme ich die Fehlerkette mehrmals.

Hier ist die Deklaration der Funktuion in Zeile 50:

int vmm_map_page(struct vmm_context* context, uintptr_t virt, uintptr_t phys, int flags) {

Also das mit den zuwenig Argumenten resultiert daraus, dass der Compiler innherhalb des Funktionsaufruf eine Parameterübergabe, als Kommaausdruck interpretiert, wenn ich das richtig verstehe, ich weiß nur nicht warum...
8
Lowlevel-Coding / Re: Verständnisfrage zu Paging
« am: 12. December 2014, 20:20 »
Ah ok danke dann werd ich das später mal ausprobieren^^ Ja ich weiß^^ Das liegt aber nur dran dass ichs grad eilig habe^^
9
Lowlevel-Coding / Re: Verständnisfrage zu Paging
« am: 12. December 2014, 20:01 »
Edit: kann es sein das bei der Berechnung selbst schon der Overflow auftritt und ich, wenn ich einfach die Methode der berechnung ändere das umgehen kann?
10
Lowlevel-Coding / Re: Verständnisfrage zu Paging
« am: 12. December 2014, 20:00 »
Naja aber es geht ja auch nicht um die Zahl 4GB, alle meine Zahlen liegen ja unter dem Limit 2^32-1... das heißt es müsste doch funktionieren wenn meine Konstanten statt int, unsigned int sein könnten... oder?
11
Lowlevel-Coding / Re: Verständnisfrage zu Paging
« am: 12. December 2014, 19:32 »
Hmm ok...aber das ist doch eine Speicheradresse unter 4GB sprich die sollte nicht großer als 32bit sein oder verstehe ich da was falsch..?

Danke :DD
12
Lowlevel-Coding / Re: Verständnisfrage zu Paging
« am: 12. December 2014, 19:11 »
Edit: jetzt bekomme ich einen: "Warnung: Ganzzahlüberlauf in Ausdruck [-Woverflow]" was auch immer das ist... vermutllich ist die Konstante zu groß? Also eigentlich gedacht für unsigned int aber zu groß für int... Müssen Konstanten zwingend int sein? Gibt es vielleicht noch eine andere Möglichkeit für mich das zu lösen?
13
Lowlevel-Coding / Re: Verständnisfrage zu Paging
« am: 12. December 2014, 19:07 »
Gute Frage, die Formeln sind natürlich falsch, ich hab nur ein Zahlenbeispiel verwendet um sie zu testen, vermutlich hatte ich da Glück ^^ oder ich hab mich da schon verrechnet...

Naja so müsste es gehen, ich teste das mal:

define CURRENT_PD         (1024 * 1024 * PAGE_SIZE) - (1 * PAGE_SIZE) // 0xFFFFF000
#define CURRENT_PT_BASE    0xFFC00000
#define CURRENT_CONTEXT    (1024 * 1024 * PAGE_SIZE) - (2 * PAGE_SIZE) // 0xFFFFE000
#define NEW_CONTEXT        (1024 * 1024 * PAGE_SIZE) - (3 * PAGE_SIZE) // 0xFFFFD000
#define TEMP_PAGEDIR       (1024 * 1024 * PAGE_SIZE  - (4 * PAGE_SIZE) // 0xFFFFC000


Zwar nicht die beste implementierung und nicht sehr dynamisch aber richtig sollte es zumindest sein :DD
14
Lowlevel-Coding / Re: Verständnisfrage zu Paging
« am: 12. December 2014, 18:25 »
Ich habe das jetzt mal folgendermaßen umgesetzt, ja ich weiß vermutlich extrem unübersichtlich und uneffizient... Aber im Momemnt geht es mir nur um die Funktionalität, die aber leider immernoch nicht gegeben ist.

Woran könnte das liegen... Ich habe schon so ziemlich alles als Fehlerquelle ausgeschlossen.

Mein Log des Pagefaults bei dem er abbricht sieht so aus und im Code ist die Stelle des Abbruchs gekennzeichnet:

Exception: 14 ( Page Fault)
Error Code: 2

ebp: 127164
eip: 10102c (im Code markiert)
cs: 8
eflags: 210006
esp: 4fdc00
ss: 4fcc00

// Kontext erstellen
struct vmm_context* vmm_create_context(void)
{

    struct vmm_context* context = pmm_alloc();
    int i;

    vmm_map_page((void*)((uintptr_t)CURRENT_CONTEXT), NEW_CONTEXT, (uintptr_t) context, PTE_PRESENT | PTE_WRITE);

    struct vmm_context* context_temp = (void*)((uintptr_t)NEW_CONTEXT);

    //Pagedir in gemapptem Kontext initialisieren
    context_temp->pagedir_phys = pmm_alloc();

// Irgendwo hier dazwischen bei einer Assemblerinstruktion gibt es den Page Fault

    // Pagedir in aktuellen Kontext temporaer mappen
    vmm_map_page((void*)((uintptr_t)CURRENT_CONTEXT), TEMP_PAGEDIR, (uintptr_t) context_temp->pagedir_phys, PTE_PRESENT | PTE_WRITE);

    context_temp->pagedir = (void*)((uintptr_t)TEMP_PAGEDIR);

    for (i = 0; i < 1024; i++) {
        context_temp->pagedir[i] = 0;
    }

    // Dauerhaftes Mapping
    // Physische Adresse des Kontextes speichern an bestimmter speicheradresse in sich selbst
    vmm_map_page((void*)((uintptr_t)NEW_CONTEXT), CURRENT_CONTEXT, (uintptr_t) context, PTE_PRESENT |$

    // Physische Adresse des PD's speichern an bestimmter Speicheradresse in sich selbst
    vmm_map_page((void*)((uintptr_t)NEW_CONTEXT), CURRENT_PD, (uintptr_t) context->pagedir_phys, PTE_PRESENT | PTE_WRITE);

    // Temporaere Mappings aufheben
    vmm_unmap_page((void*)((uintptr_t)CURRENT_CONTEXT), TEMP_PAGEDIR);

    return context; // Physische Adresse des Kontextes zurueckgeben

}

Noch eine Erklärung zu den Konstanten:
CURRENT_PD bezeichnet die Speicheradresse des aktuellen PD's wenn es in sich selbst gemappt ist
CURRENT_PT_BASE ist die Basis zur Berechnung der Adressen der PT's (noch nicht benutzt)
CURRENT_CONTEXT ist der aktuelle Kontext in sich sebst gemappt
NEW_CONTEXT wird in "create_context" erstellt und wir dafür benutzt den neu erstellten Kontext im aktuellen zu mappen
TEMP_PAGEDIR ist die Adresse eines temporären Mappings des PD's

#define CURRENT_PD         1023 * 1024 + 1023 * PAGE_SIZE // 0xFFFFF000
#define CURRENT_PT_BASE    0xFFC00000
#define CURRENT_CONTEXT    1023 * 1024 + 1022 * PAGE_SIZE // 0xFFFFE000
#define NEW_CONTEXT        1023 * 1024 + 1021 * PAGE_SIZE // 0xFFFFD000
#define TEMP_PAGEDIR       1023 * 1024 + 1020 * PAGE_SIZE // 0xFFFFC000

15
Lowlevel-Coding / Re: Verständnisfrage zu Paging
« am: 12. December 2014, 11:11 »
Naja stimmt eigentlich, aber ich werde das jetzt erst einmal so ausprobieren, um zu sehen obs so überhaupt funktionieren würde.

Meine vmm_alloc nimmt als Parameter, einen Speicherkontext, die Anzahl der Pages, die zu allokieren sind und die Flags. Aus den Flags lese ich dann ob ich Speicher im Usermemory (U/S Bit gesetzt) oder Speicher im Kernelmemory (U/S Bit nicht gesetzt) reservieren muss. Am Ende gebe ich dann die virtuelle Adresse des allokierten Speicher zurück.

Außerdem verwende ich eine noch eine extra Funktion, die am Anfang den kernel_context erstellt und mit physischen Adressen arbeitet. 
16
Lowlevel-Coding / Re: Verständnisfrage zu Paging
« am: 12. December 2014, 07:51 »
Ich habe diese zwei Dinge jetzt einfach mal ganz dreist kombiniert. Ist zwar noch etwas unsauber aber ich denke es könnte so funktionieren...

Ich habe jetzt quasi eine Funktion um eine Page zu mappen (und ja ich lasse Doppelmappings zu wenn ich es explizit so will also auf eine gewisse Adresse, ja ich weiß etwas unsauer aber für den Anfang gehts)

Eine Funktion zum Erstellen eines Kontextes, die den zu erstellenden Kontext und das zu erstellende PD temporär in den aktuellen Kontext mappt, das PD mit nullen befüllt und dann die physische Adresse zurückgibt, sowie diese an einer bestimmten virtuellen Adresse speichert.

Eine Funktion zum Aktivieren des Aktuellen Kontexts und mappen des aktuellen PD's.

Eine vmm_alloc, die mithilfe einer anderen Funktion aufeinanderfolgende Pages im Kernel oder Usermemory findet, diese mappt und die Speicheradresse zurückgibt.

Könnte das so funtionieren eventuell?
17
Lowlevel-Coding / Re: Verständnisfrage zu Paging
« am: 12. December 2014, 00:30 »
Ich habe es jetzt so gelöst, dass beim aktivieren eines Speicherkontextes, das PD des Kontextes, auch gleich gemappt wird. Allerdings habe ich immernoch ein Problem auf den Speicherkontext selbst zuzugreifen (beim Erstellen) ich kann zwar auf das PD des aktuellen Tasks zugreifen allerdings habe ich nirgends die virtuelle Adresse des Speicherkontextes selbst..

// Kontext erstellen
struct vmm_context* vmm_create_context(void)
{
    struct vmm_context* context = pmm_alloc(); // Dynamisch initialisiert
    int i;

    context->pagedir_phys = pmm_alloc(); // Hier ist der Zugriff über die physische Adresse des Kontextes, der den Pagefault auslöst...

    for (i = 0; i < 1024; i++) {
        context->pagedir_phys[i] = 0; // Hier nochmals...
    }

    return context; // Physische Adresse des Kontextes wird zurückgegeben
}

 

18
Lowlevel-Coding / Re: Verständnisfrage zu Paging
« am: 12. December 2014, 00:07 »
Ok, ich hab grade rausgefunden, dass der Ansatz den ich ursprünlich hatte, gar nicht so falsch war wie er für mich ausgesehen hat... Mein Ansatz

#define CURENT_PD     1023 * 1024 + 1023 * PAGE_SIZE // 0xFFFFF000

ergibt bei einer PAGE_SIZE von 4096 nämlich genau die Adresse die du in dem Beispiel genannt hast, aber ich dachte irgendwie dass ich da was anderes gemacht habe, als das was du beschrieben hast. Ich dachte dass dann der letzte PT auf mein PD zeigt, was ja eigentlich aber nichts anderes ist, als der letzte Eintrag des PD's... sollte man eigentlich durch ein bisschen nachdenken draufkommen.

Jetz muss ich nur noch rausfinden wie ich das mit den ganzen (temporären) Mappings hinkriege. Danke schonmal :DD
19
Lowlevel-Coding / Re: Verständnisfrage zu Paging
« am: 11. December 2014, 23:57 »
Ein Beispiel:
Du lässt den letzten Eintrag im PD auf die PD selber zeigen (d.h. es steht dort im Prinzip das selbe wie im CR3).
Dann kannst du über folgende Addresse deine PD bearbeiten: 0xFFFFF000.
Die einzelnen PTs kannst du über folgende Addresse bearbeiten: 0xFFC00000 + (Index des PT << 12).

Achso ok, jetzt denke ich wird mir das ein bisschen klarer. Aber wenn ich das so richtig verstanden habe, geht das nur wenn der Kontext, also das Pagedirectory aktuell geladen ist oder?

Ja, wenn du Mappings für ein anderes als das aktive PD ändern willst, musst du in der Regel ein temporäres Mapping für die entsprechenden Page Tables machen.

Da liegt aber genau mein Problem.. wie setzte ich so ein temporäres Mapping genau auf? Theoretisch ist es mir klar, aber praktisch hab ich da irgendwie noch so meine Probleme..
20
Lowlevel-Coding / Re: Verständnisfrage zu Paging
« am: 11. December 2014, 22:36 »
Was aber vor allem für mich noch ein Problem darstellt, ist, wenn ich in der Funktion zum Kontext erstellen, den Kontext dynamisch initialisiere, habe ich ja nur eine physische Adresse und kann über die nicht auf den Kontext zugreifen, um darauf zugreifen zu können, müsste ich ihne zuerts in einen anderen Kontext mappen, was irgendwie dann aber auch keinen Sinn machen würde...
Seiten: [1] 2 3 ... 6

Einloggen