Autor Thema: Verständnisfrage zu Paging  (Gelesen 27907 mal)

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #40 am: 12. December 2014, 20:04 »
Ja, in der Berechnung tritt der Overflow auf. Die bereits genannten Alternativen vermeiden das.

Übrigens du verfehlst regelmäßig den Edit-Knopf ;)
Dieser Text wird unter jedem Beitrag angezeigt.

s137

  • Beiträge: 110
    • Profil anzeigen
Gespeichert
« Antwort #41 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^^

s137

  • Beiträge: 110
    • Profil anzeigen
Gespeichert
« Antwort #42 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...
« Letzte Änderung: 14. December 2014, 13:35 von s137 »

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #43 am: 14. December 2014, 14:04 »
In CURRENT_CONTEXT und NEW_CONTEXT hast du jeweils eine ) mehr als du ( hast.
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

s137

  • Beiträge: 110
    • Profil anzeigen
Gespeichert
« Antwort #44 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..

s137

  • Beiträge: 110
    • Profil anzeigen
Gespeichert
« Antwort #45 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?

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #46 am: 16. December 2014, 20:41 »
Doch, ein fertiges OS benutzen statt selber eins schreiben.

Wenn du sowohl physische als auch virtuelle Adresse brauchst, spricht meines Erachtens einiges dafür, einfach beides zu übergeben (oder eine struct, die beides enthält).
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

s137

  • Beiträge: 110
    • Profil anzeigen
Gespeichert
« Antwort #47 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

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #48 am: 16. December 2014, 21:48 »
Irgendwann muss wohl jeder erkennen, dass ein einzelnes verregnetes Wochenende nicht ausreicht, um ein OS zu schreiben. ;)
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

s137

  • Beiträge: 110
    • Profil anzeigen
Gespeichert
« Antwort #49 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.
« Letzte Änderung: 16. December 2014, 23:00 von s137 »

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #50 am: 17. December 2014, 09:43 »
Rekursionen sind nichts böses, solange man sicherstellt, dass sie irgendwann aufhören.

Wenn vmm_map_page() also für aktive PDs direkt das richtige macht und damit die Rekursion abbricht, dann kann ein vmm_map_page() für inaktive PDs ohne weiteres ein temporäres Mapping im aktiven PD anlegen. Deine Rekursionstiefe ist dann maximal zwei, und das ist doch noch recht überschaubar. ;)
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

s137

  • Beiträge: 110
    • Profil anzeigen
Gespeichert
« Antwort #51 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

 

Einloggen