You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取2MB/1GB大页(Hugepages)的物理地址?

大页物理地址获取问题

我已仔细研究过相关问题及参考资料,但未能解决问题,故再次提问。

我了解通过/proc/self/pagemap获取物理地址的方法,大致分为两步:1. 获取物理页;2. 获取页偏移。

uint64_t get_page_frame_number_of_address(void *address) {

    /* Open the pagemap file for the current process */
    FILE *pagemap = fopen("/proc/self/pagemap", "rb");

    /* Seek to the page that the buffer is on it */ 
    uint64_t offset = (uint64_t)((uint64_t)address >> PAGE_SHIFT) * (uint64_t)PAGEMAP_LENGTH;
    if(fseek(pagemap, (uint64_t)offset, SEEK_SET) != 0) {
        fprintf(stderr, "Failed to seek pagemap to proper location\n");
        exit(1);
    }

    /* The page frame number is in bits 0-54 so read the first 7 bytes and clear the 55th bit */
    uint64_t page_frame_number = 0;
    fread(&page_frame_number, 1, PAGEMAP_LENGTH-1, pagemap);
    page_frame_number &= 0x7FFFFFFFFFFFFF;
    fclose(pagemap);
    return page_frame_number;
}

uint64_t get_physical_address(void* address) {

    /* Get page frame number */
    unsigned int page_frame_number = get_page_frame_number_of_address(address);

    /* Find the difference from the buffer to the page boundary */
    uint64_t distance_from_page_boundary = (uint64_t)address % getpagesize();

    /* Determine how far to seek into memory to find the buffer */
    uint64_t physical_address = (uint64_t)((uint64_t)page_frame_number << PAGE_SHIFT) + (uint64_t)distance_from_page_boundary;

    return physical_address;
}

我尝试将PAGE_SHIFT从12(对应4KB页)改为21(对应2MB页),并调整getpagesize()的大小,但此时page_frame_number始终为0。因此我想知道:

  • 是否无法通过/proc/self/pagemap获取大页的物理地址?
  • 还有其他获取大页物理地址的方法吗?

内容的提问来源于stack exchange,提问作者xuxing chen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 17:25:08