/**
* 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.