嵌入式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上,就可能会出问题。
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上,就可能会出问题。
相关文章推荐
- 字节对齐陷阱(Alignment trap)-demo for ARM9
- 字节对齐导致sizeof()比实际更大
- printf 十六进制格式化输出 2字节补0对齐 ,
- 由于内存字节对齐导致的硬件错误
- ios平台上一个由字节对齐问题导致的crash
- luabind 和设置1字节对齐导致服务器挂掉
- datatype misalignment我的原因是内存溢出太严重,大多数是字节对齐问题
- printf函数十六进制格式化输出并且2字节对齐
- 关于IMAGE_OPTIONAL_HEADER.SectionAlignment与IMAGE_OPTIONAL_HEADER.FileAlignment 以及内存映射的字节对齐
- printf 十六进制格式化输出 2字节对齐
- 十六进制格式化输出 2字节对齐
- 字节对齐(Alignment)
- printf 十六进制格式化输出 2字节对齐
- 数据的字节对齐(data structure alignment)
- 字节对齐导致的地址计算错误
- 字节对齐导致的iOS EXC_ARM_DA_ALIGN崩溃
- C语言:内存字节对齐详解
- C语言字节对齐 数据对齐详解
- 结构体字节对齐
- C语言中的字节对齐三条原则