В настоящее время я работаю над проектом для перевода логических адресов на физические адреса. Вопрос спрашивает:Перевод логических на физические адреса для виртуального адреса
Этот проект состоит из написания программы, которая переводит логичнее физические адреса для виртуального адресного пространства 2^16 = 65536 байт. Ваша программа будет считывать из файла, содержащего логические адреса , и, используя TLB, а также таблицу страниц, преобразует каждый логический адрес в свой соответствующий физический адрес и выдает значение байта, хранящегося на переведенном физическом адресе . Убедитесь, что ваша программа использует быстрые операции, такие как операторы сдвига влево/вправо.
Особенности: Ваша программа будет читать файл, содержащий несколько 32-битных целых чисел, которые представляют логические адреса. Однако вам нужно, чтобы касался только 16-разрядных адресов, поэтому вы должны маскировать самых правых 16 бит каждого логического адреса. Эти 16 бит разделены в (1) 8-битовый номер страницы и (2) 8-разрядное смещение страницы
Я сделал некоторые исследования, и я разработал следующий код, однако, я знаю Я не перемещаю страницу и не устанавливаю правильное количество бит. Мне дали пример ввода-вывода, и в настоящее время мой код снимает неправильные ответы. Любая помощь будет оценена по достоинству.
EDIT: SAMPLE 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;
}
В заявлении о проблеме говорится, что страница и смещение составляют каждые 8 бит. Почему вы переключаетесь на 13 бит? – Barmar
Не связано с вашей проблемой маскировки, но: [почему while (! Feof (fp)) всегда неверно] (http://stackoverflow.com/questions/5431941/while-feof-file-is-always-wrong) – Barmar
Можете ли вы предоставить пример ввода и то, что вы ожидаете от вывода (вручную)? – jojonas