C PagingTranslation Function - PullRequest
       10

C PagingTranslation Function

0 голосов
/ 03 ноября 2019
/**
 * I used a template and I made modification on it, but dont 
 *  know to complete it
 */

typedef unsigned int uint;
#define PAGE_SIZE_BITS 12           // 2^12 = 4KB
#define OFFSET_MASK ((1<<PAGE_SIZE_BITS)-1) // 0xFFF w/ 4KB pages
#define INVALID_PAGE (uint)-1       // will have the value 0xFFF…FFF
#define VALID_BIT (1<<HIGH_BIT)     // a 1 in the location of the valid bit
#define HIGH_BIT (sizeof(uint)*8-1) // will be 63 on a 64-bit system

uint translate(uint log_addr, uint* page_table, uint page_table_lim) {

    /* I need to complete this function */
    return INVALID_PAGE; 
}

#include <stdio.h>
#define ARRAYSIZE(array) (sizeof(array)/sizeof(array[0]))
#define TEST(LOGICAL, PHYSICAL) \
    if (translate(LOGICAL, page_table, ARRAYSIZE(page_table)) != PHYSICAL) { \
        uint phys = translate(LOGICAL, page_table, ARRAYSIZE(page_table)); \
        fprintf(stderr, "Failed on line %d - for logical addr %06x expected physical address %07x but got %07x\n", __LINE__, LOGICAL, PHYSICAL, phys); return 1; \
    }

int main() {
    // Run some tests for the translate function
    uint page_table[512] = { 0 };
    page_table[200] = 0x1234;
    page_table[300] = 0x2345 | VALID_BIT;
    page_table[511] = 0x8000 | VALID_BIT;

    TEST(0x000000, INVALID_PAGE);
    TEST(0x000001, INVALID_PAGE);
    TEST(0x000FFF, INVALID_PAGE);

    TEST(0x0C8000, INVALID_PAGE);
    TEST(0x0C8123, INVALID_PAGE);
    TEST(0x0C8FFF, INVALID_PAGE);

    TEST(0x12C000, 0x2345000);
    TEST(0x12C0C8, 0x23450C8);
    TEST(0x12CFFF, 0x2345FFF);

    TEST(0x1FF000, 0x8000000);
    TEST(0x1FF84A, 0x800084A);
    TEST(0x1FFFFF, 0x8000FFF);

    TEST(0x200002, INVALID_PAGE);
    TEST(0x1000FFF, INVALID_PAGE);

    printf(" all passed good \n");
    return 0;
}

Я пытаюсь создать функцию для выполнения преобразования адресов логической памяти с использованием одноуровневой системы таблиц страниц.

Я хочу написать функцию C translate() для системы, которая использует 4 КБстраницы, которые принимают логический адрес и таблицу страниц и возвращают физический адрес. Если есть проблема (неверная страница), должно быть возвращено значение INVALID_PAGE.

...