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



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

该项目包括编写一个程序,将虚拟机的逻辑地址转换为物理地址2^16的地址空间=65536字节。您的程序将从包含逻辑地址,并使用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 : %llun", page);
    offset = offset & 0x1FFF;
    printf("Offset = %llunn", 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位而不是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 : %llun", page);
    unsigned long long int offset = address & 0xFF;
    printf("Offset = %llunn", offset);
    return 0;
}

最新更新