New dynamic paging implementation (3) #67
This commit is contained in:
parent
1073397b15
commit
ad5b70b08a
|
@ -185,7 +185,7 @@ void MmUnSetPage(void* virtualAddr, ulong flags);
|
||||||
//
|
//
|
||||||
// Map a page
|
// Map a page
|
||||||
//
|
//
|
||||||
void MmMapPage(void* virtualAddr, void* physicalAddr, ulong flags)
|
void MmMapPage(void* virtualAddr, void* physicalAddr, ulong flags);
|
||||||
void MmUnmapPage(void* virtualAddr);
|
void MmUnmapPage(void* virtualAddr);
|
||||||
|
|
||||||
// Page table entry
|
// Page table entry
|
||||||
|
|
|
@ -54,12 +54,12 @@ void MmInitPaging(void)
|
||||||
ulong phRamSize = memoryMap.freeRamSize + memoryMap.nonfreeRamSize;
|
ulong phRamSize = memoryMap.freeRamSize + memoryMap.nonfreeRamSize;
|
||||||
|
|
||||||
// Difference between the end of kernel and the begin of userspace
|
// Difference between the end of kernel and the begin of userspace
|
||||||
ulong diffKernUsr = (ulong)USERSPACE - lastKernelAddr;
|
ulong diffKernUsr = (ulong)USERSPACE - lastKernelAddr - KPAGESIZE;
|
||||||
|
|
||||||
// Maximum VIRTUAL address in memory
|
// Maximum VIRTUAL address in memory
|
||||||
MmVirtLastAddress = phRamSize + diffKernUsr;
|
MmVirtLastAddress = phRamSize + diffKernUsr;
|
||||||
|
|
||||||
DebugLog("\tPaging gap : %u MB (%p)\n\tLast virtual address %p\n", diffKernUsr / MB, diffKernUsr, MmVirtLastAddress);
|
//DebugLog("\tPaging gap : %u MB (%p)\n\tLast virtual address %p\n", diffKernUsr / MB, diffKernUsr, MmVirtLastAddress);
|
||||||
|
|
||||||
memzero((void *)&MmPageMapLevel4[0], sizeof(MmPageMapLevel4));
|
memzero((void *)&MmPageMapLevel4[0], sizeof(MmPageMapLevel4));
|
||||||
|
|
||||||
|
@ -149,15 +149,15 @@ void MmInitPaging(void)
|
||||||
MmPT[index] = (ulong)curAddrPT | PRESENT | READWRITE;
|
MmPT[index] = (ulong)curAddrPT | PRESENT | READWRITE;
|
||||||
|
|
||||||
if ((ulong)curAddrPT == lastKernelAddr) {
|
if ((ulong)curAddrPT == lastKernelAddr) {
|
||||||
DebugLog("\tLast page of kernel at %p\n", curAddrPT);
|
//DebugLog("\tLast page of kernel at %p\n", curAddrPT);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// While we're inside the userspace pages
|
// While we're inside the userspace pages
|
||||||
else if ((ulong)curAddrPT >= USERSPACE) {
|
else if ((ulong)curAddrPT >= USERSPACE) {
|
||||||
MmPT[index] = ((ulong)curAddrPT); // Not present for instance
|
MmPT[index] = ((ulong)curAddrPT - diffKernUsr) | PRESENT; // Not present for instance
|
||||||
|
|
||||||
if ((ulong)curAddrPT == USERSPACE) {
|
if ((ulong)curAddrPT == USERSPACE) {
|
||||||
DebugLog("\tUserspace at %p:%p\n", curAddrPT, curAddrPT + diffKernUsr);
|
DebugLog("\tUserspace at %p:%p\n", curAddrPT, curAddrPT - diffKernUsr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -189,14 +189,14 @@ void *MmTransVirtToPhyAddr(void* virtualAddr)
|
||||||
}
|
}
|
||||||
|
|
||||||
pdpe_t *pdp = (pdpe_t*)((ulong)MmPageMapLevel4[(virtAddrPage / ((ulong)KPAGESIZE * 0x8000000)) % 512] & ~(KPAGESIZE - 1));
|
pdpe_t *pdp = (pdpe_t*)((ulong)MmPageMapLevel4[(virtAddrPage / ((ulong)KPAGESIZE * 0x8000000)) % 512] & ~(KPAGESIZE - 1));
|
||||||
DebugLog("pdp : %p\n", pdp);
|
DebugLog("pdp\t: %p\n", pdp);
|
||||||
pde_t *pd = (pde_t*)( (ulong)pdp[(virtAddrPage / ((ulong)KPAGESIZE * 0x40000)) % 512] & ~(KPAGESIZE - 1));
|
pde_t *pd = (pde_t*)( (ulong)pdp[(virtAddrPage / ((ulong)KPAGESIZE * 0x40000)) % 512] & ~(KPAGESIZE - 1));
|
||||||
DebugLog("pd : %p\n", pd);
|
DebugLog("pd\t: %p\n", pd);
|
||||||
pte_t *pt = (pte_t*)( (ulong)pd[(virtAddrPage / ((ulong)KPAGESIZE * 0x200)) % 512] & ~(KPAGESIZE - 1));
|
pte_t *pt = (pte_t*)( (ulong)pd[(virtAddrPage / ((ulong)KPAGESIZE * 0x200)) % 512] & ~(KPAGESIZE - 1));
|
||||||
DebugLog("pt : %p\n", pt);
|
DebugLog("pt\t: %p\n", pt);
|
||||||
|
|
||||||
ulong page = (ulong)pt[(virtAddrPage / ((ulong)KPAGESIZE)) % 512];
|
ulong page = (ulong)pt[(virtAddrPage / ((ulong)KPAGESIZE)) % 512];
|
||||||
DebugLog("page : %p\n", page);
|
DebugLog("page (with flags): %p\n", page);
|
||||||
|
|
||||||
if (page == (page & ~(KPAGESIZE - 1))) {
|
if (page == (page & ~(KPAGESIZE - 1))) {
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -311,7 +311,7 @@ static void PagingHandler(ISRFrame_t *regs)
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
//XXX page fault
|
//XXX page fault
|
||||||
bprintf(BStdOut, "\n\n%CPANIC\n[ISR 0x8] Irrecoverable Kernel Page Fault at %p\n\n"
|
bprintf(BStdOut, "\n\n%CPANIC\n[ISR 0x8] Irrecoverable Page Fault at %p\n\n"
|
||||||
" Error code : 0x%x (%b)",
|
" Error code : 0x%x (%b)",
|
||||||
|
|
||||||
VGA_COLOR_LIGHT_RED,
|
VGA_COLOR_LIGHT_RED,
|
||||||
|
@ -321,6 +321,23 @@ static void PagingHandler(ISRFrame_t *regs)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bprintf(BStdOut, "\n Description : ");
|
||||||
|
|
||||||
|
if (regs->ErrorCode & PRESENT) {
|
||||||
|
bprintf(BStdOut, "Page-protection violation ");
|
||||||
|
} else {
|
||||||
|
bprintf(BStdOut, "Non present page ");
|
||||||
|
}
|
||||||
|
if (regs->ErrorCode & READWRITE) {
|
||||||
|
bprintf(BStdOut, "during write access ");
|
||||||
|
} else {
|
||||||
|
bprintf(BStdOut, "during read access ");
|
||||||
|
}
|
||||||
|
if (regs->ErrorCode & (1 << 3))
|
||||||
|
bprintf(BStdOut, "from userspace ");
|
||||||
|
if (regs->ErrorCode & (1 << 4))
|
||||||
|
bprintf(BStdOut, "after instruction fetching ");
|
||||||
|
|
||||||
KeBrkDumpRegisters(regs);
|
KeBrkDumpRegisters(regs);
|
||||||
|
|
||||||
BStdOut->flusher(BStdOut);
|
BStdOut->flusher(BStdOut);
|
||||||
|
|
Binary file not shown.
Loading…
Reference in New Issue