Перевод логического адреса в физический для виртуального адреса

В настоящее время я работаю над проектом по преобразованию логических адресов в физические адреса. Вопрос задает:

Этот проект состоит из написания программы, которая переводит логические адреса в физические для виртуальных
адресное пространство 2 ^ 16 = 65 536 байт. Ваша программа будет читать из файла, содержащего логические
адреса и, используя TLB, а также таблицу страниц, будет преобразовывать каждый логический адрес в его
соответствующий физический адрес и вывести значение байта, хранящегося в преобразованном физическом
адрес. Убедитесь, что ваша программа использует быстрые операции, такие как операторы левого / правого сдвига.

Особенности: Ваша программа будет читать файл, содержащий несколько 32-битных
целые числа, которые представляют логические адреса. Тем не менее, вам нужно
заботиться только о 16-битных адресах, поэтому вы должны замаскировать
самые правые 16 бит каждого логического адреса. Эти 16 бит разделены
в (1) 8-битный номер страницы и (2) 8-битное смещение страницы

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

РЕДАКТИРОВАТЬ: ОБРАЗЕЦ I / O

  Virtual address: 16916 Physical address: 20
Virtual address: 62493 Physical address: 285
Virtual address: 30198 Physical address: 758
#define MASK_BITS(x) ((x) & (unsigned int)0x0000FFFF)
unsigned long long int MapAddress(unsigned long long int address){
unsigned long long int page = MASK_BITS(address);
unsigned long long int offset = MASK_BITS(address);

printf("The mapped address %llu contains:\n", address);

page = page >> 13;
printf("Page Number : %llu\n", page);

offset = offset & 0x1FFF;

printf("Offset = %llu\n\n", offset);
return 0;
}
void myFunction()
{
FILE *fp = fopen("/PATH/TO/addresses.txt", "r");
char buffer[32];
unsigned long long int x;
int cnt = 1;
while(!feof(fp)){
fscanf(fp, "%s", buffer);
x = atol(buffer);
MapAddress(x);
cnt++;
}

fclose(fp);
return;
}

-1

Решение

В инструкциях говорится, что адрес разбит на 8-битную страницу и смещение, но ваш код использует 13 бит вместо 8 бит. Вам нужно сдвинуться на 8 бит, чтобы получить номер страницы, и замаскировать младшие 8 бит, чтобы получить смещение.

unsigned long long int MapAddress(unsigned long long int address){
address = MASK_BITS(address);

printf("The mapped address %llu contains:\n", address);

unsigned long long int page = address >> 8;
printf("Page Number : %llu\n", page);

unsigned long long int offset = address & 0xFF;

printf("Offset = %llu\n\n", offset);
return 0;
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]