2016-04-12 4 views
-1

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

Этот проект состоит из написания программы, которая переводит логичнее физические адреса для виртуального адресного пространства 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; 
} 
+0

В заявлении о проблеме говорится, что страница и смещение составляют каждые 8 ​​бит. Почему вы переключаетесь на 13 бит? – Barmar

+0

Не связано с вашей проблемой маскировки, но: [почему while (! Feof (fp)) всегда неверно] (http://stackoverflow.com/questions/5431941/while-feof-file-is-always-wrong) – Barmar

+0

Можете ли вы предоставить пример ввода и то, что вы ожидаете от вывода (вручную)? – jojonas

ответ

0

Инструкции говорят, что адрес разбивается на 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

Я отредактировал код, который вы предложили, но, к сожалению, он по-прежнему не дает правильных результатов. Я добавил несколько примеров ввода-вывода к вопросу, чтобы помочь сделать вещи более ясными. – Hossam

+0

Образец вывода, который вы показали, не имеет номера страницы и смещения. Откуда вы знаете, что этот код неправильный? – Barmar

Смежные вопросы