嵌入式linux 字节对齐 导致输出Alignment trap

本文介绍在ARM9平台上遇到的内存对齐问题及解决方法。通过调整系统的内存对齐处理方式,定位并修正了代码中不当的内存访问操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在ARM9新塘平台运行应用程序时,总是输出Alignment trap,但是并不影响程序的运行。通过查找资料,发现cpu在处理内存对齐的时候,有几种方式可以设置。

cat /proc/cpu/alignment
User:           0
System:         0
Skipped:        0
Half:           0
Word:           0
DWord:          0
Multi:          0
User faults:    2 (fixup)
我的嵌入式linux系统下的默认处理方式是第2级处理方式:修复。

0 - ignore
1 - warn
2 - fixup
3 - fixup+warn
4 - signal
5 - signal+warn (需要这个)

    于是修改为:echo 5 > /proc/cpu/alignment,这样就会给内核一个信号。再在gdb下面重新运行

./rtmpserver ./rtmpserver.lua,果然gdb捕获到该信息,然后bt,查看出现问题的代码:
_currentFPVersion = ntohl(*((uint32_t *) (GETIBPOINTER(buffer) + 4))); //----MARKED-LONG---
原来是在强制类型转换读取内存的时候出现了错误,于是修改为:
uint32_t uTemp = 0; 
memcpy(&uTemp,GETIBPOINTER(buffer) + 4,sizeof(uint32_t)); 
_currentFPVersion = ntohl(uTemp);

    重新编译,Alignment trap消失。这也提醒我们,平时在写代码的时候,在内存访问上,尽量使用memcmp,memcpy,memset等函数,而不要为了方便,直接对指针内容进行访问。这样的代码在x86上可能没问题,但是运行到arm上,就可能会出问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值