Autor Thema: Frage zu VMM  (Gelesen 12301 mal)

Tectu

  • Beiträge: 4
    • Profil anzeigen
Gespeichert
« 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

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 12. November 2013, 22:51 »
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.
Dieser Text wird unter jedem Beitrag angezeigt.

Tectu

  • Beiträge: 4
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 13. November 2013, 12:55 »
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

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 13. November 2013, 13:25 »
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.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

Tectu

  • Beiträge: 4
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 13. November 2013, 15:23 »
Okay, das verstehe ich jetzt. Danke!


~ Tectu

 

Einloggen