ok ich weiß noch nicht genau ob ich das verstanden habe.. ich denke aber schon.. könntest du mir dazu nur ein kleines Beispiel geben?
Wäre sehr nett..
Wäre sehr nett..
09. November 2026, 18:31
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...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.
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).
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.
#define CURENT_PD 1023 * 1024 + 1023 * PAGE_SIZE // 0xFFFFF000
// 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
}
// 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
}
#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
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