首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >内存对齐

内存对齐
EN

Stack Overflow用户
提问于 2010-08-13 01:00:30
回答 2查看 6.3K关注 0票数 4

我已经理解了为什么内存应该根据总线的数据宽度对齐到4字节和8字节。但是下面这句话让我很困惑

"IoDrive要求在使用O_DIRECT的设备上执行的所有I/O都必须是512字节大小的倍数,且必须是512字节的倍数。“

将地址对齐到512字节的需要是什么。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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对齐优化的主要情况是单扇区传输。

票数 5
EN

Stack Overflow用户

发布于 2010-08-13 01:02:35

通常,像这样的大对齐需求是由于底层的DMA硬件造成的。有时,通过要求比这里更强的对齐限制,可以更快地进行大型块传输。

在多个ARM处理器上,第一级translation table必须在16KB边界上对齐!

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3470143

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档