【发布时间】: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