Hi
Wenn ich in nachträglich reservierten Speicher schreibe, gibts nen pagefault.
Zu beginn (befor paging aktiviert wird) lege ich 3 4MB-Pages an, und der rest wird mit pagetables gefüllt. Nachdem ich dann paging aktiviert habe, kann ich an den entsprechenden stellen dann auch schreiben.
Wenn ich jetzt eine neue page reservieren möchte wird, eine freie gesucht, und alle PTs durchgegangen, bis ein freier Platz für diese page gefunden wurde.
Soweit zur theorie.
Nun zum genauen ablauf:
0x00000000 bis 0x00C00000 sind durch die 3 4MB-Pages reserviert (die adressen sind physikalisch als auch virtuell die selben)
Nun möchte ich eine neue 4KB-Page reservieren. Als freie Page bekomme ich 0x00C00000 - also die 1. Page nach dem 12MB-Block. Das ist soweit richtig. Nachdem ich die Page nun ihre position in der Pagetable gefunden hat, bekomme ich folgende virtuelle adresse: 0x00C00000 - Auch richtig. 4. Pagetable, 1. Eintrag.
Flags für die Pagetable und Page: (PG_PRESENT | PG_WRITEABLE | PG_USERACCRESS) - Flags müssen stimmen, da ich die auch bei den 4MB-Pages verwende.
Zusammengefasst:
Physikalische adresse passt.
Virtuelle adresse passt.
* Warum gibt es jetzt einen Pagefault?
* Ich habe der Pagetable die selben flags gegeben, wie einer presenten page. Das ist doch richtig oder?