Advertisement
JavierGumin

Virtual Memory (Tugas Lab)

Jun 4th, 2025
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.03 KB | None | 0 0
  1.     #include <stdio.h>
  2.     #include <stdint.h>
  3.     #include <stdlib.h>
  4.     #include <string.h>
  5.     #include <ctype.h>
  6.  
  7.     typedef struct {
  8.         int resident;
  9.         uint8_t frame;
  10.     } PageTableEntry;
  11.  
  12.     PageTableEntry page_table[16];
  13.  
  14.     void initialize_page_table() {
  15.         for (int i = 0; i < 16; i++) {
  16.             page_table[i].resident = 0;
  17.             page_table[i].frame = 0;
  18.         }
  19.  
  20.         page_table[0].resident = 1;
  21.         page_table[0].frame = 0b1110;
  22.  
  23.         page_table[2].resident = 1;
  24.         page_table[2].frame = 0b0001;
  25.  
  26.         page_table[3].resident = 1;
  27.         page_table[3].frame = 0b1010;
  28.  
  29.         page_table[4].resident = 1;
  30.         page_table[4].frame = 0b0100;
  31.  
  32.         page_table[5].resident = 1;
  33.         page_table[5].frame = 0b0011;
  34.  
  35.         page_table[9].resident = 1;
  36.         page_table[9].frame = 0b0101;
  37.  
  38.         page_table[11].resident = 1;
  39.         page_table[11].frame = 0b0111;
  40.  
  41.         page_table[14].resident = 1;
  42.         page_table[14].frame = 0b1100;
  43.     }
  44.  
  45.     void print_binary(uint32_t physical) {
  46.         uint8_t nibbles[8];
  47.         nibbles[0] = (physical >> 28) & 0xF;
  48.         nibbles[1] = (physical >> 24) & 0xF;
  49.         nibbles[2] = (physical >> 20) & 0xF;
  50.         nibbles[3] = (physical >> 16) & 0xF;
  51.         nibbles[4] = (physical >> 12) & 0xF;
  52.         nibbles[5] = (physical >> 8) & 0xF;
  53.         nibbles[6] = (physical >> 4) & 0xF;
  54.         nibbles[7] = physical & 0xF;
  55.  
  56.         char binary_str[36] = "";
  57.         for (int i = 0; i < 8; i++) {
  58.             char bits[5];
  59.             uint8_t n = nibbles[i];
  60.             bits[0] = (n & 0x8) ? '1' : '0';
  61.             bits[1] = (n & 0x4) ? '1' : '0';
  62.             bits[2] = (n & 0x2) ? '1' : '0';
  63.             bits[3] = (n & 0x1) ? '1' : '0';
  64.             bits[4] = '\0';
  65.  
  66.             strcat(binary_str, bits);
  67.             if (i < 7) {
  68.                 strcat(binary_str, " ");
  69.             }
  70.         }
  71.  
  72.         printf("%s (0x%08X)\n", binary_str, physical);
  73.     }
  74.  
  75.     int main() {
  76.         initialize_page_table();
  77.  
  78.         char input[11];
  79.         while (scanf("%10s", input) == 1) {
  80.             if (strlen(input) < 3 || (input[0] != '0' || (input[1] != 'x' && input[1] != 'X'))) {
  81.                 continue;
  82.             }
  83.  
  84.             for (char *p = input + 2; *p; p++) {
  85.                 *p = tolower(*p);
  86.             }
  87.  
  88.             char *endptr;
  89.             uint32_t virtual_address = (uint32_t)strtoul(input, &endptr, 16);
  90.  
  91.             if (*endptr != '\0') {
  92.                 continue;
  93.             }
  94.  
  95.             uint8_t page_number = (virtual_address >> 28) & 0xF;
  96.  
  97.             if (page_table[page_number].resident == 0) {
  98.                 printf("PAGE FAULT!\n");
  99.             } else {
  100.                 uint8_t frame = page_table[page_number].frame;
  101.                 uint32_t physical_address = ((uint32_t)frame) << 28;
  102.                 physical_address |= (virtual_address & 0x0FFFFFFF);
  103.  
  104.                 print_binary(physical_address);
  105.             }
  106.         }
  107.  
  108.         return 0;
  109.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement