Kmalloc 对齐
Kmalloc Alignment
假设我使用 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)
可能 return 小于 8
在一些异国情调的情况下,
但实际上 __alignof__(unsigned long long)
>= 8,所以 ARCH_KMALLOC_MINALIGN 会 >= 8.
假设我使用 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)
可能 return 小于 8
在一些异国情调的情况下,
但实际上 __alignof__(unsigned long long)
>= 8,所以 ARCH_KMALLOC_MINALIGN 会 >= 8.