内存对齐

4
我明白了为什么内存需要根据总线的数据位宽对齐到4字节和8字节。但是以下语句让我感到困惑:“IoDrive要求使用O_DIRECT执行的所有I/O必须对齐到512字节,并且大小必须是512字节的倍数。” 为什么需要将地址对齐到512字节呢?
3个回答

6
错误地归咎于DMA对大缓冲区对齐限制是不正确的。
硬件DMA传输通常在4或8字节边界上对齐,因为PCI总线可以物理地一次传输32或64位。除了这种基本对齐之外,硬件DMA传输被设计为可与任何地址配合使用。
然而,硬件处理物理地址,而操作系统处理虚拟内存地址(这是x86 CPU中受保护模式构造)。这意味着进程空间中连续的缓冲区可能在物理内存中不连续。除非注意创建物理上连续的缓冲区,否则DMA传输需要在VM页面边界(通常为4K,可能为2M)处分解。
至于需要将缓冲区对齐到磁盘扇区大小,这完全不正确;DMA硬件完全不知道硬盘物理扇区大小。
在Linux 2.4下,O_DIRECT需要4K对齐,在2.6下放宽到512B。在任一情况下,这可能是一个设计决策,以防止单个扇区更新跨越VM页面边界,从而需要分裂DMA传输。(任意512B缓冲区有1/4的机会跨越4K页面)。
因此,虽然操作系统应该受到责备而不是硬件,但我们可以看到为什么页面对齐的缓冲区更有效率。
编辑:当然,如果我们无论如何都要写入大缓冲区(100KB),那么跨越的VM页面边界数量将实际上与是否对齐到512B无关。
因此,512B对齐优化的主要情况是单扇区传输。

4
通常,这样的对齐要求源于底层 DMA 硬件。较大的块传输有时需要比此处更强的对齐限制以加快传输速度。
在几个 ARM 处理器上,第一级 转译表 必须对齐到 16 KB 边界!

通过将数据对齐到512字节,使其在每个周期传输4个字节,从而加快其速度。 - Sirish
@siri,这就是关键——它可能不是这样。它可以在一个周期内传输8、16、32甚至更多,例如512字节。DMA硬件可以做基本上任何事情——这完全取决于实现。 - Carl Norum
4
通过完全不涉及处理器(这正是DMA的作用)使数据传输更快,但是DMA硬件有时会超出架构本身所隐含的限制。 - dmckee --- ex-moderator kitten
比我的解释好多了,而且你用了“DMA”这个神奇的词。 - Matt Joiner

0

如果你不知道自己在做什么,就不要使用 O_DIRECT。

O_DIRECT 意味着“直接设备访问”。这意味着它绕过了所有操作系统缓存,直接访问磁盘(或可能是 RAID 控制器等)。磁盘访问是基于每个扇区的。

编辑:对齐要求是针对 IO 偏移量/大小的;通常不是内存对齐要求。

编辑:如果你正在查看 this page(它似乎是唯一的搜索结果),它还说内存必须是页面对齐的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接