Bei mir will das einfach nicht so richtig klappen, ich habe jetzt die Funktion zum Aktivieren des Pagings so weit gekürzt wie möglich, aber geht immer noch nicht:
BOOL StrippedDown_VmmInitialize() { PLONG PageDir = MmAllocPage(&PoolExt); PLONG PageTbl = MmAllocPage(&PoolExt); PageDir[0] = (LONG)PageTbl | 3; LONG i; for (i = 1; i < 1024; i++) PageDir[i] = 0 | 2; LONG Address = 0; for (i = 0; i < 1024; i++) { PageTbl[i] = Address | 3; Address += 4096; } WriteCR3(PageDir); WriteCR0(ReadCR0() | 0x80000000); for(;;); return TRUE; }
PLONG ist ein long* und LONG ein long, MmAllocPage() alloziiert ein 4KB grosses Speicherstück in einem Speicherpool, PoolExt ist ein Pool mit dem Speicher nach dem Kernel bis ans Ende. Die WriteCR* und ReadCR* sind in einem externen Assemblerfile und der Kernel wird an 0x100000 geladen ...
Der Code wirft einfach immer einen GPF