DMA传输中的内存对齐

本文探讨内存对齐的概念,以及在DMA传输中如何影响系统稳定性。通过分析一个导致系统蓝屏的bug,揭示了设备内存必须按特定规则对齐,特别是对于1M字节对齐的需求。解决方案包括在创建Common Buffer时指定对齐方式,或在设备配置时进行地址偏移以确保对齐。
摘要由CSDN通过智能技术生成

        本文主要介绍内存对齐的概念和方法,并讲述在host与device之间DMA传输时,一个与“内存对齐”相关的,并最终引起系统概率性蓝屏的bug。

一、“内存对齐”的概念

        内存对齐,又称为字节对齐,是一个数据类型所能存放的内存地址的属性。这个属性实际上就是内存地址,它需要符合一定的规范。这个规范就是内存地址值必须是2的N次方。当我们说一个数据类型的内存对齐为8时,(或按8字节对齐时),实际上指的是它的内存地址值可以被8整除。

        内存对齐的要求,是由CPU处理内存的方式决定的(或者说寻址方式,它与地址总线的宽度相关)。详细参考我链接的博文2。在此简单的总结一下内存对齐的基本规范:

1)标准类型:自然对齐(Naturally Aligned)即可。对齐属性和它的类型大小相等,或整数倍。

2)数组:按照基本数据类型对齐,第一个对齐了后面的自然也就对齐了。 
3)联合:按其包含的长度最大的数据类型对齐。 
4)结构体:结构体中每个数据类型都要对齐。


        下面通过一段代码来看看在VS调试器中,内存的对齐和填充

<span style="font-size:14px;">	struct stu
	{
		char sex;
		int length;
		char name[10];
	};

	stu a{ 'g', 256, "jaojido" };
	cout << "sizeof(stu) = " << sizeof(stu) << endl;
	cout << "sizeof(a) = " << sizeof(stu) << endl;</span>


它的输出是:20和20。再看内存布局:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值