假设我用 kmalloc 分配了一个 uint64_t 数组(假设数组的大小为 32kB)。我有以下问题:
1) 数组是否保证页面对齐?2) 阵列是否保证缓存/块对齐?3)根本没有保证吗?
当我分配数组时,我使用 virt_to_phys 来获取数组的物理地址,我得到了物理地址,例如 00000040142d5c00 和虚拟地址,例如 fffffe07df400000
有没有可能我最终的对齐小于 uint64_t ,比如说 4 字节对齐与否?
先感谢您
假设我用 kmalloc 分配了一个 uint64_t 数组(假设数组的大小为 32kB)。我有以下问题:
1) 数组是否保证页面对齐?2) 阵列是否保证缓存/块对齐?3)根本没有保证吗?
当我分配数组时,我使用 virt_to_phys 来获取数组的物理地址,我得到了物理地址,例如 00000040142d5c00 和虚拟地址,例如 fffffe07df400000
有没有可能我最终的对齐小于 uint64_t ,比如说 4 字节对齐与否?
先感谢您
由预处理器常量定义的对齐方式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。