Я недавно изучаю механизмы выравнивания внутри ядра Linux, однако меня смущают два макроса: ALIGN()
и round_up()
, они имеют различную реализацию, но одну и ту же цель (как я понимаю), чтосделайте округление до 2 ^ n-байтов.
Мне любопытно, почему им нужны два макроса с разными значениями impl, но с одинаковым выводом.
Кроме того, они оба находятся в одном заголовочном файле., include/linux/kernel.h
.
Impl из round_up()
:
#define __round_mask(x, y) ((__typeof__(x))((y)-1))
#define round_up(x, y) ((((x)-1) | __round_mask(x, y))+1)
Impl из ALIGN () :
#define __ALIGN_KERNEL(x, a) __ALIGN_KERNEL_MASK(x, (typeof(x))(a) - 1)
#define __ALIGN_KERNEL_MASK(x, mask) (((x) + (mask)) & ~(mask))
#define ALIGN(x, a) __ALIGN_KERNEL((x), (a))
Спасибо!