Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdint.h>
- #include <stdlib.h>
- #include <string.h>
- #include <ctype.h>
- typedef struct {
- int resident;
- uint8_t frame;
- } PageTableEntry;
- PageTableEntry page_table[16];
- void initialize_page_table() {
- for (int i = 0; i < 16; i++) {
- page_table[i].resident = 0;
- page_table[i].frame = 0;
- }
- page_table[0].resident = 1;
- page_table[0].frame = 0b1110;
- page_table[2].resident = 1;
- page_table[2].frame = 0b0001;
- page_table[3].resident = 1;
- page_table[3].frame = 0b1010;
- page_table[4].resident = 1;
- page_table[4].frame = 0b0100;
- page_table[5].resident = 1;
- page_table[5].frame = 0b0011;
- page_table[9].resident = 1;
- page_table[9].frame = 0b0101;
- page_table[11].resident = 1;
- page_table[11].frame = 0b0111;
- page_table[14].resident = 1;
- page_table[14].frame = 0b1100;
- }
- void print_binary(uint32_t physical) {
- uint8_t nibbles[8];
- nibbles[0] = (physical >> 28) & 0xF;
- nibbles[1] = (physical >> 24) & 0xF;
- nibbles[2] = (physical >> 20) & 0xF;
- nibbles[3] = (physical >> 16) & 0xF;
- nibbles[4] = (physical >> 12) & 0xF;
- nibbles[5] = (physical >> 8) & 0xF;
- nibbles[6] = (physical >> 4) & 0xF;
- nibbles[7] = physical & 0xF;
- char binary_str[36] = "";
- for (int i = 0; i < 8; i++) {
- char bits[5];
- uint8_t n = nibbles[i];
- bits[0] = (n & 0x8) ? '1' : '0';
- bits[1] = (n & 0x4) ? '1' : '0';
- bits[2] = (n & 0x2) ? '1' : '0';
- bits[3] = (n & 0x1) ? '1' : '0';
- bits[4] = '\0';
- strcat(binary_str, bits);
- if (i < 7) {
- strcat(binary_str, " ");
- }
- }
- printf("%s (0x%08X)\n", binary_str, physical);
- }
- int main() {
- initialize_page_table();
- char input[11];
- while (scanf("%10s", input) == 1) {
- if (strlen(input) < 3 || (input[0] != '0' || (input[1] != 'x' && input[1] != 'X'))) {
- continue;
- }
- for (char *p = input + 2; *p; p++) {
- *p = tolower(*p);
- }
- char *endptr;
- uint32_t virtual_address = (uint32_t)strtoul(input, &endptr, 16);
- if (*endptr != '\0') {
- continue;
- }
- uint8_t page_number = (virtual_address >> 28) & 0xF;
- if (page_table[page_number].resident == 0) {
- printf("PAGE FAULT!\n");
- } else {
- uint8_t frame = page_table[page_number].frame;
- uint32_t physical_address = ((uint32_t)frame) << 28;
- physical_address |= (virtual_address & 0x0FFFFFFF);
- print_binary(physical_address);
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement