【问题标题】:How do I get pointer to beginning of a page如何获取指向页面开头的指针
【发布时间】:2017-02-05 11:34:57
【问题描述】:

如何获得指向页面开头的指针?

我尝试了以下没有成功:

#define PAGESIZE 4096

 bool is_page_aligned(void *p)
 {
    return !((long int)p & 0xFFF);
 }

 int main(void)
 {
     bool res;
     void *buffer;

     buffer = malloc(PAGESIZE*2);
     printf("%p\n", (void *) &buffer);
     res = is_page_aligned(&buffer);
     fputs(res ? "true\n" : "false\n", stdout);
     return 0;
}

我正在尝试减少 TLB 未命中。非常感谢任何可能的帮助。

【问题讨论】:

  • 寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:如何创建最小、完整和可验证的示例。
  • 您正在检查变量buffer 的位置是否是页面对齐的,而不是buffer 指向的内存。
  • 首先:您的代码调用未定义的行为。至少使用正确的整数类型对指针进行算术运算(它仍然是 UB,但更有可能在您的平台上工作)。
  • 另外,您的问题是关于获取指向页面开头的指针,但您显示的代码并没有这样做,它只是检查指针是否以某种特定方式对齐。
  • @Olaf,在指针和整数之间转换的行为是实现定义,前提是整数类型足够大以容纳指针的转换值。

标签: c alignment


【解决方案1】:

要获得包含地址a 的页面的开头地址,除以页面大小,然后乘以页面大小。

long int page_beginning = PAGESIZE * (a / PAGESIZE);

这是因为在整数除法期间执行截断。

你也可以减去模数:

long int page_beginning = a - (a % PAGESIZE);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-09
    • 2015-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多