如何获取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
相关产品推荐
相关产品推荐

