Kmalloc对齐

时间:2017-05-30 07:09:18

标签: linux linux-kernel kmalloc

让我说我用kmalloc分配一个uint64_t数组(并假设数组的大小是32kB)。我有以下问题:

1)阵列是否保证页面对齐? 2)阵列是否保证缓存/块对齐? 3)根本没有保证吗?

当我分配数组时,我使用virt_to_phys来获取数组的物理地址我得到的物理地址如00000040142d5c00和虚拟地址如fffffe07df400000

我是否有可能最终将对齐小于uint64_t,让我们说4字节对齐?

提前谢谢

1 个答案:

答案 0 :(得分:1)

由预处理器常量ARCH_KMALLOC_MINALIGN定义的对齐,

计算如下:

#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

因此理论上__alignof__(unsigned long long)可能会返回一些小于8 在一些异国情调的案件 但实际上__alignof__(unsigned long long)> = 8,所以ARCH_KMALLOC_MINALIGN将是> = 8。