ARM Linux中的非对齐内存访问(Alignment trap警告的原因)
来源:互联网 发布:php 魔术方法被淘汰了 编辑:程序博客网 时间:2024/05/13 23:28
[转载] http://blog.csdn.net/jasonchen_gbd/article/details/51535018
ARMv5指令集的CPU(一般是arm9架构)默认不支持非对齐内存访问,ARMv6及以上的CPU默认支持处理大部分的非对齐内存地址访问。对齐指的是起始地址是一个word长度的整数倍,通常是4字节对齐。
通过设置/proc/cpu/alignment文件内容可修改内核中对非对齐地址访问的处理。
这个文件中最后一行"User faults"即是内核中如何处理非对齐的内存地址访问,这个值是一个位图:
UM_WARN:只给出“Alignment trap”警告。
UM_FIXUP:尝试正确处理非对齐的内存地址。
UM_SIGNAL:发生非对齐地址访问时,发送SIGBUS信号通知相应进程。
几种处理方式可以进行组合,例如设置为(UM_WARN | UM_FIXUP),就是在fixup的同时给出警告信息。如果设置为0则为ignore。
对于ARMv5的CPU,User faults的值默认是0,即忽略非对齐的地址访问,这时如果进程访问了非对齐的地址,就会导致程序执行异常。如果程序中不得不存在非对齐的地址访问,可以设置为fixup:
这样的话,内核就会做额外的工作以使访问非对齐内存地址可以得到正确的结果。
对于ARMv6及以上的CPU,CPU本身就要求支持对非对齐地址访问的处理,因此基本不用关心/proc/cpu/alignment里设置的值,不过对于像LDM, STM, LDRD和STRD这些复合指令进行的非对齐地址访问,仍需要软件协助处理,在这些CPU中,/proc/cpu/alignment默认设置为2(fixup)。
具体的处理方式详见内核代码arch/arm/mm/alignment.c:alignment_init(), hook_fault_code(), do_alignment()。
在不支持非对齐内存访问的芯片上,进行强制类型转换就要注意了,例如下面的例子:
在支持非对齐访问系统上的结果如下(小端系统):
而在不支持非对齐访问系统上,对/proc/cpu/alignment设置不同的值表现也不相同:
当然也可以设置为3,在正确处理非对齐地址访问的同时给出警告。
我们可以使用char类型来对非对齐的内存进行读写来避免非对齐地址的处理,或使用memcpy这类函数来避免赋值或强制类型转换带来的问题。
看下面的例子:
由于给struct pack_info加上了__attribute__((packed))属性,所以它的len成员的地址不是4字节对齐的。
上面的代码用三种方式给len成员赋值,在不支持非对齐访问系统上,第二种方式就会有问题,不能得到预期的结果。
- ARM Linux中的非对齐内存访问(Alignment trap警告的原因)
- ARM Linux中的非对齐内存访问(Alignment trap警告的原因)
- 调试arm下的 Alignment trap
- ARM非对齐访问
- 嵌入式linux 字节对齐 导致输出Alignment trap
- Alignment trap: in ARM architecture .
- 内存对齐(Memory Alignment)
- Alignment trap的问题
- 8086架构的CPU的内存访问机制以及内存对齐(memory alignment)
- 不可不知的内存对齐(Memory Alignment)
- GNU C - 关于8086的内存访问机制以及内存对齐(memory alignment)
- arm 下C编程的非对齐访问
- ARM处理器关于非对齐存储的访问规则
- ARM体系中存储系统非对齐的存储访问操作
- ARM体系中存储系统非对齐的存储访问操作
- C++类的内存对齐-C++alignment
- 数据的对齐(alignment)
- VC内存对齐准则(Memory alignment)
- Python Web开发--前言
- 期末预习计划
- Head First 之 代理模式(一)
- 单片机程序是如何执行的_单片机达人解密:指令数据写哪了?
- Web项目中JSP获取MY SQL数据库简单例子
- ARM Linux中的非对齐内存访问(Alignment trap警告的原因)
- Eclipse创建jsp文件乱码
- Windows64 Python27 XGboost安装
- 第1章 初识Python Web开发
- 垃圾收集器(一)
- 【caffe源码研究】第二章:实战篇(2) : ImageNet分类
- 学习笔记——文件管理
- 码农成长记——js之if语句
- 加盐密码哈希:如何正确使用