1

我有一个无法调用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 旧,所以我找不到任何东西。

4

0 回答 0