【问题标题】:Is the address returned by vmalloc() a multiple of PAGE_SIZE?vmalloc() 返回的地址是 PAGE_SIZE 的倍数吗?
【发布时间】:2021-07-18 03:58:43
【问题描述】:

我想问一个关于vmalloc()的问题。

根据 kernel.org 的documentation,它说:

分配足够多的页面以覆盖页面级分配器的大小,并将它们映射到连续的内核虚拟空间。

这是否意味着vmalloc() 返回的(起始)地址将是 PAGE_SIZE 的倍数?

以下是我的想法:

我尝试拨打vmalloc() 并以十六进制打印出地址。最后三位全为零,在我的系统上 PAGE_SIZE 的值为 4096,这有点证明了我的假设。另外,在mmap()

void *mmap(void *addr, size_t length, int prot, int flags,
                  int fd, off_t offset);

手册页还说,

如果 addr 为 NULL,那么内核选择 (page-aligned) 创建映射的地址;这是最便携的 创建新映射的方法。如果 addr 不为 NULL,则 内核将其作为映射放置位置的提示;在 Linux,内核将选择一个附近的页面边界(但总是 高于或等于指定的值 /proc/sys/vm/mmap_min_addr) 并尝试创建映射 在那里。

偏移量必须是页面大小的倍数

文件以页面大小的倍数进行映射。

以上似乎证明了我的假设,但我不太确定。任何想法将不胜感激。

【问题讨论】:

  • 是的,“page-aligned”是指返回的地址是PAGE_SIZE的倍数。
  • @wxz:“页面对齐”引用自 mmap 文档,而不是 vmalloc 文档。
  • Re“最后三位都是零”:大概你的意思是最后三个十六进制数字是零,所以最后12位是零。
  • vmalloc的对齐方式与mmap有什么关系?它们是不同的东西,但 IIRC 它们可能会共享一些代码路径。
  • kmalloc() 怎么样? kmalloc()返回的地址也是PAGE_SIZE的倍数吗?

标签: c linux linux-kernel


【解决方案1】:

vmalloc 分配页面并返回分配内存的起始地址。每个页面都必须是页面对齐的。因此起始地址是页面大小的倍数。

【讨论】:

    猜你喜欢
    • 2020-01-08
    • 1970-01-01
    • 2022-01-16
    • 2013-06-04
    • 2018-02-10
    • 1970-01-01
    • 2013-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多