C语言如何使用Bitwise提取页码和偏移量
How to use Bitwise to extract Page Number and Offset in Language C
我正在研究 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) 的逻辑地址。这样,我们将有 9b 用于地址,7b 用于数据。
示例编号 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 和按位一起使用是正确的。我找到了一个如何执行提取的示例,但即使进行了必要的更改,它仍然出错,这里是 link:Click Here.
void extract_fields(unsigned int address){ ... }
如果有人能帮助我,因为我不确定如何应用给定地址的位掩码,非常感谢,我相信它会帮助很多人,因为疑问是经常出现的,并且学术目的。
解决您的问题唯一重要的是如何从给定的虚拟地址中提取虚拟页码。
这可以通过简单的向右移动七位(七是 128 字节页内寻址所需的位数)或除以 128 的整数除以余数来完成:
unsigned int extract_page(unsigned int address) {
return address >> 7;
}
使用scanf("%u", &address)
从输入文件中读取每个地址。
我正在研究 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) 的逻辑地址。这样,我们将有 9b 用于地址,7b 用于数据。
示例编号 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 和按位一起使用是正确的。我找到了一个如何执行提取的示例,但即使进行了必要的更改,它仍然出错,这里是 link:Click Here.
void extract_fields(unsigned int address){ ... }
如果有人能帮助我,因为我不确定如何应用给定地址的位掩码,非常感谢,我相信它会帮助很多人,因为疑问是经常出现的,并且学术目的。
解决您的问题唯一重要的是如何从给定的虚拟地址中提取虚拟页码。
这可以通过简单的向右移动七位(七是 128 字节页内寻址所需的位数)或除以 128 的整数除以余数来完成:
unsigned int extract_page(unsigned int address) {
return address >> 7;
}
使用scanf("%u", &address)
从输入文件中读取每个地址。