Poo*_*rna 4 c operating-system memory-alignment
我已经理解为什么内存应该根据总线的数据宽度与4字节和8字节对齐.但以下声明让我感到困惑
"IoDrive要求使用O_DIRECT在设备上执行的所有I/O必须是512字节的对齐,并且大小为512字节的倍数."
将地址对齐到512字节的需要是什么.
将DMA归咎于大缓冲区对齐限制的一揽子陈述是错误的.
硬件DMA传输通常在4或8字节边界上对齐,因为PCI总线可以一次物理传输32或64位.除了这种基本对齐之外,硬件DMA传输还可以与任何提供的地址一起使用.
但是,硬件处理物理地址,而操作系统处理虚拟内存地址(这是x86 cpu中的保护模式构造).这意味着进程空间中的连续缓冲区在物理RAM中可能不是连续的.除非注意创建物理上连续的缓冲区,否则需要在VM页面边界(通常为4K,可能为2M)处分解DMA传输.
至于需要与磁盘扇区大小对齐的缓冲区,这完全是不真实的; DMA硬件完全无视硬盘驱动器上的物理扇区大小.
在Linux 2.4下,O_DIRECT需要4K对齐,在2.6下它已经放宽到512B.在任何一种情况下,可能是一个设计决定,以防止单个扇区更新跨越VM页面边界,因此需要拆分DMA传输.(任意512B缓冲区有1/4的机会穿越4K页面).
因此,虽然操作系统应该归咎于而不是硬件,但我们可以看到为什么页面对齐缓冲区更有效.
编辑:当然,如果我们正在编写大缓冲区(100KB),那么无论我们是否已经对齐512B,虚拟页面边界的数量实际上都是相同的.因此,通过512B对齐优化的主要情况是单扇区传输.