让我说我用kmalloc分配一个uint64_t数组(并假设数组的大小是32kB)。我有以下问题:
1)阵列是否保证页面对齐? 2)阵列是否保证缓存/块对齐? 3)根本没有保证吗?
当我分配数组时,我使用virt_to_phys来获取数组的物理地址我得到的物理地址如00000040142d5c00和虚拟地址如fffffe07df400000
我是否有可能最终将对齐小于uint64_t,让我们说4字节对齐?
提前谢谢
答案 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。