如何获得内存地址页的开头?



我正试图获得页面的开始,我的内存地址存储在其中。我该怎么做呢?(Windows x64)

第一步是找出内存页的大小。在c++中没有标准的方法来获取内存页的大小。参考目标操作系统的文档。

在页面大小已知的情况下,我们需要将给定的指针对准页面大小的边缘。有一个标准函数std::align,它几乎做了我们想要的,除了它向前对齐页面的末尾,而不是回到开始。我们可以简单地向后调整一页:

inline void*
align_back(void* address, std::size_t alignment) noexcept
{
void* aligned = address;
std::size_t space = alignment;
std::align(alignment, 1, aligned, space);
return address == aligned
? aligned
: static_cast<char*>(aligned) - alignment;
}
// example
void* beginning = align_back(address, page_size);

或者,我们可以依赖于实现相关的细节,并假设重新解释的整数的对齐方式与指针的对齐方式匹配:

inline void*
align_back(void* ptr, std::size_t alignment) noexcept
{
std::uintptr_t ptr_int = reinterpret_cast<std::uintptr_t>(ptr);
std::size_t remainder = ptr_int % alignment;
return static_cast<char*>(ptr) - remainder;
}

这倾向于在我的测试中产生更好的组装。

相关内容

  • 没有找到相关文章

最新更新