Почему выделенные области имеют такое большое значение?

У меня есть код, который не вызывает ioremap() для 4М региона. Пытаясь выяснить причину, я обнаружил, что если вы позвоните 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 необходимо не только 4М продолжает обращаться в vmalloc площадь, но она также должна быть выровнена до 4M.

Я не смог найти никакой информации о том, зачем нужно это выравнивание. Я даже пытался использовать git blame, чтобы увидеть коммит, который вводит это изменение, но кажется, что код старше, чем история git, поэтому я ничего не смог найти.

0 ответов

Другие вопросы по тегам