我已经理解了为什么内存应该根据总线的数据宽度对齐到4字节和8字节。但是下面这句话让我很困惑
"IoDrive要求在使用O_DIRECT的设备上执行的所有I/O都必须是512字节大小的倍数,且必须是512字节的倍数。“
将地址对齐到512字节的需要是什么。
发布于 2010-12-17 04:08:56
将大缓冲区对齐限制归咎于DMA的综合语句是错误的。
硬件DMA传输通常在4或8字节边界上对齐,因为PCI总线一次可以物理地传输32或64位。除了这种基本对齐方式之外,硬件DMA传输还可以与提供的任何地址一起使用。
但是,硬件处理物理地址,而操作系统处理虚拟内存地址(这是x86处理器中的受保护模式构造)。这意味着进程空间中的连续缓冲区在物理ram中可能不是连续的。除非小心创建物理上连续的缓冲区,否则需要在VM页面边界(通常为4K,可能为2M)处分解DMA传输。
对于需要与磁盘扇区大小对齐的缓冲区,这是完全不正确的;DMA硬件完全忽略了硬盘驱动器上的物理扇区大小。
在Linux2.4下,O_DIRECT需要4K对齐,在2.6下,它被放宽到512B。在任何一种情况下,这可能是为了防止单个扇区更新跨越VM页面边界而因此需要拆分DMA传输的设计决策。(一个任意的512B缓冲区有1/4的机会跨越4K页面)。
因此,虽然操作系统而不是硬件是罪魁祸首,但我们可以看到为什么页面对齐的缓冲区更有效。
编辑:当然,如果我们无论如何都要写大的缓冲区(100KB),那么无论我们是否对齐到512B,跨越的VM页面边界实际上都是相同的。因此,512B对齐优化的主要情况是单扇区传输。
发布于 2010-08-13 01:02:35
通常,像这样的大对齐需求是由于底层的DMA硬件造成的。有时,通过要求比这里更强的对齐限制,可以更快地进行大型块传输。
在多个ARM处理器上,第一级translation table必须在16KB边界上对齐!
https://stackoverflow.com/questions/3470143
复制相似问题