Почему выделенные области имеют такое большое значение?
У меня есть код, который не вызывает 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, поэтому я ничего не смог найти.