我目前正在开发一个将逻辑地址转换为物理地址的项目。问题是:
该项目包括编写一个程序,用于将虚拟的逻辑地址转换为物理地址 地址空间为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;
}
答案 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;
}