将逻辑地址转换为虚拟地址的物理地址

时间:2016-04-12 21:04:42

标签: c++ c virtual-address-space

我目前正在开发一个将逻辑地址转换为物理地址的项目。问题是:

  

该项目包括编写一个程序,用于将虚拟的逻辑地址转换为物理地址   地址空间为2 ^ 16 = 65,536字节。您的程序将从包含逻辑的文件中读取   地址和使用TLB以及页表将每个逻辑地址转换为它   相应的物理地址并输出存储在翻译物理中的字节值   地址。确保您的程序使用快速操作,如左/右移位操作符。

     

细节:您的程序将读取包含多个32位的文件   表示逻辑地址的整数。但是,你需要   只关心16位地址,所以你必须掩盖   每个逻辑地址最右边16位。这16位被分开   (1)8位页码和(2)8位页面偏移

我做了一些研究,并且我已经开发了以下代码,但是,我知道我没有移动页面并且没有正确的位数。我得到了一些示例I / O,目前我的代码是错误的答案。任何帮助将不胜感激。

编辑:样本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 个答案:

答案 0 :(得分: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;
}