使用memcpy函数,出现总线错误
在网上找了很久,了解了总线错误。
例如下面网友们对总线错误的讨论
https://qastack.cn/programming/212466/what-is-a-bus-error
再说说我遇到的问题情况吧,我是在对共享内存进行读取数据的时候使用memcpy函数进行读取,调试到memcpy(addr1,addr2,4); 就会造成总线错误,在确定地址没问题的情况下,反复修改也还是存在这个问题。
后来脑子一转突然想到会不会是字节对齐的问题,一看函数手册发现这个系统在分配共享内存块的时候分配大小默认按照 8 字节对齐而且它的库为了提高 memcpy、memmove 拷贝性能,通过汇编实现相关接口,并通过 STP 指令拷贝数据,在未开启 CACHE 情况下,需用户保证地址对齐。就是说从我要读取的地址开始后面已经不够4个给我读取了,所以就造成总线错误。
例如下面这种情况:
这时候我选择了两种解决方法。
第一种是自己写入的时候就设定好了字节对齐,在读出来的时候也按照着读。
第二种是一个一个的循环读取,不使用memcpy函数。
我选择了第二种,因为比较方便节省空间。
本文探讨了使用memcpy函数时遇到的总线错误问题,并详细分析了该问题的原因,特别是与字节对齐有关的情况。作者提供了两种解决方案:一是确保数据按特定字节数对齐;二是采用循环逐字节读取的方式代替memcpy。



1998

被折叠的 条评论
为什么被折叠?



