分层寻呼地址掩码

hierarchical paging address mask

我遇到了以下 C 代码,它旨在 运行 在 32 位机器上 并为页面目录地址和页面生成位掩码-table-2 层分页中的地址:

#define PAGE_DIRECTORY_ADDRESS_MASK (~((uint64_t)0xfff))
#define PAGE_TABLE_ADDRESS_MASK (~((uint32_t)0xfff))

两个 return 不会得到相同的结果吗?

   20 bits       12 bits
+--------------+--------+
| 1...........1|0......0|
+--------------+--------+
32           12 11     0

好问题!它们可能看起来相同但是:

#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>

#define PAGE_DIRECTORY_ADDRESS_MASK (~((uint64_t)0xfff))
#define PAGE_TABLE_ADDRESS_MASK (~((uint32_t)0xfff))

int main()
{  
    uint64_t a = PAGE_DIRECTORY_ADDRESS_MASK;
    uint64_t b = PAGE_TABLE_ADDRESS_MASK;

    if (PAGE_DIRECTORY_ADDRESS_MASK != PAGE_TABLE_ADDRESS_MASK)
        printf("Different: %llx %llx\n",PAGE_DIRECTORY_ADDRESS_MASK, PAGE_TABLE_ADDRESS_MASK);

    if (a != b)
        printf("Different! %llx %llx\n",a, b);

    return 0;        
}

输出:

Different: fffffffffffff000 fffff000                                                                                                         
Different! fffffffffffff000 fffff000