浅谈MIPS地址对齐问题

1.什么叫地址对齐?架构

RISC 下使用访存指令读取或写入数据单元时,目标地址必须是所访问之数据单元字节数的整数倍,这个叫作地址对齐。性能

2.计算机主要的架构分哪两类?及其地址对齐在二者的区别?
网站

计算机主要的架构就分为两类,复杂指令集计算机(CISC)和精简指令集计算机(RISC)。CISC最有表明性的架构就是x86,RISC最有表明性的架构就是ARM。无论是什么架构,对要访问的必定长度的数据的地址是有要求的,好比要访问一个32位的整数,那么这个数据必须(最好)存储在以4字节(32/8=4)对齐的地方。通常来讲,RISC对对齐要求的更严格些,非对齐访问可能会带来性能上的损失。这对程序在不一样架构间移植很是重要,由于它极有可能致使你的程序崩溃。spa

从理论上讲彷佛对任何类型的变量的访问能够从任何地址开始,但实际状况是在访问特定类型变量的时候常常在特定的内存地址访问,各个硬件平台对存储空间的处理上有很大的不一样。一些平台对某些特定类型的数据只能从某些特定地址开始存取。.net

3.MIPS平台的地址对齐。code

在 MIPS 平台上,lh 读取一个半字时,存储器的地址必须是 2 的整数倍; lw 读取一个字时,存储器的地址必须是 4的整数倍; sd 写入一个双字时,存储器的地址必须是 8 的整数倍。假若访存时,目标地址不对齐,则会引发异常,典型的是系统提示“总线错误”后,直接杀死进程。blog

直接贴代码:进程

 1 int main(void){  
 2     unsigned int i = 0x12345678;
 3         
 4     unsigned char *p = (unsigned char *)&i;
 5     *p = 0x00;
 6     unsigned short *p1 = (unsigned short *)(p+1);
 7     *p1 = 0x0000;
 8 
 9     return 0;
10 }
 最后两句代码,从奇数边界去访问unsigned short型变量,显然不符合对齐的规定。在X86上,相似的操做只会影响效率;但在MIPS或者SPARC上可能致使error,由于它们要求必须字节对齐。
相关文章
相关标签/搜索