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