论文部分内容阅读
[摘要]EMSIM是一款用于嵌入式功耗统计的指令集模拟器。结合SA-110的体系结构通过对EMSIM源码的分析,研究EMSIM对SA-110指令集的模拟方法,分析功耗统计算法在EMSIM中是如何实现的。为用软件的方法统计嵌入式系统功耗提供借鉴。
[关键词]EMSIM 嵌入式系统 指令集模拟器 功耗统计
中图分类号:TP3文献标识码:A文章编号:1671-7597(2009)0120030-02
一、前言
随着计算机技术和集成电路工艺的迅速发展,嵌入式系统的应用也越来越广泛。在嵌入式系统的应用领域中(如手机、路由器等),功耗已经成为嵌入式系统设计要考虑的一个重要因素。但是一个软件在硬件平台上运行所消耗的功耗用仪表测量是难以实现的,而一个用软件的方式来统计嵌入式系统功耗的方法在参考文献[1][2]中被提出。这种方法用在嵌入式软件开发中,不仅便于在开发过程中评估产品的功耗,还可以节省成本,为开发低功耗产品提供了一个便利的工具。并且在参考文献[1]中指出,用这种方法统计出的功耗误差率不超过5%。这个误差率是可以被接受的。
二、EMSIM中指令有关的仿真
(一)指令仿真介绍
指令仿真器(Instruction Set Simulator,ISS)是用来在一台计算机上模拟另外一台计算机上程序运行过程的软件工具。现在的仿真器主要可以分为两大类,一类是硬件仿真器(emulator)。另一类是软件仿真器(simulator),这类仿真器是以纯软件的形式来仿真程序在目标芯片上的运行,EMSIM所采用的指令模拟即是这种方式。EMSIM模拟了StrongARM系列中的SA-110处理器以及相关的外设。
(二)EMSIM的结构
EMSIM的结构图如图1所示。在图1中,右边是EMSIM所模拟的各个硬件子系统。EMSIM模拟的模块包括:(1)一个SA-110的处理器核,其中包括一个指令集仿真器ISS、16K的指令Cache、16K的数据Cache、存储管理单元MMU。(2)中断控制单元。(3)时钟。(4)两个UART。(5)内存系统。图1的左边是使用EMSIM的流程图,其中方框代表所用的辅助工具,圆柱体代表目标在操作过程中不同阶段所处的不同状态。如图中所示,所要模拟的程序要用交叉编译器的编译程序arm-linux-gcc编译成二进制可执行文件,然后该文件由Initrd-gengrator装载在文件系统Initrd(boot loader initialized RAM disk)中,再由Linker把Linux内核和Initrd做成压缩的映像文件(ROM Image),当EMSIM启动时自动把ROM Image装载入它模拟的Memory中,由ISS取指令并完成指令的译码和执行。
(三)EMSIM中ISS的实现
EMSIM详细模拟了SA-110处理器的寄存器和三级流水线。EMSIM用变量模拟CPU的寄存器,用case语句来判断指令类型以实现指令的译码,用函数调用模拟指令的执行。
1.寄存器的模拟
寄存器被定义在 struct ARMul_State{……}结构体中,ARMul_State动态地保存了CPU运行时当前的状态。其中有关寄存器的定义如下:
ARMword Reg[16]; /* the current register file */
ARMword RegBank[7][16]; /* all the registers */
ARMword Cpsr; /* the current psr */
ARMword Spsr[7]; /* the exception psr's */
ARMword为32位无符号数,Reg[16]为当前处理器模式下的通用寄存器,RegBank[7][16]为七种处理器模式下各自的寄存器,Cpsr为程序状态寄存器,Spsr[7]为七种处理器模式模式下的各个程序状态保存寄存器。
2.三级流水线的模拟
EMSIM模拟了处理器的三级流水线,完成了取指、译码和执行的模拟,处理器的三级流水线如图2所示。
(1)取指:即从寄存器中取出指令,放入指令流水线。对应于模拟器的实现是根据pc的值从Memery中取指放入loaded变量中,该操作由函数ARMul_LoadInstrS(state,pc+(isize * 2),isize)实现。
(2)译码:指令被译码。模拟器没有具体的对应实现,只是把译码阶段的指令保存在decoded变量中。
(3)执行:执行具体的指令控制逻辑,读取相关的寄存器,完成数据处理操作、地址转移操作或执行存储器数据访问操作等。指令执行的模拟由ARMul_Emulate32/26函数实现。
在ARMul_Emulate32/26有定义:
ARMword pc ; /* the address of the current instruction */
ARMword instr, /* the current instruction */
ARMword decoded, loaded ; /* instruction pipeline */
Loaded,decoded,instr分别代表了指令在CPU中的三个阶段即取指、译码、执行,在每条指令执行前都有操作:
instr = decoded ;
decoded = loaded ;
loaded = ARMul_LoadInstrS(state,pc+(isize * 2),isize) ;
来完成三级流水线的模拟。我们从参考文献[4][5]中可以总结出:
(1)指令码的最高4位(bit[31,28])为指令的条件码,它共有16种组合以表示各种可执行的条件,这是所有指令共有的部分。
(2)接着条件码的后8位(bit[27,20])用来区别不同类型的指令,称为译码区。
(3)最后的20位(bit[19,0])为指令操作数,不同的操作数决定了不同的寻址模式。
因此ARMul_Emulate32/26函数首先根据指令码的最高四位来判断指令的执行条件是否满足,若满足则再根据bit[27,20]来区别指令类型,不同的指令对应不同的函数调用,此操作由case语句完成。而每条指令的操作数都由bit[19,0]确定。
三、EMSIM的功耗统计算法
EMSIM中功耗的统计是基于任务的。当每个任务被创建时系统为它创建一个功耗统计表TEBS(Task Energy Balance Sheet)。TEBS统计任务中每个函数的功耗,每个函数的功耗由ARMul_Emulate32/26函数中调用函数ARMul_do_en
ergy(state, instr,pc)统计。EMSIM功耗统计示例如图3所示。其中,ISS:指令集模拟器;FES:函数功耗栈;FC:函数调用;FR:函数调用返回[1]。
四、总结
EMSIM作为嵌入式系统功耗仿真的有效工具,不仅详细地模拟了SA-110系统体系结构的各个硬件模块,并且把用软件统计系统功耗的方法用在指令模拟模块中。这为嵌入式低功耗产品的设计提供了便利,也为嵌入式系统功耗统计提出了一个新思路。本文详细分析了EMSIM的结构组成和对SA-110模拟的实现,深入研究了EMSIM功耗统计的算法。本文为学习指令集仿真器和开发功耗统计的软件提供了诸多便利。
参考文献:
[1]T.K.Tan,A.Raghunathan,N.K.Jha. EMSIM: An energy simulation framework for embedded operating system[J].Circuit & Systems,2002(5):464-467
[2]T.K.Tan,A.Raghunathan,N.K.Jha.A Simulation Framework for Energy-Consumption Analysis of OS-Driven Embedded Applications.
[3]周立功,ARM嵌入式系统基础教程[M].北京:北京航空航天大学出版社,2005.
[4]ARM Limited.ARM Architecture Reference Manual[S].ARM Limited,2000.
[5]Andrew Sloss,Dominic Symes,Chris Wright.ARM System Developer's Guide:Designing and Optimizing System Software[M].Morgan Kaufmann Publishers,2004.
作者简介:
朱建,男,汉族,河南确山人,四川大学计算机(软件)学院硕士研究生,主要研究方向:嵌入式系统。
注:“本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。”
[关键词]EMSIM 嵌入式系统 指令集模拟器 功耗统计
中图分类号:TP3文献标识码:A文章编号:1671-7597(2009)0120030-02
一、前言
随着计算机技术和集成电路工艺的迅速发展,嵌入式系统的应用也越来越广泛。在嵌入式系统的应用领域中(如手机、路由器等),功耗已经成为嵌入式系统设计要考虑的一个重要因素。但是一个软件在硬件平台上运行所消耗的功耗用仪表测量是难以实现的,而一个用软件的方式来统计嵌入式系统功耗的方法在参考文献[1][2]中被提出。这种方法用在嵌入式软件开发中,不仅便于在开发过程中评估产品的功耗,还可以节省成本,为开发低功耗产品提供了一个便利的工具。并且在参考文献[1]中指出,用这种方法统计出的功耗误差率不超过5%。这个误差率是可以被接受的。
二、EMSIM中指令有关的仿真
(一)指令仿真介绍
指令仿真器(Instruction Set Simulator,ISS)是用来在一台计算机上模拟另外一台计算机上程序运行过程的软件工具。现在的仿真器主要可以分为两大类,一类是硬件仿真器(emulator)。另一类是软件仿真器(simulator),这类仿真器是以纯软件的形式来仿真程序在目标芯片上的运行,EMSIM所采用的指令模拟即是这种方式。EMSIM模拟了StrongARM系列中的SA-110处理器以及相关的外设。
(二)EMSIM的结构
EMSIM的结构图如图1所示。在图1中,右边是EMSIM所模拟的各个硬件子系统。EMSIM模拟的模块包括:(1)一个SA-110的处理器核,其中包括一个指令集仿真器ISS、16K的指令Cache、16K的数据Cache、存储管理单元MMU。(2)中断控制单元。(3)时钟。(4)两个UART。(5)内存系统。图1的左边是使用EMSIM的流程图,其中方框代表所用的辅助工具,圆柱体代表目标在操作过程中不同阶段所处的不同状态。如图中所示,所要模拟的程序要用交叉编译器的编译程序arm-linux-gcc编译成二进制可执行文件,然后该文件由Initrd-gengrator装载在文件系统Initrd(boot loader initialized RAM disk)中,再由Linker把Linux内核和Initrd做成压缩的映像文件(ROM Image),当EMSIM启动时自动把ROM Image装载入它模拟的Memory中,由ISS取指令并完成指令的译码和执行。
(三)EMSIM中ISS的实现
EMSIM详细模拟了SA-110处理器的寄存器和三级流水线。EMSIM用变量模拟CPU的寄存器,用case语句来判断指令类型以实现指令的译码,用函数调用模拟指令的执行。
1.寄存器的模拟
寄存器被定义在 struct ARMul_State{……}结构体中,ARMul_State动态地保存了CPU运行时当前的状态。其中有关寄存器的定义如下:
ARMword Reg[16]; /* the current register file */
ARMword RegBank[7][16]; /* all the registers */
ARMword Cpsr; /* the current psr */
ARMword Spsr[7]; /* the exception psr's */
ARMword为32位无符号数,Reg[16]为当前处理器模式下的通用寄存器,RegBank[7][16]为七种处理器模式下各自的寄存器,Cpsr为程序状态寄存器,Spsr[7]为七种处理器模式模式下的各个程序状态保存寄存器。
2.三级流水线的模拟
EMSIM模拟了处理器的三级流水线,完成了取指、译码和执行的模拟,处理器的三级流水线如图2所示。
(1)取指:即从寄存器中取出指令,放入指令流水线。对应于模拟器的实现是根据pc的值从Memery中取指放入loaded变量中,该操作由函数ARMul_LoadInstrS(state,pc+(isize * 2),isize)实现。
(2)译码:指令被译码。模拟器没有具体的对应实现,只是把译码阶段的指令保存在decoded变量中。
(3)执行:执行具体的指令控制逻辑,读取相关的寄存器,完成数据处理操作、地址转移操作或执行存储器数据访问操作等。指令执行的模拟由ARMul_Emulate32/26函数实现。
在ARMul_Emulate32/26有定义:
ARMword pc ; /* the address of the current instruction */
ARMword instr, /* the current instruction */
ARMword decoded, loaded ; /* instruction pipeline */
Loaded,decoded,instr分别代表了指令在CPU中的三个阶段即取指、译码、执行,在每条指令执行前都有操作:
instr = decoded ;
decoded = loaded ;
loaded = ARMul_LoadInstrS(state,pc+(isize * 2),isize) ;
来完成三级流水线的模拟。我们从参考文献[4][5]中可以总结出:
(1)指令码的最高4位(bit[31,28])为指令的条件码,它共有16种组合以表示各种可执行的条件,这是所有指令共有的部分。
(2)接着条件码的后8位(bit[27,20])用来区别不同类型的指令,称为译码区。
(3)最后的20位(bit[19,0])为指令操作数,不同的操作数决定了不同的寻址模式。
因此ARMul_Emulate32/26函数首先根据指令码的最高四位来判断指令的执行条件是否满足,若满足则再根据bit[27,20]来区别指令类型,不同的指令对应不同的函数调用,此操作由case语句完成。而每条指令的操作数都由bit[19,0]确定。
三、EMSIM的功耗统计算法
EMSIM中功耗的统计是基于任务的。当每个任务被创建时系统为它创建一个功耗统计表TEBS(Task Energy Balance Sheet)。TEBS统计任务中每个函数的功耗,每个函数的功耗由ARMul_Emulate32/26函数中调用函数ARMul_do_en
ergy(state, instr,pc)统计。EMSIM功耗统计示例如图3所示。其中,ISS:指令集模拟器;FES:函数功耗栈;FC:函数调用;FR:函数调用返回[1]。
四、总结
EMSIM作为嵌入式系统功耗仿真的有效工具,不仅详细地模拟了SA-110系统体系结构的各个硬件模块,并且把用软件统计系统功耗的方法用在指令模拟模块中。这为嵌入式低功耗产品的设计提供了便利,也为嵌入式系统功耗统计提出了一个新思路。本文详细分析了EMSIM的结构组成和对SA-110模拟的实现,深入研究了EMSIM功耗统计的算法。本文为学习指令集仿真器和开发功耗统计的软件提供了诸多便利。
参考文献:
[1]T.K.Tan,A.Raghunathan,N.K.Jha. EMSIM: An energy simulation framework for embedded operating system[J].Circuit & Systems,2002(5):464-467
[2]T.K.Tan,A.Raghunathan,N.K.Jha.A Simulation Framework for Energy-Consumption Analysis of OS-Driven Embedded Applications.
[3]周立功,ARM嵌入式系统基础教程[M].北京:北京航空航天大学出版社,2005.
[4]ARM Limited.ARM Architecture Reference Manual[S].ARM Limited,2000.
[5]Andrew Sloss,Dominic Symes,Chris Wright.ARM System Developer's Guide:Designing and Optimizing System Software[M].Morgan Kaufmann Publishers,2004.
作者简介:
朱建,男,汉族,河南确山人,四川大学计算机(软件)学院硕士研究生,主要研究方向:嵌入式系统。
注:“本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。”