Перевод логического адреса в физический для виртуального адреса
В настоящее время я работаю над проектом по преобразованию логических адресов в физические адреса. Вопрос задает:
Этот проект состоит из написания программы, которая переводит логические адреса в физические для виртуального адресного пространства размером 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;
}