我的代码无法为4M区域调用ioremap()
。试图调试原因,我发现如果你调用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
不仅需要vmalloc
区域中的4M继续寻址,而且还必须与4M对齐。
我无法找到有关为何需要此对齐的任何信息。我甚至尝试使用git blame来查看引入此更改的提交,但似乎代码比git历史旧,所以我找不到任何内容。