#include #include int main(void) { printf("VAX-like 32-bit address space simulation (512-byte pages)\n"); printf("VPN = VA >> 9 (23 bits); segment from top 2 bits of VPN\n\n"); const uint32_t examples[7] = { 0x00000000u, 0x00001000u, 0x3FFFFFFFu, 0x40000000u, 0x7FFFFFFFu, 0x80000000u, 0xC0000000u }; const char *names[7] = { "null page", "user code", "end of P0 heap", "start of P1 stack", "end of P1", "kernel start", "unused" }; for (int i = 0; i < 7; i++) { uint32_t va = examples[i]; uint32_t offset = va & 0x1FFu; uint32_t vpn = va >> 9; uint32_t seg = (vpn >> 21) & 3u; const char *segname; switch (seg) { case 0: segname = "P0 (process)"; break; case 1: segname = "P1 (process)"; break; case 2: segname = "S (system)"; break; default: segname = "unused"; break; } printf("VA=0x%08X VPN=%7u off=%3u seg=%s [%s]%s\n", va, vpn, offset, segname, names[i], (va < 512 ? " INVALID" : "")); } printf("\nNote: page 0 is marked invalid to catch null-pointer bugs.\n"); printf("Kernel (S) is mapped in every process for easy pointer passing.\n"); return 0; }