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.