Abend zusammen.
Ich bin zur Zeit beim Speichermanager. Der Physikalische funktioniert auch schon, allerdings habe ich jetzt schon seit Wochen Schwierigkeiten mit Paging. Ich habe dieses Tut http://www.jamesmolloy.co.uk/tutorial_html/6.-Paging.html gelesen, und versucht, auf diesen Anregungen einen Virtuellen Speichermanager zu schreiben. Allerdings endet es immer in einer Reboot Schleife, und zwar, direkt, nach dem, Paging aktiviert wurde. Es gibt keine Pagfault, nichts!
Ohne mir deinen Code angeschaut zu haben, widerspreche ich dir hier schonmal. Es gab ganz sicher einen Page Fault. Aber beim Versuch, den Page-Fault-Handler aufzurufen ist der Prozessor in den nächsten Page Fault gerannt (weil der Code nicht korrekt gemappt ist) und hat damit dann einen Double Fault ausgelöst. Gleiches Spielchen für den Double Fault, gibt einen Triple Fault, was einen CPU-Reset bedeutet.
Physikalischer Speichermanager:
Englisch "physical", aber deutsch "physisch", nicht "physikalisch"
u_long PMM_Malloc(const u_long Size, const int Align, u_long* Phys)
Hat nichts mit deinem Problem zu tun, aber dieses Interface ist komplizierter als es sein müsste: Nicht-alignten physischen Speicher braucht kein Mensch.
// A page
struct SPage
{
u_int32 Present : 1; // Is the page present in the memory?
u_int32 RW : 1; // Read- or Write-able
u_int32 User : 1; // User or supervisor previligs
u_int32 Accessed : 1; // Has the page been accessed since the last refresh?
u_int32 Dirty : 1; // Has the page been changed since the last refresh?
u_int32 Reserved : 7; // Reserved
u_int32 Frame : 20; // Frameaddr in the physical memory
};
Bist du dir sicher, dass der Compiler hier das richtige generiert? Die Reihenfolge in Bitfeldern ist im Standard undefiniert, deswegen bin ich da normal eher vorsichtig und nehme einfach einen uint32_t für das ganze zusammen.
asm ("mov %0, %%cr3":: "r"(&PageDirectory->PhysicalAddr));
Das ist ein & zu viel, glaube ich.
Ansonsten würde ich dir mal empfehlen, an der Stelle bevor du Paging einschaltest, eine Endlosschleife hinzusetzen und dir dann im qemu-Monitor mal genau anzuschauen, ob das alles Sinn ergibt. Also per
info registers anschauen, ob cr3 vernünftig aussieht, und dann z.B. mit
xp /20 0x123000 den Speicher anschauen und manuell eine virtuelle Adresse (von Kernelcode) aufzulösen. Dabei sieht man meistens, was noch falsch ist.