我有一个无法调用ioremap()
4M 区域的代码。尝试调试原因,我发现如果您调用ioremap
它,它将尝试分配具有非常大对齐的连续地址(取决于您要分配的区域的大小)。计算这种对齐的代码在__get_vm_area_node()
函数 ( mm/vmalloc.c
) 中,它看起来像这样:
if (flags & VM_IOREMAP) {
int bit = fls(size);
if (bit > IOREMAP_MAX_ORDER)
bit = IOREMAP_MAX_ORDER;
else if (bit < PAGE_SHIFT)
bit = PAGE_SHIFT;
align = 1ul << bit;
}
在 ARM 上,IOREMAP_MAX_ORDER
定义为23
. 这意味着在我的情况下,ioremap
不仅需要 4M 的区域连续寻址,vmalloc
而且还必须与 4M 对齐。
我找不到任何关于为什么需要这种对齐的信息。我什至尝试使用 git blame 来查看引入此更改的提交,但似乎代码比 git history 旧,所以我找不到任何东西。