Autor Thema: Paging  (Gelesen 6852 mal)

sebi2020

  • Beiträge: 130
    • Profil anzeigen
    • Infortus OS
Gespeichert
« am: 13. October 2011, 11:23 »
Sorry, hab ausversehen das Thema gelöscht (das kommt davon wenn ich unbedingt mit Lynx surfen muss :P)
Jetzt versteh ich auch was du meinst. Ja, die funktion war jetzt erstmal auch nur bis vorm Paging ausgelegt. Weil ich da irgendwie ein Problem sehe.
Ich brauche physischen Speicher für ne neue PageTable, kann sie aber nur über eine virtuelle Ansprechen. Ja, aber ich habe doch gar kein Mapping für die physikalische Adresse der PageTable, also wie soll ich sie ansprechen?
Please press any-key...
Verflucht wo ist any-key? hier? ach Mist, das war Escape...

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 13. October 2011, 12:41 »
Danke, ich hab erstmal die Berechtigungen gefixt - Threads löschen sollte man nämlich eigentlich nicht können... ;)

Du musst sie eben von Anfang an gemappt haben. Indem du das PD in sich selbst mappst (also gleichzeitig als PT benutzt), hast du immer alle Page Tables gemappt und kannst damit auch alles andere mappen, wie es dir gerade passt.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

sebi2020

  • Beiträge: 130
    • Profil anzeigen
    • Infortus OS
Gespeichert
« Antwort #2 am: 13. October 2011, 13:07 »
Ja, aber damit sind doch dann nur bestehende Pages gemappt. Irgendwie ist es jeztt außerhalb von meinem Vorstellungsvermögen gerade, wie ich dann die anderen Mappe. Kp. Sagen wir ich hab 2 PageTables die bereits im Directory drin sind. Wie füge ich dann eine neue ein?! Ich verstehs grad nicht -.- Ich lege PageTables eigentlich bei bedarf an, heißt wenn ich für eine bestimmte Adresse eine brauche. Ihr habt doch nich 1024 PageTables von anfang an angelegt, oder?
Ich meine, ich denke ich benutze die Virtuelle-Adresse des PD
dann mach ich ein pmm_alloc() für eine PageTable, trage diese ins PD ein und kann dann über das "virtuelle PD" (nenn ich jetzt mal so) die PageTable bearbeiten?! Also ich meine die liegen also jetzt in den letzten 4 MB die PageTables. Die PageTables sind doch jetzt als Pages gemappt, oder?
das heißt pt_virt_addr[pageTableIndex] sucht mir nun sozusagen jetzt die eben allozierte PageTable und mit pt_virt_addr[pageTableIndex][pageIndex] müsste ich doch dann Pages eintragen können.

Ich werd aus dem Tutorial nicht sehr schlau. Es ist am ende sehr knapp gehalten. Man weis nicht was man mit seinem vorherigen Code machen soll.
Ich kann nicht einfach all pmm_alloc aufrufe durch vmm_alloc ersetzen, schließlich arbeite ich vorher mit physischen adressen und ich kann keine virtuellen Adressen benutzen solange Paging noch nicht aktiv ist. So müsste ich es mir explizit verkneifen mir speicher zu holen, solange noch kein Paging nicht aktiviert ist. Ich muss vor dem Paging schon Speicher für den Context holen, muss diesen aber erstmal physisch haben. So nun verflucht, alle Pointer für die KOntexte sind momentan alle physisch. Jetzt brauch ich aber eine virtuelle Adresse für sie... Was nun?!
« Letzte Änderung: 13. October 2011, 13:49 von sebi2020 »
Please press any-key...
Verflucht wo ist any-key? hier? ach Mist, das war Escape...

sebi2020

  • Beiträge: 130
    • Profil anzeigen
    • Infortus OS
Gespeichert
« Antwort #3 am: 13. October 2011, 15:40 »
Also nochmal um das zu verständlich zu machen.
Ich möchte eine Funktion, die bei JEDEM neuen Task kernel-Mappings erstellt. Das bedeutet, ich habe noch kein PD. Ich alloziere speicher, muss diesen aber sofort mappen, was aber noch nicht geht, weil ich kein PD im neuen Context habe, also was machen?!
Please press any-key...
Verflucht wo ist any-key? hier? ach Mist, das war Escape...

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 13. October 2011, 16:01 »
Der neue Kontext interessiert doch gar nicht, solange er nicht aktiv ist. Wenn du ein PD (oder eine PT) ändern willst, muss die im aktiven PD gemappt sein. Damit du im aktiven PD mappen kannst, was du willst, mappst du das PD beim Erstellen in sich selbst. Das allererste PD muss halt noch mit deaktiviertem Pagign erstellt werden.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

sebi2020

  • Beiträge: 130
    • Profil anzeigen
    • Infortus OS
Gespeichert
« Antwort #5 am: 13. October 2011, 17:56 »
Ja klar, aber danach muss ich ja auch für die nächsten Tasks ein PD erstellen. Wie mache ich das dann? Und zudem muss ich die Mappings dann auch noch für jeden Task gleich halten...
Ist diese Funktion jetzt so richtig?
int vmm_map_page(struct vmm_context*, void* pAdress, void* vAdress, uint16_t flags)
{
uint16_t pageNumber = (uint16_t) ((uint32_t) vAdress / 0x1000);
uint16_t pageDirNumber = pageNumber / 1024;
uint16_t pageTableNumber = pageNumber % 1024;
uint32_t* pageTableAdress;
// uint32_t* page;
if(use_phys_addr)
{
// Ist schon eine PageTable im Directory ?
if(vmm_context->pageDir[pageDirNumber] > 0) {
pageTableAdress = vmm_context->pageDir[pageDirNumber] & 0xFFFFF000;
} else { // Nein? Dann erstelle eine neue
pageTableAdress = pmm_alloc();
memset(pageTableAdress,0x1000);
vmm_context->pageDir[pageDirNumber] = create_page_table_entry(flags, pageTableAdress);
}
// Page in die PageTable eintragen
pageTableAdress[pageTableNumber] = create_page_table_entry(flags, pAdress);
} else { // Paging ist aktiviert
if(vmm_context->virtPageDir[pageDirNumber] > 0) {
pageTableAdress = vmm_context->virtPageDir[pageDirNumber] & 0xFFFFF000;
} else {
pageTableAdress = pmm_alloc(); // Speicher allozieren
vmm_context->virtPageDir[pageDirNumber] = create_page_table_entry(flags,pageTableAdress);
// 0xFFC0 0000 (Hier sind die PageTables als Pages gemappt)
pageTableAdress = (VIRT_PAGE_ADDR + (sizeof(uint32_t) * pageDirNumber));
memset(pageTableAdress,0x1000);
pageTableAdress[pageTableNumber] = create_page_table_entry(flags,pAdress);

}
}
// Transaction Locate Buffer invalidieren (löschen)
asm volatile("invlpg %0" : : "m" (*(char*) vAdress));
return 0;
}
« Letzte Änderung: 13. October 2011, 18:46 von sebi2020 »
Please press any-key...
Verflucht wo ist any-key? hier? ach Mist, das war Escape...

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 13. October 2011, 19:04 »
uint16_t ist immer noch falsch. Auch wenn du jetzt an einer anderen Stelle abschneidest und damit immerhin bis 64k * 4k = 256 MB kommen solltest.

Bei Paging an und existierender PT vergisst du das Mappen komplett und in pageTableAdress = (VIRT_PAGE_ADDR + (sizeof(uint32_t) * pageDirNumber)); solltest du statt 32 Bit eine jeweils eine ganze Page Table (also 4 KB) vorwärtsgehen, wenn ich den Code grad richtig verstehe.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

sebi2020

  • Beiträge: 130
    • Profil anzeigen
    • Infortus OS
Gespeichert
« Antwort #7 am: 13. October 2011, 19:23 »
Zitat
Bei Paging an und existierender PT vergisst du das Mappen komplett
...
vmm_context->virtPageDir[pageDirNumber] = create_page_table_entry(flags,pageTableAdress);
...
pageTableAdress[pageTableNumber] = create_page_table_entry(flags,pAdress);
Wo vergesse ich hier das Mapping?!!!!

Hast recht, sollte jeweils ne page table vor gehn, aber wo vergesse ich den hier das Mappen?!
Please press any-key...
Verflucht wo ist any-key? hier? ach Mist, das war Escape...

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 13. October 2011, 19:30 »
Den Code, den du zitierst, hast du beim Anlegen einer neuen PT. Wenn es die PT schon gibt, mappst du nicht.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

sebi2020

  • Beiträge: 130
    • Profil anzeigen
    • Infortus OS
Gespeichert
« Antwort #9 am: 13. October 2011, 20:15 »
Achso das meinst du. Stimmt... Aber eine Frage wäre immer noch offen...  was mache ich mit dem Context? der muss vor und nach dem Paging erreichbar sein... ein 1 zu 1 mapping?
Please press any-key...
Verflucht wo ist any-key? hier? ach Mist, das war Escape...

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 13. October 2011, 22:39 »
Wäre eine Möglichkeit. Oder halt den Pointer direkt beim Einschalten von Paging anpassen.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

 

Einloggen