与MIPS体系结构相关的处理器知识

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
与MIPS体系结构相关的 处理器知识
软件五部技术三组
www.wrawiswe.croamise.ccoomm./com
大纲 ➢是否必要了解MIPS处理器知识 ➢工作中与处理器有关的问题 ➢ISCOM2126EA-MA(B)中处理器相 关体现 ➢个人的一些理解 ➢问题讨论
www.raisecom.com / 2
www.raisecom.com /
个人的一些理解 二
的指令了,当A进入执行阶段的时候,B进入译指 阶段,C进入取指阶段。这样下来三条指令只需花 费5t的时间,当指令很多的时候,每条指令花费 的时间应该是t。当然这个是理想情况,导致流水 线中断的有多个原因,比如数据依赖和条件分支 ,这里说一下条件分支。在条件分支下,A的下一 条指令可能不是B而是E。如果A执行完成之后,发 现下一条指令是E而不是B,这个时候,B已经完成 了译指,C完成了取指。但是不但白做了,还增加 了额外的负担:清空流水线,这个对效率的影响 是很明显的。因此对于那些对效率要求很高的算
MIPS是世界上很流行的一种RISC处理器。MIPS 的意思是“无内部互锁流水级的微处理器 ”(Microprocessor without interlocked piped stages) ,其机制是尽量利用软件办法避免流水线中的数 据相关问题。
www.raisecom.com /
是否必要了解MIPS处理器知识 三
www.raisecom.com /
工作中与处理器有关的问题 之 字节对齐 一
编程规范里面提到过数据结构设计需要考虑字 节对齐。
所谓字节对齐,就是要求某个数据在内存中的 起始位置必须是该数据类型的对齐大小的整数倍 。基本数据类型(char,int,long等)的对齐大小 等同于类型的大小,结构体的对齐大小等同于其 各成员变量的对齐大小的最大值,数组的对齐大 小等于其基本类型的对齐大小。数据的大小必须 是对齐大小的整数倍。
编译中大部分的错误提示都是语言性质的提示,处理器性质的提示 很少。。
www.raiwk.baidu.comecom.com /
工作中与处理器有关的问题 之 编译&反汇编
编译过程我们不用太多关注处理器的信息,那是编译器 的任务。但是反汇编的时候,如果需要理解反汇编出来的 代码,则必须要理解相关处理器的指令集。我认为应该多 少学习一下汇编代码。
www.raisecom.com /
工作中与处理器有关的问题 之 字节对齐 四
字节对齐的细节和编译器实现相关,但一般而 言,满足三个准则: 1) 结构体变量的首地址能够被其最宽基本类型成 员的大小所整除; 2) 结构体每个成员相对于结构体首地址的偏移量 (offset)都是成员大小的整数倍, 如有需要编译器会在成员之间加上填充字节( internal adding); 3) 结构体的总大小为结构体最宽基本类型成员大 小的整数倍,如有需要编译器会在最 末一个成员之后加上填充字节(trailing padding)
无论如何,为了提高程序的性能,数据结构( 尤其是栈)应该尽可能地在自然边界上对齐。原 因在于,为了访问未对齐的内存,处理器需要作 两次内存访问;
www.raisecom.com /
工作中与处理器有关的问题 之 字节对齐 三
然而,对齐的内存访问仅需要一次访问。 一个字或双字操作数跨越了4字节边界,或者
异常一般通过中断处理,当CPU断定产生了异常的时候 ,会产生一个中断,然后跳转到相应的中断向量去执行中 断处理。。
不同的CPU对异常的定义不一样,编码怎么办?按照最 严格的那个来。比如字节对齐,看起来较真了一点,但是 这个在那些容忍不对齐的设备上也是有好处的,可以提高 效率。而修改data段,本身就是一个不符合常理的操作。
工作中与处理器有关的问题 之 字节对齐 二
为什么要字节对齐?(续二) mips是定长指令的设计,每条指令都是32比特
(或许会有64的出现?)。 32位的指令长度也就意味着要传递一个32位的
地址起码需要两条指令(指令有若干位是操作码 )。因此如果在mips中如果需要实现不对齐的内 存访问,需要耗费更多的时间。于是mips干脆直 接不处理这种情况,遇到不对齐的直接error。
堆栈溢出就是不顾堆栈中分配的局部数据块大 小,向该数据块写入了过多的数据,导致数据越 界。结果覆盖了老的堆栈数据。
有两种情况会引起堆栈溢出,第一种可能出现 的情况是如果你定义了大数组会导致堆栈溢出; 第二种因为函数的参数和里面声明的局部变量,
www.raisecom.com /
工作中与处理器有关的问题 之 堆栈溢出 二
www.raisecom.com /
工作中与处理器有关的问题 之 符号位
符号位的问题可以肯定的是这个和mips的一个 很重要的特性有关:mips只能处理32位的数据。 也即如果对两个char相加,mips需要把两个char填 充成两个32位的数,并对符号位进行处理,以保 存溢出等特性,然后再相加。
www.raisecom.com /
工作中与处理器有关的问题 之 异常
不同的CPU对异常的定义是不一样的,比如这段代码: int *piTest = (int*)3; *piTest = 1;这段代码PPC能正常处理, MIPS则会抛出异常。另外还有一些修改data段的操作,在 PPC上是没问题的,X86上会异常。
是否必要了解MIPS处理器知识 一
以前我们公司大多设备使用的都是PPC的处理器 ,而本次我们组最新准备发布的产品 ISCOM2126EA-MA(B)设备则使用的是MIPS的处 理器,由于体系结构的不同,在这次开发过程中 遇见了很多不同种类的问题,看似都是很小的问 题但对我们的设备却有着较大的影响,也考验了 一把我们的编码规范,我想先向大家介绍一下 MIPS这种处理器,给大家扫扫盲。
而我们为什么要会反汇编。我在2126EA-MA(B)这款MIPS 芯片的设备中深刻体会了一把,也吃到了不少甜头。个人 觉得反汇编有两个作用:1、debug。有些看代码很难找的 bug在反汇编下很容易“原形毕露”。2、更好的理解你的 代码。反汇编出来的东西更接近指令,对比阅读能让你更 好的理解同一个功能,用不同的代码写会有什么不同的指 令体现,什么方式效率更高。这也是我上面提到的大家最 好抽空学学汇编语言,有助于理解代码,更好更快的定位 问题。
www.raisecom.com /
工作中与处理器有关的问题 之 字节对齐 二
为什么要字节对齐? 因为某些处理器不允许16位和32位的数据在内
存中任意排放。 通常32位的处理器通过总线访问(包括读和写
)内存数据。每个总线访问周期可以访问32位内 存数据。内存数据是以8位的字节为单位存放的。 假如一个32位的数据没有在4字节整除的内存地址 处存放,那么处理器就需要2个总线周期对其进行 访问。通过合理的内存对齐可以提高访问效率。
www.raisecom.com /
工作中与处理器有关的问题 之 字节对齐 二
为什么要字节对齐?(续一) 访存是通过特定的指令完成的,为了减少访存
的时间,大部分CPU都有一次可以读写N个字节( N取决于位宽)的指令,但是由于硬件上的限制, 这些指令都是有限制的,比如地址必须是N的整数 倍(原因没查到)。
www.raisecom.com /
工作中与处理器有关的问题 之 字节序 二
说到字节序,一定要区分主机序和网络序。 网络序:TCP/IP各层协议将字节序定义为BigEndian,因此TCP/IP协议中使用的字节序通常称之 为网络字节序。 主机序:它遵循Little-Endian规则。所以当两台 主机之间要通过TCP/IP协议进行通信的时候就需要 调用相应的函数进行主机序(Little-Endian)和网 络序(Big-Endian)的转换。
它采用精简指令系统计算结构(RISC)来设 计芯片。和英特尔采用的复杂指令系统计算 结构(CISC)相比,RISC具有设计更简单、设 计周期更短等优点。
MIPS的RISC体系结构和CISC体系结构有所 不同,值得一提的是正是一些不同的处理, 导致我们在编码中引起了一些问题。
www.raisecom.com /
都是在栈内分配空间。所以如果递归调用层 次过深的话,就有可能栈溢出。不要在递归 函数内申请大的空间。
www.raisecom.com /
工作中与处理器有关的问题 之 编译&反汇编
这个章节一般不会用到,但是如果能理解对提高问题处理能力还是 有帮助的。这个是编译模拟器的.a时的截图:
红色部分大家应该能注意到这个名称包含了一个“pentium”,实
这个也要求大家在定义数据的时候,需要考虑 好,这个数据的特性,是有符号的还是无符号的
www.raisecom.com /
工作中与处理器有关的问题 之 堆栈溢出 一
从物理上讲,堆栈就是一段连续分配的内存空 间。在一个程序中,会声明各种变量。静态全局 变量是位于数据段并且在程序开始运行的时候被 加载。而程序的动态的局部变量则分配在堆栈里 面。
际就是奔腾处理器的名称。从这个可以看出,编译器是直接和处理器 相关的,不同的处理器会有不同的编译器。不知道谁看过《疯狂的程 序员》,里面就提到一个汇编的问题,说懂得汇编的人有个好处,不 用等那些最新的CPU的编译器,因为厂商推出一款新的架构的处理器 的时候,有可能会先推出汇编编译程序,其他语言的编译器可能需要 过一阵子才能发布。之所以这样是因为不同的CPU的指令集是不一样 的,而汇编基本是和指令集挂钩的,因为汇编解析程序实现比较容易 ,而像C这种高级语言的解析则费劲的多。
一个四字操作数跨越了8字节边界,被认为是未对 齐的,从而需要两次总线周期来访问内存。一个 字起始地址是奇数但却没有跨越字边界被认为是 对齐的,能够在一个总线周期中被访问。
编译器对内存对齐的处理:c编译器默认将结 构、栈中的成员数据进行内存对齐。编译器将未 对齐的成员向后移,将每一个都成员对齐到自然 边界上,从而也导致了整个结构的尺寸变大。
www.raisecom.com /
个人的一些理解 一
以下是个人的一些对处理器、编译器的理解后 总结的编程习惯: (一)不要有太多的条件分支。这个与处理器的 流水线技术有关。一条指令的执行一般会分成几 个步骤,比如取指、译指、执行指令等,很多处 理器有7-20个左右的步骤,每条指令都需要顺序 经过每个步骤。另外指令是需要依次执行的。以 三个步骤为例说明流水线技术。每个步骤都需要 特定的硬件模块执行,比如取指需要取指模块完 成,译指需要译指模块完成。假设每个步骤耗时 为t,如果处理器只有执行结束一条指令的所有步 骤之后才执行下一条指令,那么三条指令(A、B 、C)总共需要9t时间。如果采用流水线技术,那 么当A进入译指模块的时候,取指模块已经取出B
工作中与处理器有关的问题
经常遇到的典型问题或者说我能想到的有以下这些 :
➢ 字节序 ➢ 字节对齐 ➢ 异常 ➢ 符号位问题 ➢ 堆栈溢出 ➢ 空指针 ➢ 编译&反汇编
www.raisecom.com /
工作中与处理器有关的问题 之 字节序 一
字节序问题:大端法小端法 其实说白了就是一个顺序问题。现代的计算机 系统一般采用字节(Octet, 8 bit Byte)作为逻辑寻址 单位。当物理单位的长度大于1个字节时,就要区 分字节顺序。常见的字节顺序有两种:Big Endian 和Little Endian. Intel X86平台采用Little Endian,而 PowerPC、ARM、MIPS处理器则采用了Big Endian 于是问题来了,一个两字节的数0XABCD,要 存储在0-1这两个字节中,那么0中是存AB还是CD ,PPC、ARM和MIPS等选择了AB,X86选择了CD.
在不对齐的情况下,有些处理器会通过组合指 令的方式达到目标。比如需要从地址1处取一个 unsigned int类型数据,可以先从0处取4字节,然 后从4处取4字节,再进行移位相或获得需要的数 。如果是一个int类型,则更加麻烦,因为移位的 时候需要处理符号位,对效率会有很大影响。
www.raisecom.com /
对于一名驱动工程师来说应该对处理器(包括 诸如交换芯片之类的)、FPGA和flash芯片等硬件 知识有所了解才行。
www.raisecom.com /
是否必要了解MIPS处理器知识 二
但是由于我们在开发过程中不会牵扯具体的 bsp开发(起码大部分不会),因此硬件知识的了 解并不是必须的。
但是从我个人观点看,硬件能够帮我们更好的 理解软件,因为硬件才是我们软件的最直接的用 户,毕竟我们写的程序是给硬件执行的。
相关文档
最新文档