19 分页:更快翻译
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;
AccessMemory(PhysAddr);
} else {
RaiseException(PROTECTION_FAULT);
}
else { // TLB Miss
PTEAddr = PTBR + (VPN * sizeof(PTE));
PTE = AccessMemroy(PTEAddr)
}
if (PTE.Valid == False) {
RaiseException(SEGMENTATION_FAULT)
} else if (CanAccesss(PTE.PRotectBits) == False) {
RaiseException(PROTECTION_FAULT);
} else {
TLB_Insert(VPN, PTE.PFN, PTE.ProtectBits);
RetryInstruction();
}