Autor Thema: vmm_alloc Problem  (Gelesen 2626 mal)

iksnagreb

  • Beiträge: 28
    • Profil anzeigen
Gespeichert
« am: 28. January 2013, 14:28 »
Hallo,

Ich bin bei meinem OS jetzt so weit, das Paging funktionieren sollte (es stürzt jedenfalls nicht mehr ab :-D).

Mein Problem ist jetzt die vmm_alloc Funktion, wenn ich nach einer freien Adresse suche bekomme ich immer die gleiche zurück.
Wenn ich also zweimal hintereinander vmm_alloc aufrufe, wird z.B. immer 0x02060000 als Adresse zurückgegeben.
Ich hab schon in meinem Code gesucht, aber ich kann den Fehler einfach nicht finden.(Vielleicht ist ja auch mein ganzer Code ein Fehler :lol:)

Hier der Code: http://pastebin.com/j4vCjU0T . Vielleicht kann ja jemand das Problem finden.

tiger717

  • Beiträge: 84
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 28. January 2013, 15:24 »
Zum Codingstil ein paar Vorschläge meinerseits:
int i;
for(i = 0; i < 1024; i++)
{
context->page_directory[i] = 0;
}

// ersetzen durch

memset(context->page_directory, 0, (size_t)1024);

// solltest du memset und Konsorten noch nicht wirklich implentiert haben, empfehle ich die osdevlibc (bietet genau solche Standardfunktionalität, aber ohne erweiterte OS-spezifische Dinge wie Dateien etc. - du kannst sie einfach mitlinken, bis du eine "richtige" libc wie newlib oder glibc hast.

return 0x0;

// ersetzen durch

return NULL;

Zudem kann man if (i == 1) durch if (i) sowie if (i == 0) durch if (!i) ersetzen.

Zum eigentlichen Problem: Noch mehr Output und einzelne Funktionen isoliert betrachten.
Außerdem:
  • Fast dein ganzer Kernel wird mit PTE_USERSPACE gemappt.
  • Du vergisst invlpg bei vmm_activate_context.
  • Deine vmm_check_if_free()-Funktion ist unnötig und falsch: dafür reicht addr & PTE_PRESENT

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 28. January 2013, 16:32 »
Zum Codingstil ein paar Vorschläge meinerseits:
int i;
for(i = 0; i < 1024; i++)
{
context->page_directory[i] = 0;
}

// ersetzen durch

memset(context->page_directory, 0, (size_t)1024);
Von dieser Art Optimierung rate ich genau dann ab, wenn sie nicht korrekt ist. Es muss hier 1024 sein nicht 4096. Wie lange hättest du gebraucht, um diesen Bug zu finden?

aline_addr_4k (btw fehlt ein g im Namen) rundet auch bereits ausgerichtete Adressen nochmal auf. Also wenn man da 0 eingibt, kommt das 0x1000 raus. Das ist normalerweise nicht das, was man will. Ersetze das (addr + 0x1000) durch (addr + 0xFFF), dann sollte es klappen.

vmm_get_phys_addr sollte das Present-Flag der Page Directory und Page Table einträge prüfen, bevor sie verwendet werden. vmm_check_if_used/vmm_check_if_free ebenfalls, und da wie von tiger717 vorgeschlagen das Ergebnis dieser Prüfungen zurückgeben.

In vmm_map_page scheint der Rückgabewert von pmm_alloc nicht gemappt zu sein. Da musst du dir was einfallen lassen, damit das nicht in Rekursion ausartet. Zum Beispiel kannst du nicht einfach vmm_alloc oder vmm_map_range aufrufen, außer du kannst garantieren, dass sie nicht in das selbe Problem laufen.

phys_bitmap ist als extern char *phys_bitmap; deklariert. Ist es auch als char *phys_bitmap in der physisischen Speicherverwaltung definiert? Wenn es dort als char phys_bitmap[...] (oder uint32_t  phys_bitmap[...]) deklariert ist, dann sollte das auch in der extern-Deklaration so sein.
Dieser Text wird unter jedem Beitrag angezeigt.

tiger717

  • Beiträge: 84
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 28. January 2013, 20:13 »
Zum Codingstil ein paar Vorschläge meinerseits:
int i;
for(i = 0; i < 1024; i++)
{
context->page_directory[i] = 0;
}

// ersetzen durch

memset(context->page_directory, 0, (size_t)1024);
Von dieser Art Optimierung rate ich genau dann ab, wenn sie nicht korrekt ist. Es muss hier 1024 sein nicht 4096. Wie lange hättest du gebraucht, um diesen Bug zu finden?
Wohl eher 4096 statt 1024. :evil: Jup, voraussgesetzt context->page_directory ist auch wirklick ein DWORD.

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 28. January 2013, 20:24 »
Wie ein PD aussieht, wissen wir hier eigentlich alle und hängt nicht davon ab, ob er das bisher schon richtig umgesetzt hat oder nicht. ;)
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

 

Einloggen