Lowlevel
Lowlevel => tyndur => Thema gestartet von: Tectu am 12. November 2013, 22:48
-
Nabend,
Ich unternehme zur Zeit den Versuch, paging in meinen Kernel zu implementieren. Hierzu habe ich neben den Wiki-Artikeln auch etwas im tyndur Code rumgeschnüffelt. Hier ist mir folgendes aufgefallen:
file: /src/kernel2/src/arch/i386/mm/mm_context.c
mmc_context_t mmc_create_empty()
{
// Das Page Directory initialisieren
paddr_t phys_page_directory = pmm_alloc(1);
mmc_context_t context;
context.version = 0xFFFFFFFF;
context.lock = LOCK_UNLOCKED;
context.page_directory = phys_page_directory;
context.page_directory_virt = vmm_kernel_automap(
context.page_directory, PAGE_SIZE);
memset(context.page_directory_virt, 0, PAGE_SIZE);
return context;
}
Wieso wird context.page_directory_virt erst auf den Rückgabewert von vmm_kernel_automap() gesetzt, wenn es anschliessend per memset() auf null initialisiert wird?
Ich verstehe zur Zeit sowieso noch nicht ganz, wieso die virtuelle Adresse des page directories von interesse ist?
~ Tectu
-
Wieso wird context.page_directory_virt erst auf den Rückgabewert von vmm_kernel_automap() gesetzt, wenn es anschliessend per memset() auf null initialisiert wird?
Die Variable context.page_directory_virt wird auf die Adresse der Page gesetzt. Das memset überschreibt aber nicht wieder die Variable, sondern die Page selbst.
Ich verstehe zur Zeit sowieso noch nicht ganz, wieso die virtuelle Adresse des page directories von interesse ist?
Damit man darin lesen und schreiben kann. Nur auf gemappte physische Seiten kann zugegriffen werden. Gemappt heißt, dass es eine virtuelle Adresse gibt, und diese dem Kernel bekannt sein sollte.
-
Die Variable context.page_directory_virt wird auf die Adresse der Page gesetzt. Das memset überschreibt aber nicht wieder die Variable, sondern die Page selbst.
Woops... Ich schiebe diese Misinterpretation jetzt einfach mal auf den Schlafmangel ;-)
Damit man darin lesen und schreiben kann. Nur auf gemappte physische Seiten kann zugegriffen werden. Gemappt heißt, dass es eine virtuelle Adresse gibt, und diese dem Kernel bekannt sein sollte.
Sofern mein Kernel wie im Tutorial vorgeschlagen 1:1 gemappt ist, benötige ich diese zusätzliche Adressinformation also nicht, richtig?
~ Tectu
-
Das Tutorial mappt nur am Anfang den Kernelcode 1:1. Wenn du PDs später beim Erstellen eines Tasks allozierst, dann wirst du die wahrscheinlich nicht mehr 1:1 mappen.
Solange du das nicht tust, und physische und virtuelle Adresse gleich sind, kannst du natürlich theoretisch auch mit einer Variablen dafür auskommen.
-
Okay, das verstehe ich jetzt. Danke!
~ Tectu