Различие макросов ALIGN () и round_up () в ядре Linux - PullRequest
1 голос
/ 27 сентября 2019

Я недавно изучаю механизмы выравнивания внутри ядра 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))

Спасибо!

1 Ответ

0 голосов
/ 29 сентября 2019

Они больше не в одном заголовке.__ALIGN_KERNEL*() теперь является частью UAPI.Но основные различия, которые я предполагаю, следующие:

a) немного другая реализация и

b) историческая причина, т.е. автор 9b3be9f99203 ("Переместить round_up / down to kernel.h") simple не нашел аналога ALIGN(), который появится в общих заголовках позже, в ed067d4a859f ("linux / kernel.h: Добавить макрос ALIGN_DOWN") .

Я бы порекомендовал отправить электронное письмо в LKML с авторами вышеупомянутых коммитов, Kees Cook, возможно, некоторыми другими людьми, чтобыпопросите их взглянуть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...