Prashanth L.A.
2023-09-19
How to make page tables smaller
Â
A 16KB Address Space With 1KB Pages | Page Table For 16KB Address Space |
---|---|
32-bit address space with 4KB pages
Seg value | Content |
---|---|
00 | unused segment |
01 | code |
10 | heap |
11 | stack |
SN = (VirtualAddress & SEG_MASK) >> SN_SHIFT
VPN = (VirtualAddress & VPN_MASK) >> VPN_SHIFT
AddressOfPTE = Base[SN] + (VPN * sizeof(PTE))
Page directory: To track whether a page of the PT is valid
Left | Right |
---|---|
|
|
Poll: Advantages and disadvantages of multi-level PTs
VPN = (VirtualAddress & VPN_MASK) >> SHIFT
(Success, TlbEntry) = TLB_Lookup(VPN)
if (Success == True) // TLB Hit
if (CanAccess(TlbEntry.ProtectBits) == True)
Offset = VirtualAddress & OFFSET_MASK
PhysAddr = (TlbEntry.PFN << SHIFT) | Offset
Register = AccessMemory(PhysAddr)
else
RaiseException(PROTECTION_FAULT)
else // TLB Miss
// first, get page directory entry
PDIndex
PDEAddr
PDE
if (PDE.Valid == False)
= (VPN & PD_MASK) >> PD_SHIFT
= PDBR + (PDIndex * sizeof(PDE)) = AccessMemory(PDEAddr)
RaiseException(SEGMENTATION_FAULT)
else
// PDE is valid: now fetch PTE from page table
PTIndex = (VPN & PT_MASK) >> PT_SHIFT
PTEAddr = (PDE.PFN << SHIFT) + (PTIndex * sizeof(PTE))
PTE = AccessMemory(PTEAddr)
if (PTE.Valid == False)
RaiseException(SEGMENTATION_FAULT)
else if (CanAccess(PTE.ProtectBits) == False)
RaiseException(PROTECTION_FAULT)
else
TLB_Insert(VPN, PTE.PFN, PTE.ProtectBits)
RetryInstruction()