您的位置:首页 > 运维架构 > Linux

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

2017-05-22 18:41 239 查看
在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上,就可能会出问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: