如何在C语言中使用位运算提取页码和偏移量

5

我正在学习C语言中的位运算符,现在我正在开发一个带有FIFO替换算法的页面模拟器来处理操作系统学科,并遇到了使用位运算符的困难。


SIZE PAGE 1024                    // 1024 bits == 128 BYTES
PHYSICAL MEMORY SIZE 10           // 10 bits (PHYSICAL)
VIRTUAL MEMORY SIZE 16            // 16 bits (VIRTUAL)
NUMBER PHYSICAL PAGES 8           // 8 FRAMES
NUMBER OF VIRTUAL PAGES 512

如果我们有16位虚拟内存,那么逻辑地址范围为0到65535 ((2^16) -1)。因此,我们将有9位用于地址和7位用于数据
以数字546 (0000 0010 0010 0010)为例:
 Page Number  |  Offset
 0000 0010 0  |  010 0010
&1111 1111 1  |  000 0000
 0000 0010 0  |  000 0000
so, using right shift >> I get the value of the address.

重要的是考虑页面编号,偏移量将没有用处。我试图通过文本操作来解决这个问题,但由于没有考虑前导零,这会导致问题,在使用int和位运算时将是正确的。我找到了一个执行提取的示例,但即使进行必要的更改后仍然出现问题,这里是链接:点击这里
void extract_fields(unsigned int address){ ... }

如果有人能帮我,因为我不确定如何根据地址应用位掩码,请非常感谢,我相信这将对很多人有所帮助,因为疑问是一件经常发生的事情,也是出于学术目的。


3
可以将其简化为“我有一个数字X,想要使用位运算提取出Y和Z吗?” - Eugene Sh.
哈哈哈哈,抱歉我的朋友@Eugene Sh.,我只是想展示为什么我想要这样做,我会简化问题。 - Paulo Pitta
1
在以546为例的情况下,您需要从16位0000 0010 0010 0010开始,并将其分成9位和7位的块。 - user3386109
1个回答

2

解决问题的关键是如何从给定的虚拟地址中提取虚拟页号。

可以通过简单地将位移7个位置向右(7是用于在128字节页面内寻址所需的位数)或通过整数除法除以128来完成此操作,这会丢弃余数:

unsigned int extract_page(unsigned int address) {
    return address >> 7;
}

使用scanf("%u", &address)从输入文件中读取每个地址。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接