Какова связь между наименьшим распределением kmallo c () и размером страницы памяти? - PullRequest
1 голос
/ 27 февраля 2020

Из этого поста Я понял, что:

Наименьшее выделение, которое может обработать kmallo c, составляет 32 или 64 байта

и

Реальная память, которую вы получаете, зависит от архитектуры системы

Но также упоминается размер страницы памяти там и на других сайтах. Я не могу понять, как размер страницы связан с наименьшим распределением kmalloc()? Размер страницы обычно составляет 4096 байт, но наименьшее выделение составляет 32 или 64 байта (в зависимости от арки).

Так какова связь между наименьшим выделением kmalloc() и размером страницы? И почему наименьшее распределение составляет 32 или 64 байта, а не 16 (например)?

1 Ответ

0 голосов
/ 28 февраля 2020

Итак, какова связь между наименьшим размером kmalloc() и размером страницы?

Нет. Они не связаны.

Как видно из , исходный код :

#ifdef CONFIG_SLAB
// ...
#ifndef KMALLOC_SHIFT_LOW
#define KMALLOC_SHIFT_LOW   5
#endif

#ifdef CONFIG_SLUB
// ...
#ifndef KMALLOC_SHIFT_LOW
#define KMALLOC_SHIFT_LOW   3
#endif
#endif

#ifdef CONFIG_SLOB
// ...
#ifndef KMALLOC_SHIFT_LOW
#define KMALLOC_SHIFT_LOW   3
#endif
#endif

// ...

#ifndef KMALLOC_MIN_SIZE
#define KMALLOC_MIN_SIZE (1 << KMALLOC_SHIFT_LOW)
#endif

Ни один из макросов, определяющих KMALLOC_MIN_SIZE для разных распределителей, не зависит от размер страницы, поэтому нет никакой связи между размером страницы и kmalloc() минимальным размером выделения.

Однако на некоторых архитектурах минимальный размер может отличаться, если kmalloc() память также используется для прямого доступа к памяти. Вот почему вы видите различные #ifndef выше. Это все еще не связано с размером страницы, хотя.

/*
 * Some archs want to perform DMA into kmalloc caches and need a guaranteed
 * alignment larger than the alignment of a 64-bit integer.
 * Setting ARCH_KMALLOC_MINALIGN in arch headers allows that.
 */
#if defined(ARCH_DMA_MINALIGN) && ARCH_DMA_MINALIGN > 8
#define ARCH_KMALLOC_MINALIGN ARCH_DMA_MINALIGN
#define KMALLOC_MIN_SIZE ARCH_DMA_MINALIGN
#define KMALLOC_SHIFT_LOW ilog2(ARCH_DMA_MINALIGN)
#else
#define ARCH_KMALLOC_MINALIGN __alignof__(unsigned long long)
#endif

Значение ARCH_DMA_MINALIGN зависит от архитектуры c и обычно связано с размером кэша процессора L1, как вы можете видеть, например, для ARM :

#define L1_CACHE_SHIFT      CONFIG_ARM_L1_CACHE_SHIFT
#define L1_CACHE_BYTES      (1 << L1_CACHE_SHIFT)

/*
 * Memory returned by kmalloc() may be used for DMA, so we must make
 * sure that all such allocations are cache aligned. Otherwise,
 * unrelated code may cause parts of the buffer to be read into the
 * cache before the transfer is done, causing old data to be seen by
 * the CPU.
 */
#define ARCH_DMA_MINALIGN   L1_CACHE_BYTES
...